当前位置: 首页 > 知识库问答 >
问题:

Amazon EC2,mysql中止启动,因为InnoDB: mmap (x bytes)失败;错误12

东方谦
2023-03-14

我在EC2上有一个基于此的微实例服务器

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

什么是真正的<代码>失败;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

共有3个答案

胥宏义
2023-03-14

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

初始化缓冲池,size=512.0M

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

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

这就引出了三个问题:

  1. 实例上有多少内存?是否有足够的内存来容纳InnoDB试图抓取的512M缓冲池、MySQL分配的所有其他内容、应用程序和操作系统
  2. 为什么InnoDB试图采取比您认为应该采取的更多的措施
  3. 为什么MySQL要重启

你可以回答1。

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

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

问题3。可能是由于启动后的某个时候发生的内存溢出情况。如果是这种情况,您应该在日志中看到进一步的指示。

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

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

施德元
2023-03-14

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

innodb_buffer_pool_size = 64M

这不起作用,我试着把它降到16M,但它仍然不起作用。然后我意识到该实例的可用内存基本上为零。所以我尝试重新启动阿帕奇

sudo system httpd restart
sudo system mysqld restart

一切都很好。也许另一个解决方案是配置apache不要以某种方式消耗这么多内存。

訾安邦
2023-03-14

当我尝试在没有RDS的情况下在我的微实例上运行wordpress时,我遇到了同样的问题。

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

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

如果还是不行,考虑用RDS服务。

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

我复制了博客的内容以供记录。归功于博客作者pMoubed:

Amazon EC2微实例交换空间-Linux

我有一个Amazon EC2LinuxMicro实例。由于Micro实例只有613MB的内存,MySQL时不时会崩溃。在对MySQL、Micro Instance和内存管理进行了长时间的搜索后,我发现Micro实例没有默认的SWAP空间。所以如果你想避免崩溃,你可能需要为你的微实例设置一个交换空间。实际上,从性能角度来看,启用交换更好。

以下步骤显示了如何为微型实例创建交换空间。我假设您有一个正在运行微型实例的 AWS 账户。

  1. 运行dd if=/dev/零=/swapfile bs=1M计数=1024
  2. 运行mkwap /swapfile
  3. 运行swapon /swapfile
  4. 将这一行/swapfile交换交换默认值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/
 类似资料:
  • 问题内容: 我已根据此处的内容在EC2上设置了 微型 实例服务器 mysql服务器频繁失败,并且第三次mysql服务器不见了。日志仅显示 到底是什么?以及如何给我更多的空间/内存或进行修复所需的一切。 我每次通过重新启动整个系统并删除所有日志并重新启动mysql服务器来解决此问题。但是我知道我的配置有问题。 我的“ my.cnf”也如下所示: 问题答案: 当我尝试在没有RDS的微型实例上运行wor

  • 错误:无法启动连接:错误:WebSocket无法连接。在服务器上找不到连接,endpoint可能不是信号器endpoint,服务器上不存在连接ID,或者存在阻止WebSocket的代理。如果有多台服务器,请检查是否启用了粘性会话。 WebSocketTransport.js:49WebSocket连接到“ws://xxxxxx/生产/网络服务/集线器/spreadhub”失败: Angular.t

  • 我正在使用NetBeans 8.0.2(也在最新的夜间版本中尝试过),并试图在端口8084上启动TomEE Plume服务器(也在不同的端口上尝试过)。服务器启动和工作正常,但NetBeans认为它没有启动,在大约2分钟的等待(“等待Tomcat”)后,抛出一个错误窗口“Tomcat失败启动”或类似的东西。 有些问题与我的问题相似,不同的是我完全没有错误,只有“Tomcat失败启动”窗口,所以我甚

  • 问题内容: 我的媒体录制出现问题。我正在尝试使用前置摄像头进行记录。这给我一个错误(但预览正常)。每当我使用后置摄像头时,一切正常,我觉得这很奇怪。可能是什么问题,可能是解决方案?我的代码和错误如下所示。 编辑。使用VGA前置摄像头录制似乎不起作用。这怎么可能?虽然可以使用HTC camera应用程序进行录制。 预先感谢您。 行添加到清单: 错误日志: 问题答案: 找到了解决方案。由于我使用的是前

  • 我能成功地建立docker映像 下面是我的docker-compose 现在我做到了 当服务停止时,它给出了以下错误

  • 问题内容: 我有以下失败部分: 我想在错误消息的正文中包含构建失败的原因。 我怎样才能做到这一点? 如果没有,是否可以将构建日志文件附加到电子邮件? 问题答案: 我不知道一种凭空自动获取故障原因的方法。 但是,您可以在每个阶段中使用“ post {failure {”块来至少捕获其失败的阶段到环境变量中(例如env.FAILURE_REASON),并在最终(全局范围)通知块中访问该env var