使用 MySQL 數據庫的站點,當訪問連接數過多時,就會出現 "Too many connections" 的錯誤。出現這種錯誤有兩種情況,一種是網站訪問量實在太大,服務器已經負擔不起,此時就應該考慮負載均衡或者其它減少服務器壓力的辦法。另一種情況就是 MySQL 的最大連接數設置得太小,當訪問量稍大就出現連接過多的錯誤。
MySQL 默認的最大連接數為 100,可以在 mysql 客戶端使用以下命令查看
mysql> show variables like 'max_connections';
此命令將得到類似以下的輸出結果:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 2000 |
+-----------------+-------+
1 row in set (0.00 sec)
要對 mysql 的最大連接數進行修改,只需要在 my.cnf 配置文件里面修改 max_connections 的值,然后重啟 mysql 就行。如果 my.ini 文件中沒有找到 max_connections 條目,可自行添加以下條目
max_connections = 200
?
設置max_connections
(這個辦法在debian+mysql? Ver 12.22 Distrib 4.0.22, for pc-linux (i386)
里實驗了)
設置辦法是在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?
(在院里的DELL機器mysql4.0里的語法不同
max_connecionts=2000
直接這么寫就好了
)
修改完畢后,重啟MySQL即可。當然,為了確保設置正確,應該查看一下max_connections。?
注意:?
1、雖然這里寫的32000。但實際MySQL服務器允許的最大連接數16384;?
2、除max_connections外,上述其他配置應該根據你們系統自身需要進行配置,不必拘泥;?
3、添加了最大允許連接數,對系統消耗增加不大。?
4、如果你的mysql用的是my.ini作配置文件,設置類似,但設置的格式要稍作變通。?
?
用mysqld --help 可以查看到max_connections 變量。
或者 mysql -uuser -p
后mysql>show variables;
也會看到max_connections?。???
下面是修改張老師 的redhat9的方法:
先是mysql -uw01f -p
mysql>show variables;
看到max_connections 為100
mysql>exit;
vi /etc/my.cnf
??? [mysqld]
set-variable=max_connections=250? #加入這些內容
:wq
/etc/init.d/mysqld restart
好了,行了。
下面的是抄的,我用不了
mysql的最大連接數默認是100, 這個數值對于并發連接很多的數據庫應用是遠遠不夠的,當連接請求大于默認連接數后,就會出現無法連接數據庫的錯誤,因此我們需要把它適當調大一些, 有兩種辦法可以修改最大連接數,一種是修改safe_mysqld,另一種是直接修改原代碼并重新編譯。下面我們就分別介紹這兩種方法:?
1.修改safe_mysqld?
找到safe_mysqld編輯它,找到mysqld啟動的那兩行,在后面加上參數 :?
-O max_connections=1000?
例如 :(其中前面有---的是原來的內容,而+++是修改過以后的)?
--- safe_mysqld.orig Mon Sep 25 09:34:01 2000?
+++ safe_mysqld Sun Sep 24 16:56:46 2000?
@@ -109,10 +109,10 @@?
if test "$#" -eq 0?
then?
nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR /?
- --skip-locking >> $err_log 2>&1?
+ --skip-locking -O max_connections=1000 >> $err_log 2>&1?
else?
nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR /?
- --skip-locking "$@" >> $err_log 2>&1?
+ --skip-locking "$@" -O max_connections=1000 >> $err_log 2>&1?
fi?
if test ! -f $pid_file # This is removed if normal shutdown?
then?
然后關閉mysql重啟它,用?
/mysqladmin所在路徑/mysqladmin -uroot -p variables?
輸入root數據庫賬號的密碼后可看到?
| max_connections | 1000 |?
即新改動已經生效。?
2.修改原代碼?
解開MySQL的原代碼,進入里面的sql目錄修改mysqld.cc找到下面一行:?
{ "max_connections", (long*) &max_connections,1000,1,16384,0,1},?
把它改為:?
{ "max_connections", (long*) &max_connections,1000,1,16384,0,1},?
存盤退出,然后./configure ;make;make install可以獲得同樣的效果。
?
查看Mysql連接數
登錄到mysql客戶端后,使用status命令也能獲得thread連接數以及當前連接的id
或者用
Mysql代碼
??? show full processlist???
看一下所有連接進程,注意查看進程等待時間以及所處狀態 是否locked
如果進程過多,就把進程打印下來,然后查看
Mysql代碼
??? mysql -e 'show full processlist;' > 111??
查找非locked的進程,一般就是當前執行中卡死,導致后面的進程排隊的原因。
另外,修改mysql最大連接數的方法:
編輯MySQL(和PHP搭配之最佳組合)配置文件
my.cnf 或者是 my.ini
在[MySQL(和PHP搭配之最佳組合)d]配置段添加:
Apache代碼
??? max_connections = 1000??
保存,重啟MySQL(和PHP搭配之最佳組合)服務。
然后用命令:
MySQL(和PHP搭配之最佳組合)admin -uroot -p variables
輸入root數據庫賬號的密碼后可看到
Linux代碼
??? | max_connections | 1000 |?
修改MySQL默認最大連接數
MYSQL數據庫安裝完成后,默認
最大連接數是100,一般流量稍微大一點的論壇或網站
這個連接數是遠遠不夠的,增加默認MYSQL連接數的方法有兩個
方法一:進入MYSQL安裝目錄 打開MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100?? 修改為 max_connections=1000 服務里重起MYSQL即可
方法二: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
-O max_connections=1500
>> $err_log 2>&1 else
eval "$NOHUP_NICENESS $ledir/$MYSQLD
$defaults --basedir=$MY_BASEDIR_VERSION
--datadir=$DATADIR $USER_OPTION
--pid-file=$pid_file
--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},
把它改為:
{"max_connections", OPT_MAX_CONNECTIONS,
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 1500, 1, 16384, 0, 1,
0},
存盤退出,然后./configure ;make;make install可以獲得同樣的效果。
?
mysqladmin -uroot -proot processlist
+-----+------+----------------+---------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+----------------+---------+---------+------+-------+------------------+
| 591 | root | localhost:3544 | bbs | Sleep | 25 | | |
| 701 | root | localhost:3761 | | uery | 0 | | show processlist |
+-----+------+----------------+---------+---------+------+-------+------------------+
2、只查看當前連接數(Threads就是連接數.):
mysqladmin -uroot -proot status
Uptime: 2102 Threads: 3 Questions: 15531 Slow queries: 0 Opens: 0 Flush tab
les: 1 Open tables: 61 Queries per second avg: 7.389
3、修改mysql最大連接數:
打開my.ini,修改max_connections=100(默認為100)。
如果是root帳號,你能看到所有用戶的當前連接。如果是其它普通帳號,只能看到自己占用的連接。?
show processlist;只列出前100條,如果想全列出請使用show full processlist;
?
?
?
?