0

我刚刚将我的网站转移到 Linode,我目前正在使用它的 1 GB RAM 计划。默认情况下,mysql用户数设置为100。这会导致Too many connections错误。

我在此的帮助下再次编辑了 mysql 设置。但是,现在数据库几乎每天都在崩溃!

这是我当前的mysql设置:-

key_buffer              = 100M
max_allowed_packet      = 1M
thread_stack            = 128K
thread_cache_size       = 8
myisam-recover         = BACKUP
max_connections        = 150
table_cache       ​ ​     = 1024​
query_cache_limit       = 300M
query_cache_size        = 300M ​
max_allowed_packet      = 16M
key_buffer              = 100M

谁能建议我一些更改或我的数据库如此频繁崩溃的原因?我还可以按需添加有关我的服务器的更多详细信息。

编辑

我到处都添加了 mysql_close($con) ,但这进一步增加了我的网站的问题。连接在下面显示的结果中呈指数增长:-

mysql> show status like '%onn%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Aborted_connects         | 48    |
| Connections              | 1634  |
| Max_used_connections     | 8     |
| Ssl_client_connects      | 0     |
| Ssl_connect_renegotiates | 0     |
| Ssl_finished_connects    | 0     |
| Threads_connected        | 4     |
+--------------------------+-------+
7 rows in set (0.00 sec)

谢谢 !

4

2 回答 2

0

如果您没有关闭连接,那么显然这将导致数据库最终崩溃。重新启动将刷新所有连接,这就是您的服务器可能正在重新启动的原因。

所以修复你的应用程序并关闭连接。同时,您可以使用此脚本来终止进程列表中已打开的连接。该脚本将杀死进程列表中停滞 500 秒的所有内容。您可以根据需要更改时间。

SECONDS_TOO_LONG=500
QUERIES_RUNNING_TOO_LONG=`/mysql/bin/mysql -u user -p'password' -ANe"SELECT COUNT(1) FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"`
if [ ${QUERIES_RUNNING_TOO_LONG} -gt 0 ]
then
    KILLPROC_SQLSTMT="SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') KillQuery FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"
    /mysql/bin/mysql -u user -p'pass' -ANe"${KILLPROC_SQLSTMT}" | /mysql/bin/mysql -u user -p'pass'
fi;
于 2013-04-08T17:28:07.303 回答
0

实际上,增加指数连接的主要来源是我的表本身。我正在使用 MISAM 数据库。它实际上在进行任何更新之前锁定了整个表。因此,如果有太多用户访问我的网站,就会造成麻烦。

解决方案 :-

我将数据库更改为 InnoDB。它仅锁定所需的单个行。这限制了一次没有连接,低至一位数。是另一个帮助我完全解决问题的问题。

于 2013-04-11T10:51:51.090 回答