您好,登錄后才能下訂單哦!
本篇文章為大家展示了MySQL Server has gone away報(bào)錯(cuò)原因有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
背景
平時(shí)與開發(fā)交流,或在論壇回答問題時(shí),發(fā)現(xiàn)這個(gè)問題被問及的頻率非常高,例如: 程序中報(bào)錯(cuò)“MySQL server has gone away”是什么意思? 如何避免? 因此,感覺有必要總結(jié)一下發(fā)生這個(gè)問題的原因。
正好看到一篇外文blog總結(jié)的比較好,就翻譯過來了,分享給大家。
原因一: MySQL 服務(wù)宕了
判斷是否屬于這個(gè)原因的方法很簡(jiǎn)單,執(zhí)行以下命令,查看mysql的運(yùn)行時(shí)長(zhǎng):
$ mysql -uroot -p -e "show global status like 'uptime';"+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Uptime | 68928 | +---------------+-------+ 1 row in set (0.04 sec)
或者查看MySQL的報(bào)錯(cuò)日志,看看有沒有重啟的信息:
$ tail /var/log/mysql/error.log 130101 22:22:30 InnoDB: Initializing buffer pool, size = 256.0M 130101 22:22:30 InnoDB: Completed initialization of buffer pool 130101 22:22:30 InnoDB: highest supported file format is Barracuda. 130101 22:22:30 InnoDB: 1.1.8 started; log sequence number 63444325509 130101 22:22:30 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306 130101 22:22:30 [Note] - '127.0.0.1' resolves to '127.0.0.1'; 130101 22:22:30 [Note] Server socket created on IP: '127.0.0.1'. 130101 22:22:30 [Note] Event Scheduler: Loaded 0 events 130101 22:22:30 [Note] /usr/sbin/mysqld: ready for connections. Version: '5.5.28-cll' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Server (GPL)
如果uptime數(shù)值很大,表明MySQL服務(wù)運(yùn)行了很久了,說明最近服務(wù)沒有重啟過。 如果日志沒有相關(guān)信息,也說明MySQL服務(wù)最近沒有重啟過,可以繼續(xù)檢查下面幾項(xiàng)內(nèi)容。
原因2:連接超時(shí)
如果程序使用的是長(zhǎng)連接,則這種情況的可能性會(huì)比較大。 即某個(gè)長(zhǎng)連接很久沒有發(fā)起新的請(qǐng)求,達(dá)到了server端的time out,被server強(qiáng)行關(guān)閉。此后再通過這個(gè)client發(fā)起查詢的時(shí)候,就會(huì)報(bào)錯(cuò)server has gone away。
$ mysql -uroot -p -e "show global variables like '%timeout';"+----------------------------+----------+ | Variable_name | Value | +----------------------------+----------+ | connect_timeout | 30 | | delayed_insert_timeout | 300 | | innodb_lock_wait_timeout | 50 | | innodb_rollback_on_timeout | OFF | | interactive_timeout | 28800 | | lock_wait_timeout | 31536000 | | net_read_timeout | 30 | | net_write_timeout | 60 | | slave_net_timeout | 3600 | | wait_timeout | 28800 | +----------------------------+----------+mysql> SET SESSION wait_timeout=5;#Wait 10 secondsmysql> SELECT NOW(); ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 132361 Current database: *** NONE ***+---------------------+ | NOW() | +---------------------+ | 2013-01-02 11:31:15 | +---------------------+ 1 row in set (0.00 sec)
原因3: 進(jìn)程在server端被主動(dòng)kill
這種原因和第2種原因比較相似,只是發(fā)起者是DBA,或者其他job,發(fā)現(xiàn)有長(zhǎng)時(shí)間的慢查詢執(zhí)行kill xxx導(dǎo)致。
$ mysql -uroot -p -e "show global status like 'com_kill'"+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_kill | 0 | +---------------+-------+
原因4: Your SQL statement was too large
當(dāng)查詢的結(jié)果集超過 max_allowed_packet 也會(huì)出現(xiàn)這樣的報(bào)錯(cuò),定位方法是打出相關(guān)報(bào)錯(cuò)的語(yǔ)句。 用select*into outfile 的方式導(dǎo)出到文件,查看文件大小是否超過max_allowed_packet,如果超過則需要調(diào)整參數(shù),或者優(yōu)化語(yǔ)句。
mysql> show global variables like 'max_allowed_packet'; +--------------------+---------+ | Variable_name | Value | +--------------------+---------+ | max_allowed_packet | 1048576 | +--------------------+---------+ 1 row in set (0.00 sec)# 修改參數(shù):mysql> set global max_allowed_packet=1024*1024*16;mysql> show global variables like 'max_allowed_packet'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | max_allowed_packet | 16777216 | +--------------------+----------+ 1 row in set (0.00 sec)
上述內(nèi)容就是MySQL Server has gone away報(bào)錯(cuò)原因有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。