【问题标题】:MySQL fails on restart, InnoDB me alloc error 12MySQL 重启失败,InnoDB me alloc 错误 12
【发布时间】:2014-01-30 01:53:32
【问题描述】:

我的 Rackspace Centos 6.4 服务器实例上的 MySQL 有问题。该问题类似于this StackOverflow question 中描述的问题。 MySQL 在某个时候被 mysqld_safe 自动重新启动,并且重新启动失败,因为 InnoDB 尝试分配 128Mb 的 RAM,但失败了。 mysqld.log的输出如下:

140129 18:05:26 mysqld_safe Number of processes running now: 0
140129 18:07:30 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140129 18:07:30 InnoDB: Compressed tables use zlib 1.2.3
140129 18:07:30 InnoDB: Using Linux native AIO
140129 18:07:35 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140129 18:07:46 InnoDB: Completed initialization of buffer pool
140129 18:07:46 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140129 18:07:47 [ERROR] Plugin 'InnoDB' init function returned error.
140129 18:07:47 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140129 18:08:07 [ERROR] Unknown/unsupported storage engine: InnoDB
140129 18:08:10 [ERROR] Aborting

140129 18:08:53 [Note] /usr/libexec/mysqld: Shutdown complete

140129 18:18:18 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

另一个问题中提供的解决方案似乎是“创建交换文件”之一。我检查了我的服务器,似乎已经有一个活动的交换文件:

# swapon -s
Filename                Type        Size    Used    Priority
/dev/xvdc1              partition   499992  34876   -1

而且,看看那个输出,这是我认为我需要的大小 (512Mb)。为了完整起见,这里是我的/etc/fstab 文件的内容:

/dev/xvda1              /                       ext3    defaults,noatime,barrier=0 0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/xvdc1              none                    swap    sw              0 0

那么我是否遗漏了什么,或者我已经有一个大约 512Mb 的工作交换文件,该文件相当空,因此应该能够处理对 128Mb 的请求?我应该将 InnoDB 缓冲区的大小减小到 64Mb 吗?缩小这个缓冲区会不会有什么问题?

(我的 Rackspace 服务器是可用的最小的服务器,它有 512Mb 的 RAM。每当我在服务器上执行 top 时,它似乎有 50 到 80 Mb 的空闲空间。)

【问题讨论】:

    标签: mysql innodb rackspace-cloud rackspace swapfile


    【解决方案1】:

    从输出看来,您确实有大约 488MB 的交换空间。

    我不确定 MySQL 是否根据可用的 memory+swap 分配 innodb 缓冲池。即使这样做了,您也希望避免它进行交换,因为它比将内容保存在 RAM 中要慢。我的猜测是它不包括交换。

    错误“InnoDB: mmap(137363456 bytes) failed; errno 12”让我们知道您无法分配内存。

    # perror 12
    OS error code  12:  Cannot allocate memory
    

    我会将 innodb 缓冲池的大小减少到 64MB;看看这是否有效。如果没有,要么增加云服务器的大小,要么再次减小缓冲池的大小。

    一般来说 InnoDB 喜欢内存。它试图将尽可能多的数据保留在内存中并减少磁盘 IO。通过减少缓冲区大小,可以减少 MySQL 可以保留在内存中的数量。 MySQL 会更频繁地去磁盘检索数据。

    这个数字应该反映您的数据集的大小。缓冲区比实际数据集大得多是没有意义的。

    您可以使用此处的一些查询来确定大小。 http://www.mysqlperformanceblog.com/2008/03/17/researching-your-mysql-table-sizes/

    如果您的数据集比您通常手头的 RAM 量大得多,您可能需要增加服务器本身的大小。

    【讨论】:

    • 感谢您的回答!我已将 innodb 缓冲区减少到 64Mb,我只需要等待,看看这是否能解决问题 - 崩溃和随后的重启失败是非常随机的。
    • 太棒了。请让我知道它是否适合您。崩溃本身可能值得一看。 MySQL 本身不应该“定期”崩溃。
    猜你喜欢
    • 2015-04-14
    • 2017-11-04
    • 2017-12-12
    • 1970-01-01
    • 2012-05-04
    • 2012-07-30
    • 2021-05-21
    • 2015-06-17
    • 2017-11-27
    相关资源
    最近更新 更多