mysql連線數過多 解決方案 閱讀目錄
mysql 預設連結數是100個 最大是16384。
原則:想盡一切辦法不重啟
導致原因:
出現這種錯誤明顯就是 mysql_connect 之後忘記 mysql_close;
當大量的connect之後,就會出現Too many connections的錯誤,mysql預設的連線為100個,而什麼情況下會出現這種錯誤呢?
正常的mysql_connect 之後呼叫 mysql_close()關閉連線
但在連線錯誤時,會者mysql_real_query()出現錯誤退出時,可能忘記mysql_close();
所以在程式return 之前一定要判斷是否close(),最穩妥的方法就是在寫任何函式時都只有一個出口!
檢視連結:
檢視當前連線數
./mysqladmin -uroot -p1234.com status Uptime: 1370150 Threads: 1 (當前連線數) Questions: 79 Slow queries: 0 Opens: 33 Flush tables: 1 Open tables: 26 Queries per second avg: 0.000
./mysql -uroot -p1234.com -e 'show status' | grep -i Threads Delayed_insert_threads 0 Slow_launch_threads 0 Threads_cached 1 Threads_connected 1 Threads_created 2 Threads_running 1 ##(當前連線數)
mysql> show status like 'Threads%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 1 | | Threads_connected | 1 | | Threads_created | 2 | | Threads_running | 1 | ###當前連線數 +-------------------+-------+ 4 rows in set (0.00 sec)
檢視最大連線數
[[email protected] bin]# ./mysql -uroot -p1234.com -e 'show variables' | grep max_connections max_connections 500
mysql> show global variables like 'max_conn%'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | max_connect_errors | 10 | | max_connections | 500 |## 最大連線數 +--------------------+-------+ 2 rows in set (0.00 sec)
解決方法:
想盡一切辦法不重啟
這種情況一般是進不去資料庫了,修改配置檔案得重啟,對於線上的資料庫風險太大了,進入資料庫用sql修改,現在是進不去了
方法1:
使用gdb工具 不用進入資料庫,不用重啟資料庫 方法如下:
[[email protected] bin]# gdb -p $(cat /data/mydata/xxx.pid) -ex "set max_connections=500" -batch [New LWP 7667] [New LWP 4816] [New LWP 341] [New LWP 338] [New LWP 337] [New LWP 336] [New LWP 335] [New LWP 331] [New LWP 330] [New LWP 329] [New LWP 328] [New LWP 327] [New LWP 326] [New LWP 325] [New LWP 324] [New LWP 323] [New LWP 322] [Thread debugging using libthread_db enabled] 0x00000035654df1b3 in poll () from /lib64/libc.so.6
檢視mysql pid位置的方法
在配置檔案 my.cnf裡查詢
用 ps -ef | grep mysql 查詢
mysql> show variables like '%pid%'; +---------------+----------------------+ | Variable_name | Value | +---------------+----------------------+ | pid_file | /data/mydata/xxx.pid | +---------------+----------------------+ 1 row in set (0.00 sec)
修改完畢後 ,嘗試重新進入資料庫,並檢視連結數
這種方法設定後,只是暫時的,資料庫重啟後,會變為原來的數值,要想永久,設定完後修改配置檔案my.cnf
方法2
前提是還可以進入資料庫
進入資料庫
設定新的最大連線數為200:mysql> set GLOBAL max_connections=200
顯示當前執行的Query:mysql> show processlist
顯示當前狀態:mysql> show status
退出客戶端:mysql> exit
這種方法設定後,只是暫時的,資料庫重啟後,會變為原來的數值,要想永久,設定完後修改配置檔案my.cnf
方法3:
需要重啟資料庫
修改 my.conf
max_connection = 1000;
模擬mysql連線數過多
指令碼內容
#!/bin/bash set j=2 while true do let "j=j+1" /usr/local/mysql/bin/mysqlslap -a -c 500 -i 10 -uroot -p1234.com done
執行此指令碼 ,然後導致mysql連線數過多無法連線,多試幾次確定無法連線 再用gdb工具測試