【问题标题】:MYSQL database crashing frequently due to error in configurationMYSQL数据库因配置错误频繁崩溃
【发布时间】:2013-03-30 20:53:01
【问题描述】:

我刚刚将我的网站转移到 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)

谢谢!

【问题讨论】:

  • 嗨 Prashant,您是否有未正确关闭的连接?当我过去遇到这种情况时,这是由于连接没有关闭。除非你在这个盒子上获得了大量的流量,否则你甚至不应该达到 100 个用户的限制。
  • 文件执行结束时默认不关闭连接吗?
  • 嗨,Prashant,必须明确关闭连接 - 您在查询数据库的网站上使用什么语言?
  • 我个人使用名为 Navicat 的第 3 方工具 - 它有一个很好的界面来显示打开的连接 - 但是这可能在 MySql Work Bench 中可用 - 尽管我最近使用过这个

标签: mysql crash linode


【解决方案1】:

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

所以修复您的应用程序并关闭连接。同时,您可以使用此脚本来终止进程列表中已打开的连接。该脚本将杀死进程列表中停滞 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;

【讨论】:

  • 您可能正在使用 MISAM,您可能希望启用查询缓存,以便更快地从内存中提供服务。这些可能是一个很好的起点。query_cache_limit = 350M query_cache_size = 300M
  • 如果您分享有关您的要求、硬件、应用程序和当前数据库的更多信息,我将能够就如何更有效地使用 MYSQL 为您提供更多建议
  • 嗯可能是,但我必须写它。但是,这是 bash 脚本,在 linux 机器上非常好。并且可以由 cronjob 每 2-5 分钟执行一次......
  • 这就是我在评论中所说的,您正在使用 MISAM。
【解决方案2】:

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

解决方案:-

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2017-10-26
    相关资源
    最近更新 更多