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


95

我已根据此处的内容在EC2上设置了微型实例服务器

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?以及如何给我更多的空间/内存或进行修复所需的一切。

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

我的“ 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

我的EC2微型实例上有相同的问题。尝试设置innodb_buffer_pool_size = 128M,然后看看会如何。
swxxii 2012年

如果您使用的是微型实例,则可能需要添加交换空间:prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html
pmoubed 2012年

1
在EC2微型实例上,默认情况下没有交换空间,需要手动设置。否则,由于内存不足,您可能会看到很多MySQL崩溃。
pmoubed

Answers:


163

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

添加交换页面为我解决了这个问题。

您可以按照以下步骤设置交换空间。

如果仍然无法使用,请考虑使用RDS服务。

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

我复制了博客的内容作为记录。感谢博客作者pmoubed

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

我有一个Amazon EC2 Linux Micro实例。由于Micro实例只有613MB的内存,因此MySQL有时会崩溃。在长时间搜索MySQL,微型实例和内存管理后,我发现微型实例没有默认的SWAP空间。因此,如果要避免崩溃,可能需要为微型实例设置交换空间。实际上,明智的做法是启用交换更好。

以下步骤显示了如何为Micro实例创建交换空间。我假设您有运行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/

谢谢!这对我有帮助!
撤消

8
仅供参考,这对我来说是数字海洋小滴(512 MB)上的工作。并不是说这会让任何人感到惊讶,但是如果不确定的话,它可能会在具有相同问题的任何服务器上运行。
jfacemyer 2013年

谢谢您的救命!还通过Ubuntu Server运行了一个微型实例。
ECC-Dan

4
对于Digital Ocean用户,我遵循了本教程,它的魅力十足
Chris Ray

非常感谢。在过去的24个小时里,我一直忙于解决各种缓冲区/缓存/查询大小问题。
pranshus

23

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

innodb_buffer_pool_size = 64M

那没有用,我尝试将其降低到16M,但仍然没有用。然后我意识到该实例的可用内存基本上为零。所以我尝试重新启动apache

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

而且一切正常。也许另一种解决方案是将apache配置为以某种方式不占用太多内存。


2
MySQL可能仍然崩溃,因此您可能需要向微型实例添加交换空间。
pmoubed

谢谢,这很有意义。我想我也可以尝试限制apache可以产生的线程数。
wfbarksdale 2012年

效果很好。我也有这个问题,通过重新启动httpd解决了该问题。
Lionel Chan

1
很棒的收获,这条船在那 我将我的Apache设置为使用较少的ram,并且还创建了一个512m交换文件,但是将vm.swappiness设置为10,以便仅在少量情况下使用。
newz2000

重新启动nginx和php-fpm也释放了足够的内存以允许mysql启动!谢谢!
msEmmaMays

4

看起来您在帖子中显示的my.cfg文件中为innodb_buffer_pool_size 请求了128M的内存,但是MySQL认为您正在请求512M的内存:

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

几行后,错误消息告诉您MySQL无法启动,因为它无法为InnoDB缓冲池保留足够的(512M)内存:

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

这提出了三个问题:

  1. 您的实例上有多少内存?是否应该有足够的内存来容纳512M InnoDB试图获取的缓冲池,MySQL分配的所有其他内容,您的应用程序以及操作系统?
  2. 为什么InnoDB尝试采取超出您预期范围的措施?
  3. 为什么MySQL重新启动?

您可以回答1。

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

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

问题3.可能是由于在启动后的某个时间发生了内存不足的情况。如果是这种情况,您应该在日志中再看到一次指示。

最后,但有点不相关,您是否正在使用EBS支持的实例?通常强烈建议将其用于数据库服务器(实际上,在任何情况下,除非有特殊情况)。有关更多信息,请参见

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


2

对我而言,此问题已通过在我的EC2实例中添加交换卷而得到纠正。我的服务只是占用了盒子上的所有内存,并且会崩溃。多年以来一直是RedHat / CentOS管理员,这让我不习惯。Anaconda做了很多免费的Ubuntu EC2实例无法完成的工作。

我只是通过Web控制台创建了一个2Gb的卷,将其附加到我的实例,然后执行了“ mkswap / dev / [whatever]”,编辑了/ etc / fstab,崩溃崩溃了。

这些实例的安装方式不像我们大多数人习惯的基于媒体的操作系统安装那样-没有任何包,没有适当的文件系统以及诸如AppArmor之类的东西被剥离,如果您不了解它,则会导致各种问题和/或不知道如何配置它。


1

问题在于服务器没有足够的内存来分配给MySQL进程。有一些解决此问题的方法。

(1)增加物理RAM。添加1GB的额外RAM将解决此问题。(2)分配SWAP空间。默认情况下,Digital Ocean VPS实例未配置为使用交换空间。通过分配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 

减少MySQL缓冲池的大小

## Edit /etc/my.cnf, and add the following line under the [mysqld] heading.
[mysqld]
innodb_buffer_pool_size=64M

另外,请检查您的磁盘空间。确保您有足够的空间。

df-h


1

轻松回答:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

详细答案:

对于那些使用非常小的VPS(例如1GB或更少的RAM)的人来说,这是一个重要的问题。如果MySQL退出,则可能是服务器配置(Apache | nginx)或MySQL配置有问题。DOS攻击可能会导致系统资源使用率增加(见图)。最终结果是MySQL进程被内核关闭。对于长期解决方案,应考虑优化您的Apache或MySQL配置。

系统资源峰值导致RAM峰值(恰好在下午6点之前),系统资源峰值仅导致CPU峰值,星期二18:午夜

还有其他一些关于Stack Overflow这些主题的讨论,以及MySQL手册和Percona Blog:

MySQL手册-MySQL如何使用内存:

https://dev.mysql.com/doc/refman/8.0/zh-CN/memory-use.html

Percona-配置最佳MySQL内存使用的最佳做法:

https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

如何使用MySQLTuner优化MySQL性能:

https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/

Apache内存使用情况配置:

/server/254436/apache-memory-usage-optimization

Apache性能调优手册:

https://httpd.apache.org/docs/2.4/misc/perf-tuning.html

调整Apache服务器:

https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/

但是,对于您的原始问题,是的,您可以编写一个临时解决方案,以检查MySQL服务是否已加载并处于活动状态,如果未加载并处于活动状态则将重新启动MySQL。

您没有提及正在使用的操作系统。这将有助于给您特定的命令。我会给你一个CentOS linux的例子。
查看命令的以下输出systemctl status mysql。您可以在顶部看到该服务已加载处于活动状态

[root@centos-mysql-demo ~]# systemctl status mysqld
 mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-06-18 18:28:18 UTC; 924ms ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3350 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 3273 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 3353 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─3353 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Jun 18 18:28:11 centos-mysql-demo systemd[1]: Starting MySQL Server...
Jun 18 18:28:18 centos-mysql-demo systemd[1]: Started MySQL Server.

如果未加载该服务,则执行以下命令:

systemctl status mysqld || systemctl restart mysqld 

将完成重新启动该过程的技巧。你可以证明:

* * * * * systemctl status mysqld || systemctl restart mysqld

但是,如果已加载 mysql ,但该服务未激活,您的cron将不执行任何操作。因此,您应该使用更详细的命令,例如:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

在这种情况下,如果服务已加载处于非活动状态(例如DOS攻击可能离开您的mysql服务的状态),则该命令还将重新启动mysql。使用该--quiet标志仅指定仅返回状态代码的命令,而不向屏幕输出任何内容。如果您省略该--quiet标志,您将看到active或的状态输出inactive

您还可以创建一些交换空间,以向服务器添加更多可用的RAM资源,例如:

sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h

0

使用以下任何一种解决方案:

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

  2. 通过使用以下配置更改分配SWAP空间:

配置

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.