mysql資料庫連接配接數過多導緻系統出錯,系統不能連接配接資料庫,關鍵要看兩個資料:
1、資料庫系統允許的最大可連接配接數max_connections。這個參數是可以設定的。如果不設定,預設是100。最大是16384。
2、資料庫目前的連接配接線程數threads_connected。這是動态變化的。
檢視max_connections、max_connections的辦法見後。
如果 threads_connected == max_connections 時,資料庫系統就不能提供更多的連接配接數了,這時,如果程式還想建立連接配接線程,資料庫系統就會拒絕,如果程式沒做太多的錯誤處理,就會出現類似強壇的報錯資訊。
因為建立和銷毀資料庫的連接配接,都會消耗系統的資源。而且為了避免在同一時間同時打開過多的連接配接線程,現在程式設計一般都使用所謂資料庫連接配接池技術。
但資料庫連接配接池技術,并不能避免程式錯誤導緻連接配接資源消耗殆盡。
這種情況通常發生在程式未能及時釋放資料庫連接配接資源或其他原因造成資料庫連接配接資源不能釋放,但強壇系統估計不會發生這種低級的程式設計錯誤。
該錯誤的簡便的檢查辦法是,在重新整理強壇頁面時,不斷監視threads_connected的變化。如果max_connections足夠大,而 threads_connected值不斷增加以至達到max_connections,那麼,就應該檢查程式了。當然,如果采用資料庫連接配接池技術, threads_connected增長到資料庫連接配接池的最大連接配接線程數時,就不再增長了。
從強壇出錯的情況看,更大的可能性是資料庫系統沒能進行适當地配置。下面提出一點建議。供參考
讓你們的工程師把MySQL的最大允許連接配接數從預設的100調成32000。這就不會老出現連接配接過多的問題了。
檢視max_connections
進入MySQL,用指令:
show variables
檢視資料庫最大可連接配接數的變量值:
max_connections
檢視threads_connected
show status
檢視目前活動的連接配接線程變量值:
threads_connected
設定max_connections
設定辦法是在my.cnf檔案中,添加下面的最後紅色的一行:
[mysqld]
port=3306
#socket=MySQL
skip-locking
set-variable = key_buffer=16K
set-variable = max_allowed_packet=1M
set-variable = thread_stack=64K
set-variable = table_cache=4
set-variable = sort_buffer=64K
set-variable = net_buffer_length=2K
set-variable = max_connections=32000
修改完畢後,重新開機MySQL即可。當然,為了確定設定正确,應該檢視一下max_connections。
注意:
1、雖然這裡寫的32000。但實際MySQL伺服器允許的最大連接配接數16384;
2、除max_connections外,上述其他配置應該根據你們系統自身需要進行配置,不必拘泥;
3、添加了最大允許連接配接數,對系統消耗增加不大。
4、如果你的mysql用的是my.ini作配置檔案,設定類似,但設定的格式要稍作變通。
方法二:MySQL的最大連接配接數預設是100用戶端登入:mysql -uusername -ppassword
設定新的最大連接配接數為200:mysql> set GLOBAL max_connections=200
顯示目前運作的Query:mysql> show processlist
顯示目前狀态:mysql> show status
退出用戶端:mysql> exit
檢視目前最大連接配接數:mysqladmin -uusername -ppassword variables
方法三:以centos 4.4 下面的mysql 5.0.33 手工編譯版本為例說明:
vi /usr/local/mysql/bin/mysqld_safe
找到safe_mysqld編輯它,找到mysqld啟動的那兩行,在後面加上參數 :
-O max_connections=1500
具體一點就是下面的位置:
用紅字特别說明:
then $NOHUP_NICENESS $ledir/$MYSQLD
$defaults --basedir=$MY_BASEDIR_VERSION
--datadir=$DATADIR $USER_OPTION
--pid-file=$pid_file
--skip-external-locking
>> $err_log 2>&1 else
eval "$NOHUP_NICENESS $ledir/$MYSQLD
--skip-external-locking $args
-O max_connections=1500 >>
$err_log 2>&1"
儲存。
# service mysqld restart
# /usr/local/mysql/bin/mysqladmin -uroot -p variables
輸入root資料庫賬号的密碼後可看到
max_connections 1500 即新改動已經生效。
還有一種方法,
修改原代碼:
解開MySQL的原代碼,進入裡面的sql目錄修改mysqld.cc找到下面一行:
{"max_connections", OPT_MAX_CONNECTIONS,
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,
0},
把它改為:
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 1500, 1, 16384, 0, 1,
存盤退出,然後./configure ;make;make install可以獲得同樣的效果。