如何优化Linux下MySQL 5.0【涉及discuz论坛数据库too many connections问题】
//////////////////////////////////////////// 第一种解决方案收集(推荐) /////////////////////////////////////////////
mysql 5.0的默认最大连接数为100, 对于大负载量的并发需求可能不够,这时你可以修改mysql的最大连接。
查看mysql的当前最大连接数:
mysqladmin -uroot -ppassword variables | grep max_connections
或者
mysql> SHOW GLOBAL VARIABLES WHERE Variable_name='max_connections';
修改方法有如下几种
1.
mysql> SET GLOBAL max_connections=1000;
修改后会立即生效,不需要重启mysql服务,但是重启后会失效。
2.修改/etc/my.cnf,
在[mysqld] 下面添加:
max_connections=1000
修改后需要重启mysql服务才会重效。
结合第1和第2种方法,可以实现修改立即生效,以后重启也会有效。
3.修改/usr/bin/mysqld_safe
将下面的内容
if test -z "$args"
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 $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file=$pid_file --skip-external-locking $args >> $err_log 2>&1"
改为(添加红色字体的内容):
if test -z "$args"
then
$NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file=$pid_file --skip-external-locking -O max_connections=1000 >> $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=1000 >> $err_log 2>&1"
修改后重启mysql服务后有效。
建议用第一和第二种方法进行修改。
******************************************************************
/************************mssql连接数修改********************/
whereis my.cnf
max_connections=1000 '数据库最大连接数
vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
max_connections=1000
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
///////////
whereis safe_mysqld
vi /usr/local/mysql/bin/mysqld_safe
vi /usr/bin/mysqld_safe
max_connections
root
查看进程
ps -ef
进入mysql命令
mysql -uroot -p
查看mysql参数
show variables; //查看mysql设置
show status; //查看当前数据库状态,如查看当前连接数 Threads-connection
重启
redoot
*********************************************************************************************************
*****************************让它快速释放响应时间长的连接*************************************
![如何优化Linux下MySQL 5.0 - worm128 - Winlone技术博客](http://img767.ph.126.net/yzHQJl8TnKMhDRA0RV_Ufw==/4912301293554645608.jpg)
上图的查看命令:
mysql -uroot -p '进入mysql命令窗口
show status; '查看当前数据库状态
show variables; '查看数据库设置
【如果max_connections设置了300,那么这里的Threads_connected就为301,超出了mysql的最大连接,就会报错"Too many connection"】
interactive_timeout 需在mysql_connect()设置CLIENT_INTERACTIVE选项后起作用,并被赋值为wait_timeout;
mysql>set wait_timeout = 10; 对当前交互链接有效;
mysql>set interactive_timeout = 10; 对后续起的交互链接有效;
该超时时间单位是秒,从变量从上次SQL执行后算起;当前空闲若超过该时间,则也会被强制断开
-----------------------------------------------------------------------------------------------
////////////////////////////////////// 修改方法一 ///////////////////////////////////////////
错误编号:1040
问题分析:
连接数超过了 mysql教程 设置的值,与 max_connections 和 wait_timeout 都有关系。wait_timeout 的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大。
到c:windows目录下(windows 2000下为winnt),找到my.ini文件打开后。
在my.ini文件中[mysqld]下添加
set-variable = max_connections= 10000
然后save modification 保存修改。
最后把mysql重新启动一次即可。
解决方法:
1、虚拟主机用户请联系空间商优化 mysql 服务器的配置;
2、独立主机用户请联系服务器管理员优化 mysql 服务器的配置,可参考:
修改 mysql 配置文件(windows下为 my.ini, linux下为 my.cnf )中的参数:
max_connections= 1000
wait_timeout = 5
mysql 5.1以上的修改文件
you can increase this value in main config file (e.g., /etc/my.cnf) using this syntax:
[mysqld]
set-variable=max_connections=250
wait_timeout = 55 代码多长时间自放弃此连接
更多详细内容请查看:http://www.111cn.net/database/mysql/Too-many-connections.htm
////////////////////////////////////// 修改方法二 ///////////////////////////////////////////
这 段时间服务器崩溃2次,一直没有找到原因,今天看到论坛发出的错误信息邮件,想起可能是mysql的默认连接数引起的问题,一查果然,老天,默认 连接数才100, 怎么够呀,在网上找了半天资料,有说修改my.cnf的,有说修改safe_mysqld,试了,前者无用,
后者文件找不到:)原来是以前的版本跟现在的版本有所不同。
言归正传,我以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可以获得同样的效果。