1. 程式人生 > >程序連不上數據庫的總結

程序連不上數據庫的總結

mysql mysql server has gone away

連不上mysql時一般有以下四種報錯:

1:Can‘t connect to MySQL server

2:Lost connection to MySQL server

3:Sorry, due to line fault, temporarily unable to browse, we are dealing with.

4:MySQL server has gone away


一:Can‘t connect to MySQL server

可能的原因:

1,mysql服務端沒有啟起來

2,網絡不通(iptables,selinux,網絡不穩定)


對應的解決方案:

1,dba先確定mysql服務是否正常

2,mysql服務正常的情況下找運維確認網絡問題


二: Lost connection to MySQL server

有四種情況可能會導致這樣的報錯:

1,網絡問題

2,查詢的結果集太大,比如一個查詢要返回幾百萬個結果

3,客戶端發起數據庫連接的時候由於connect_timeout設置時間太短而報錯,如果是由於這個原因引起的報錯可以通過SHOW GLOBAL STATUS LIKE ‘Aborted_connects‘查看這個值是否有增加

4,查詢有blob類型,超過了max_allowed_packet參數的限制


這四種情況對應的解決方案:

1,運維監控網絡是否有問題

2,將 net_read_timeout值調大

3,將connect_timeout值調大

4,將max_allowed_packet值調大


三: Sorry, due to line fault, temporarily unable to browse, we are dealing with.

這個錯誤不是mysql原生的錯誤,在網上也沒有找到有類似的資料.目前發現有三種情況會有這種報錯:

1,網絡有問題

2,數據庫連接數過多

3,連數據庫的帳號密碼有誤


四: MySQL server has gone away

有以下12種情況可能會導致這樣的報錯:

1,默認的wait_timeout值為8個小時,如果空閑連接超過這個值會被kill

2,dba手動kill

3,客戶端的帳號沒有權限連接mysql server

4,客戶端TCP/IP連接超時,如使用mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...)或者mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)函數

5,當客戶端禁用了自動重連接( automatic reconnection)

6,查詢語句不正確

7,查詢語句太長,超過了max_allowed_packet的限制

8,一條insert或者replace語句更新的行數過多

9,域名解析失敗

10,防火墻屏蔽了3306端口

11,一個線程fork了多個子進程,當多個子進程共用一個連接時會導致報錯

12,mysql服務端掛了


報MySQL server has gone away的錯誤原因比較多,我們可以從三個方面來應對這個問題:

1,運維

a,確認防火墻規則

b,dns服務器無異常

d,合理配置php.ini中連接mysql的參數

connect_timeout,默認為60s

mysqli.reconnect,默認為off

2,DBA

a,確定mysql服務和連接數無異常

b,設置合理的wait_timeout值

c,設置在服務器端合理的max_allowed_packet值

d,確認帳號權限無誤

3,開發

a,建議使用mysqli替代mysql

b,盡量少用長連接

c,mysqli.ping()可以在連接斷開後自動重連,mysql.ping()從mysql5.0.3後就不支持自動重連了

d,子進程之間不要共用一個數據庫連接

我們來看一下max_allowed_packet和超時有關的參數:

>show variables like ‘max_allowed_packet‘;

+--------------------+------------+

| Variable_name | Value |

+--------------------+------------+

| max_allowed_packet | 1073741824 |

+--------------------+------------+

>show variables like ‘%timeout%‘;

+-----------------------------+----------+

| Variable_name | Value |

+-----------------------------+----------+

| connect_timeout | 60 |

| delayed_insert_timeout | 300 |

| have_statement_timeout | YES |

| innodb_flush_log_at_timeout | 1 |

| innodb_lock_wait_timeout | 120 |

| innodb_rollback_on_timeout | OFF |

| interactive_timeout | 86400 |

| lock_wait_timeout | 31536000 |

| net_read_timeout | 120 |

| net_write_timeout | 120 |

| rpl_stop_slave_timeout | 31536000 |

| slave_net_timeout | 3600 |

| thread_pool_idle_timeout | 60 |

| wait_timeout | 86400 |

+-----------------------------+----------+


來看一下這幾個與連不上數據庫相關的超時參數:

connect_timeout:在獲取鏈接時,等待握手的超時時間,一般默認即可(10s),為了避免因為網絡不佳導致連接擁塞可以適當增大這個值.線上配置為60s

wait_timeout/interactive_timeout:連接狀態持續為sleep的超時時間,默認為28800(8小時),現上調整到了24小時

net_read_timeout:服務器端等待客戶端發送數據的超時時間,默認60s,線上為120s

net_write_timeout:服務器端寫數據到客戶端的超時時間,默認60s,線上為120s

再看一下max_allowed_packet參數:max_allowed_packet的默認值是1M(1048576),最大值是1G(1073741824),我們目前線上的值已經是上限值了.


本文出自 “一直在路上” 博客,請務必保留此出處http://chenql.blog.51cto.com/8732050/1958948

程序連不上數據庫的總結