程序連不上mysql的解決辦法:1、確定mysql服務(wù)是否正常,并找運維確認網(wǎng)絡(luò)問題;2、將“max_allowed_packet”值調(diào)大;3、將“net_read_timeout”值調(diào)大;4、將“connect_timeout”值調(diào)大等。
推薦:《mysql視頻教程》
程序連不上mysql的問題總結(jié)
連不上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服務(wù)端沒有啟起來
2,網(wǎng)絡(luò)不通(iptables,selinux,網(wǎng)絡(luò)不穩(wěn)定)
對應(yīng)的解決方案:
1,dba先確定mysql服務(wù)是否正常
2,mysql服務(wù)正常的情況下找運維確認網(wǎng)絡(luò)問題
二: Lost connection to MySQL server
有四種情況可能會導(dǎo)致這樣的報錯:
1,網(wǎng)絡(luò)問題
2,查詢的結(jié)果集太大,比如一個查詢要返回幾百萬個結(jié)果
3,客戶端發(fā)起數(shù)據(jù)庫連接的時候由于connect_timeout設(shè)置時間太短而報錯,如果是由于這個原因引起的報錯可以通過SHOW GLOBAL STATUS LIKE ‘Aborted_connects’查看這個值是否有增加
4,查詢有blob類型,超過了max_allowed_packet參數(shù)的限制
這四種情況對應(yīng)的解決方案:
1,運維監(jiān)控網(wǎng)絡(luò)是否有問題
2,將 net_read_timeout值調(diào)大
3,將connect_timeout值調(diào)大
4,將max_allowed_packet值調(diào)大
三: Sorry, due to line fault, temporarily unable to browse, we are dealing with.
這個錯誤不是mysql原生的錯誤,在網(wǎng)上也沒有找到有類似的資料.目前發(fā)現(xiàn)有三種情況會有這種報錯:
1,網(wǎng)絡(luò)有問題
2,數(shù)據(jù)庫連接數(shù)過多
3,連數(shù)據(jù)庫的帳號密碼有誤
四: MySQL server has gone away
有以下12種情況可能會導(dǎo)致這樣的報錯:
1,默認的wait_timeout值為8個小時,如果空閑連接超過這個值會被kill
2,dba手動kill
3,客戶端的帳號沒有權(quán)限連接mysql server
4,客戶端TCP/IP連接超時,如使用mysql_options(…, MYSQL_OPT_READ_TIMEOUT,…)或者mysql_options(…, MYSQL_OPT_WRITE_TIMEOUT,…)函數(shù)
5,當客戶端禁用了自動重連接( automatic reconnection)
6,查詢語句不正確
7,查詢語句太長,超過了max_allowed_packet的限制
8,一條insert或者replace語句更新的行數(shù)過多
9,域名解析失敗
10,防火墻屏蔽了3306端口
11,一個線程fork了多個子進程,當多個子進程共用一個連接時會導(dǎo)致報錯
12,mysql服務(wù)端掛了
報MySQL server has gone away的錯誤原因比較多,我們可以從三個方面來應(yīng)對這個問題:
1,運維
a,確認防火墻規(guī)則
b,dns服務(wù)器無異常
d,合理配置php.ini中連接mysql的參數(shù)
connect_timeout,默認為60s
mysqli.reconnect,默認為off
2,DBA
a,確定mysql服務(wù)和連接數(shù)無異常
b,設(shè)置合理的wait_timeout值
c,設(shè)置在服務(wù)器端合理的max_allowed_packet值
d,確認帳號權(quán)限無誤
3,開發(fā)
a,建議使用mysqli替代mysql
b,盡量少用長連接
c,mysqli.ping()可以在連接斷開后自動重連,mysql.ping()從mysql5.0.3后就不支持自動重連了
d,子進程之間不要共用一個數(shù)據(jù)庫連接
以gamiss為例,我們來看一下max_allowed_packet和超時有關(guān)的參數(shù):?
>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?| +-----------------------------+----------+
來看一下這幾個與連不上數(shù)據(jù)庫相關(guān)的超時參數(shù):
connect_timeout:在獲取鏈接時,等待握手的超時時間,一般默認即可(10s),為了避免因為網(wǎng)絡(luò)不佳導(dǎo)致連接擁塞可以適當增大這個值.線上配置為60s
wait_timeout/interactive_timeout:連接狀態(tài)持續(xù)為sleep的超時時間,默認為28800(8小時),現(xiàn)上調(diào)整到了24小時
net_read_timeout:服務(wù)器端等待客戶端發(fā)送數(shù)據(jù)的超時時間,默認60s,線上為120s
net_write_timeout:服務(wù)器端寫數(shù)據(jù)到客戶端的超時時間,默認60s,線上為120s
再看一下max_allowed_packet參數(shù):max_allowed_packet的默認值是1M(1048576),最大值是1G(1073741824),我們目前線上的值已經(jīng)是上限值了.
從上面的配置可以看到這些參數(shù)的設(shè)置相對來說都很大了,數(shù)據(jù)庫正常情況下程序報連不上數(shù)據(jù)庫應(yīng)該和數(shù)據(jù)庫本身的參數(shù)配置沒有關(guān)系.我們需要從其它方向來解決這個問題.