Amazon EC2,因为InnoDB:mmap(x字节)失败,mysql中止启动; errno 12

根据我在这里阅读的内容,我在EC2上build立了一个微型实例服务器

MySQL服务器频繁失败,第三次mysql服务器不见了。 日志只显示

120423 09:13:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 120423 09:14:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 120423 9:14:27 [Note] Plugin 'FEDERATED' is disabled. 120423 9:14:27 InnoDB: The InnoDB memory heap is disabled 120423 9:14:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins 120423 9:14:27 InnoDB: Compressed tables use zlib 1.2.3 120423 9:14:27 InnoDB: Using Linux native AIO 120423 9:14:27 InnoDB: Initializing buffer pool, size = 512.0M InnoDB: mmap(549453824 bytes) failed; errno 12 120423 9:14:27 InnoDB: Completed initialization of buffer pool 120423 9:14:27 InnoDB: Fatal error: cannot allocate memory for the buffer pool 120423 9:14:27 [ERROR] Plugin 'InnoDB' init function returned error. 120423 9:14:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 120423 9:14:27 [ERROR] Unknown/unsupported storage engine: InnoDB 120423 9:14:27 [ERROR] Aborting 

什么是真的failed; errno 12 failed; errno 12 ? 我怎么能给更多的空间/记忆或任何需要修正的东西?

我通过重新启动整个系统并删除所有日志并重新启动mysql服务器来解决这个问题。 但是我知道configuration有问题。

另外我的`my.cnf'如下所示:

 [mysqld] # Settings user and group are ignored when systemd is used. # If you need to run mysqld under different user or group, # customize your systemd unit file for mysqld according to the # instructions in http://fedoraproject.org/wiki/Systemd # max_allowed_packet=500M datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 innodb_buffer_pool_size = 512M [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 

当我试图在没有RDS的微型实例上运行wordpress时遇到了同样的问题。

添加一个交换页面解决了我的问题。

你可以按照这个来设置交换页面:

http://www.prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html

如果它仍然不适合你,请考虑使用RDS服务。

===============================================

链接到博客有时失败。 我抄录了下面的内容。 值得信赖的博客作者Pedram Moubed :

Amazon EC2微型实例交换空间 – Linux

我有一个Amazon EC2 Linux Micro实例。 由于Micro实例只有613MB的内存,所以MySQL偶尔会崩溃。 经过对MySQL,Micro Instance和Memory Managment的长期search,我发现Micro实例没有默认的SWAP空间。 所以如果你想避免崩溃,你可能需要为你的微型实例设置一个交换空间。 实际上,性能明智更好地启用交换。

下面的步骤显示了如何为您的Micro实例创build交换空间。 我假设您拥有运行Micro实例的AWS账户。

  1. 运行dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. 运行mkswap /swapfile
  3. 运行swapon /swapfile
  4. 将此行/swapfile swap swap defaults 0 0/etc/fstab

如果您想在每次重启后自动启用交换文件,则需要执行第4步。

与SWAP空间有关的一些有用的命令:

 $ swapon -s $ free -k $ swapoff -a $ swapon -a 

参考文献:

  1. http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/
  2. http://cloudstory.in/2012/02/getting-the-best-out-of-amazon-ec2-micro-instances/
  3. http://cloudstory.in/2012/02/adding-swap-space-to-amazon-ec2-linux-micro-instance-to-increase-the-performance/
  4. http://aws.amazon.com/ec2/instance-types/

我在Amazon EC2微型实例上也遇到了这个问题。 我试着通过将以下内容添加到/etc/my.cnf来减lessinno_db的内存使用量

 innodb_buffer_pool_size = 64M

这不起作用,我试图把它降到16M,它仍然没有工作。 然后我意识到这个实例基本上没有空闲内存。 所以我尝试重新启动Apache

 sudo系统httpd重启
 sudo系统mysqld重启

一切正常。 也许另一个解决scheme是configurationApache不吃掉这么多的内存莫名其妙。

看起来你正在请求128M的内存,用于你在post中显示的my.cfg文件中的innodb_buffer_pool_size,但是MySQL认为你需要512M的内存:

初始化缓冲池,大小= 512.0M

下面几行,错误消息告诉你MySQL不会启动,因为它不能为InnoDB缓冲池预留足够的内存(512M):

致命错误:无法为缓冲池分配内存

这引出三个问题:

  1. 你的实例有多less内存? 是否应该有足够的内存来容纳512M InnoDB试图抓取缓冲池,再加上MySQL分配的所有内容,再加上你的应用程序以及操作系统?
  2. 为什么InnoDB试图采取超过您认为应该的?
  3. 为什么MySQL重新启动呢?

你可以回答1。

至于2.,MySQL选项文件可以位于几个不同的地方。 随后find文件覆盖以前find的文件中指定的选项。 看到

http://dev.mysql.com/doc/refman/5.5/en/option-files.html

问题3.可能是由于启动后某段时间内发生的内存不足状况。 如果是这样的话,你应该在日志中看到更多的迹象。

最后,但是有点无关,你使用EBS支持的实例吗? 这通常强烈build议数据库服务器(实际上,对于任何情况除外特殊情况)。 欲了解更多,请参阅

https://stackoverflow.com/a/3630707/141172

对我来说,这个确切的问题是通过添加交换量到我的EC2实例纠正。 我的服务只是消耗了盒子上的所有内存,并会崩溃。 不是我习惯的,作为一个RedHat / CentOSpipe理员多年 – Anaconda做了很多工作,免费的Ubuntu EC2实例没有。

我简单地通过Web控制台创build了2Gb卷,将其附加到我的实例,然后执行“mkswap / dev / [whatever]”,编辑了/ etc / fstab,并停止了崩溃。

这些实例不会像我们大多数人习惯的基于媒体的操作系统安装那样安装 – 没有软件包,没有正确的文件系统,以及像AppArmor这样的东西,如果您不知道它会导致各种问题和/或不知道如何configuration它。

使用以下任何一种解决scheme:

  1. 增加物理RAM。 增加1GB的额外RAM将解决这个问题。

  2. 通过使用下面的configuration更改分配SWAP空间:

configuration

 dd if=/dev/zero of=/extraswap bs=1024 count=512M mkswap /extraswap swapon /extraswap ## Edit the /etc/fstab, and the following entry. /extraswap none swap sw 0 0 

问题是服务器没有足够的内存来分配给MySQL进程。 这个问题有几个解决scheme。

(1)增加物理RAM。 增加1GB的额外RAM将解决这个问题。 (2)分配SWAP空间。 Digital Ocean VPS实例默认情况下未configuration为使用交换空间。 通过分配512MB的交换空间,我们能够解决这个问题。 要将交换空间添加到您的服务器,请按照以下步骤操作:

 ## As a root user, perform the following: # dd if=/dev/zero of=/swap.dat bs=1024 count=512M # mkswap /swap.dat # swapon /swap.dat ## Edit the /etc/fstab, and the following entry. /swap.dat none swap sw 0 0