今天早上,MySQL崩溃了。

除了标准的MySQL包含的数据库外,我使用的所有东西都是InnoDB。

我试图重新启动MySQL守护程序,但失败了两次。

然后我重新启动了整个服务器,MySQL正常启动,并且自此以来一直运行良好。

初始崩溃的mysqld日志文件包含以下内容:
<尝试重新启动守护程序时,mysqld日志文件包含:

120927 10:21:05 mysqld_safe Number of processes running now: 0
120927 10:21:06 mysqld_safe mysqld restarted
120927 10:21:12 [Note] Plugin 'FEDERATED' is disabled.
120927 10:21:12 InnoDB: The InnoDB memory heap is disabled
120927 10:21:12 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120927 10:21:12 InnoDB: Compressed tables use zlib 1.2.3
120927 10:21:12 InnoDB: Using Linux native AIO
120927 10:21:13 InnoDB: Initializing buffer pool, size = 4.0G
InnoDB: mmap(4395630592 bytes) failed; errno 12
120927 10:21:13 InnoDB: Completed initialization of buffer pool
120927 10:21:13 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120927 10:21:13 [ERROR] Plugin 'InnoDB' init function returned error.
120927 10:21:13 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120927 10:21:13 [ERROR] Unknown/unsupported storage engine: InnoDB
120927 10:21:13 [ERROR] Aborting

120927 10:21:13 [Note] /usr/libexec/mysqld: Shutdown complete

120927 10:21:13 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended


服务器重新启动后,mysqld日志文件包含:

120927 10:43:44 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120927 10:43:44 [Note] Plugin 'FEDERATED' is disabled.
120927 10:43:44 InnoDB: The InnoDB memory heap is disabled
120927 10:43:44 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120927 10:43:44 InnoDB: Compressed tables use zlib 1.2.3
120927 10:43:44 InnoDB: Using Linux native AIO
120927 10:43:44 InnoDB: Initializing buffer pool, size = 4.0G
InnoDB: mmap(4395630592 bytes) failed; errno 12
120927 10:43:44 InnoDB: Completed initialization of buffer pool
120927 10:43:44 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120927 10:43:44 [ERROR] Plugin 'InnoDB' init function returned error.
120927 10:43:44 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120927 10:43:44 [ERROR] Unknown/unsupported storage engine: InnoDB
120927 10:43:44 [ERROR] Aborting

120927 10:43:44 [Note] /usr/libexec/mysqld: Shutdown complete

120927 10:43:44 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended


我从来没有尝试解密崩溃的MySQL日志文件。

我正在使用版本:5.5.21-cll Atomicorp的MySQL Community Server(GPL)

关于我应该从哪里开始的任何想法?

UPDATE:
从@ Michael-sqlbot的建议中,我拉出了syslog和找到了这个:

120927 10:46:11 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120927 10:46:11 [Note] Plugin 'FEDERATED' is disabled.
120927 10:46:11 InnoDB: The InnoDB memory heap is disabled
120927 10:46:11 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120927 10:46:11 InnoDB: Compressed tables use zlib 1.2.3
120927 10:46:11 InnoDB: Using Linux native AIO
120927 10:46:11 InnoDB: Initializing buffer pool, size = 4.0G
120927 10:46:11 InnoDB: Completed initialization of buffer pool
120927 10:46:12 InnoDB: highest supported file format is Barracuda.
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
120927 10:46:12  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
120927 10:46:15  InnoDB: Waiting for the background threads to start
120927 10:46:16 InnoDB: 1.1.8 started; log sequence number 57665645675
120927 10:46:16 [Note] Event Scheduler: Loaded 0 events
120927 10:46:16 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.5.21-cll'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL) by Atomicorp


#1 楼

我有好消息,也有坏消息。好消息是,您的文件系统和mysql最可能很好...但是在10:21:05之前检查/ var / log / syslog或等效文件以查看系统上还发生了什么。

当您发布的第一条消息被记录时,您的mysql服务器已经死亡。

120927 10:21:05 mysqld_safe Number of processes running now: 0


所以,假设您没有忽略mysql错误日志中的任何内容,我会说它没有崩溃并死掉-实际上

当mysqld_safe(这是一个包装器,而不是服务器本身)意识到服务器未在运行并且服务器没有正常终止时,它会为您重新启动它。 br />
120927 10:21:06 mysqld_safe mysqld restarted


...然后服务器守护程序记录了一些正常的启动消息...

120927 10:21:12 [Note] Plugin 'FEDERATED' is disabled.
120927 10:21:12 InnoDB: The InnoDB memory heap is disabled
120927 10:21:12 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120927 10:21:12 InnoDB: Compressed tables use zlib 1.2.3
120927 10:21:12 InnoDB: Using Linux native AIO


.. 。但是当mysqld要求操作系统为InnoDB缓冲池分配4GB内存时...

120927 10:21:13 InnoDB: Initializing buffer pool, size = 4.0G


...内核说“不。”

InnoDB: mmap(4395630592 bytes) failed; errno 12


检查内核资源以确保:

#define ENOMEM      12  /* Out of memory */


是的。因此,应该忽略“失败; errno 12”行下的每条消息-它们都是该消息的副作用。

但是,所有这些事情都是在第一次崩溃后发生的。

我的最佳猜测是,内存极低的情况导致您的内核最初杀死了mysqld,从而试图使系统稳定。

自然,重新启动后导致内存不足的任何原因都消失了。 mysql服务器能够为InnoDB缓冲池分配4GB,并且在导致内存不足的任何原因导致它再次出现之前,一切都应该是好的。

首先猜测:apache子进程运行amok。 br />

#2 楼

这是最近发生在我身上的事情,该线程对于帮助我了解正在发生的事情具有不可估量的价值。

我正在具有1GB Ram的Ubuntu 14.04上运行LAMP堆栈。由于网络流量激增,我的服务器一直崩溃。对我来说,摆弄mysql配置文件只会延长我经历另一个随机崩溃的时间。为了测试并解决此问题,我最终使用了Apache的ab工具:

ab -n 100 -c 10 http://gastonia.com/

10并发(-c)还可以,所以增加到我撞到30-bam-崩溃为止。我退后一步,直到找到一个安全的数字,然后调整了Apache的ServerLimit指令:

ServerLimit 20

之后,我可以将-c更改为我想要的任何数字到,但我还没有遇到另一次崩溃。

希望对遇到相同问题的任何人都有用。

评论


非常感谢!我在用MySQL扯头发。当我看到此过程时,对于我的情况来说似乎是可行的。我尝试过,它完全按照您在测试中描述的那样工作!

–zkarj
18年2月14日在7:52

#3 楼

我遇到了与最初发布的问题相同的问题,并且在神秘的Mysql_safe重新启动后以随机的间隔重复出现了InnoDB损坏。

我通常能够通过首先停止Apache来重新启动Mysql。

阅读这篇文章后,我查看了syslog日志,发现:
内核:超出了内存:杀死进程19468(mysqld)得分256或牺牲子进程
与神秘的mysql崩溃具有相同的时间戳。

我还将其与流量激增和httpd(apache)进程堆栈匹配。我减小了innoDB池的大小,稍微增加了交换大小,并限制了Apache进程的最大数量,以防万一。

#4 楼



 Sep 27 10:21:52 ip-97-74-197-181 kernel: Swap cache: add 5745145, delete 5744809, find 81873079/82270945, race 0+63
Sep 27 10:21:52 ip-97-74-197-181 kernel: Free swap  = 0kB
Sep 27 10:21:52 ip-97-74-197-181 kernel: Total swap = 2096472kB
Sep 27 10:21:52 ip-97-74-197-181 kernel: Free swap:            0kB
 


尝试检测哪些进程占用了内存并交换了内存:

 for file in /proc/*/status ; do awk '/VmSwap|Name/{printf  " " }END{ print ""}' $file; done | sort -k 2 -n -r | less
 


然后杀死所有人:

 ps -ef | grep eatingprocess |  grep -v grep  |  awk '{print }' | xargs kill -9