Django偶尔也无法连接到数据库(Centos)

时间:2016-06-10 11:16:48

标签: mysql django centos

我有一个非常奇怪的问题,我有一个运行mod_wsgi的Apache服务器。该网站运行良好,但我偶尔会得到

IOError: failed to write data
网站的所有页面都出现

错误。然后我用

解决了
sudo service mysqld restart

由于网站不能长时间停机,我没时间调试这个问题,而且每次发生这种情况时我都会运行命令。我只看到日志中的错误,这就是为什么我无法真正调试它,并且它没有明确的复制步骤,它只是随机发生的。

如果您需要我发布任何配置文件,我们将不胜感激,请告诉我。

编辑:django显示的确切错误是:

(2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")

我保存了错误消息,并且托管了here。 (密码已删除)

编辑: 以下是mysql服务器错误日志的摘录。

160610 10:51:53 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
160610 10:51:53 [Note] /usr/libexec/mysql55/mysqld (mysqld 5.5.46) starting as process 7658 ...
160617 14:35:47 [Note] /usr/libexec/mysql55/mysqld (mysqld 5.5.46) starting as process 32054 ...
160617 14:35:47 [Note] Plugin 'FEDERATED' is disabled.
160617 14:35:47 InnoDB: The InnoDB memory heap is disabled
160617 14:35:47 InnoDB: Mutexes and rw_locks use GCC atomic builtins
160617 14:35:47 InnoDB: Compressed tables use zlib 1.2.8
160617 14:35:47 InnoDB: Using Linux native AIO
160617 14:35:47 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
160617 14:35:47 InnoDB: Completed initialization of buffer pool
160617 14:35:47 InnoDB: Fatal error: cannot allocate memory for the buffer pool
160617 14:35:47 [ERROR] Plugin 'InnoDB' init function returned error.
160617 14:35:47 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160617 14:35:47 [ERROR] Unknown/unsupported storage engine: InnoDB
160617 14:35:47 [ERROR] Aborting

我保存了完整的mysqld.log here

1 个答案:

答案 0 :(得分:3)

为什么崩溃

这似乎是罪魁祸首

160617 14:35:47 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12

此情况是由服务器耗尽物理内存引起的。这就是errno 12代表的内核错误。

已在Stack Overflowdba.stackexchange上讨论了此主题。如果您想模拟低内存情况或尝试手动重现错误,请尝试以下某些工具: How to fill 90% of the free memory?

快速解决方案

如果您能够升级内存,可以试试。如果没有,您可以尝试创建一个大的交换文件。您可能根本没有交换。默认情况下,某些AWS EC2实例没有。您可以在shell中输入top来查找。如果你没有看到靠近顶部的交换,那意味着你没有。

交换文件会使查询慢很多,但至少比网站下线要好。

您可能想尝试修改systemd文件以使mysql自动启动。 更新:@PeterBrittain指出mysql正在自动重启,如日志所示。有时虽然数据库可能需要一些时间来重新启动,但如果数据损坏,它将拒绝重新启动。

为什么内存耗尽?

如果您没有运行任何其他服务器,2GB将足以托管每天服务6000页的网站。可能是你有一些相当繁重的查询会给数据库带来不必要的负担。可以采取一些补救措施

  1. 使用django-debug-toolbar识别执行许多查询的页面,并查看是否可以使用select_related或prefetch_related来减少数量。
  2. 使用mysql慢查询日志来查找需要很长时间才能执行和优化它们的查询。
  3. 使用缓存来保存复杂查询的结果。