higehikiのブログ

iPhoneアプリ「ログ雀」の中の人です。

MySQLが起動しない…in AWS

AWS の microインスタンスapacheもredisもmysqlも全部載せの開発環境を構築して、アプリケーション開発をしていたところ、突然DBが接続できなくなった。

ログはこんな感じ。

cat /var/log/mysqld.log
...
130716 07:30:40 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
130716 07:32:37 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
130716  7:32:37 [Note] Plugin 'FEDERATED' is disabled.
130716  7:32:37 InnoDB: The InnoDB memory heap is disabled
130716  7:32:37 InnoDB: Mutexes and rw_locks use GCC atomic builtins
130716  7:32:37 InnoDB: Compressed tables use zlib 1.2.5
130716  7:32:37 InnoDB: Using Linux native AIO
130716  7:32:37 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
130716  7:32:37 InnoDB: Completed initialization of buffer pool
130716  7:32:37 InnoDB: Fatal error: cannot allocate memory for the buffer pool
130716  7:32:37 [ERROR] Plugin 'InnoDB' init function returned error.
130716  7:32:37 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
130716  7:32:37 [ERROR] Unknown/unsupported storage engine: InnoDB
130716  7:32:37 [ERROR] Aborting

130716  7:32:37 [Note] /usr/libexec/mysqld: Shutdown complete
...

ググってみると、出ました!AWSさん!

I have a Amazon EC2 Linux Micro instance. Since Micro instances have only 613MB of memory, MySQL crashed every now and then. After a long search about MySQL, Micro Instance and Memory Managment I found out there is no default SWAP space for Micro instance. So if you want to avoid the crash you may need to setup a swap space for your micro instance. Actually performance wise is better to enable swap.

EC2のMicroインスタンスなんて使っちゃってる貧乏人さんへ。
Microインスタンスは613MBしかメモリが載ってないからMySQLがクラッシュするのは必然だよ?
でも、僕気づいちゃったんだ。MicroインスタンスにはSWAPがないってことに。
どうしてもお金がなくてMicroしか使えない貧乏なあなたは、SWAP領域を確保して良い感じに設定すれば動くよ!

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

適当に訳すときっとこんな感じ。

対応は以下。
swap領域の確保

# dd if=/dev/zero of=/swapfile bs=1M count=1024
# mkswap /swapfile
# swapon /swapfile

fstabでswap領域の定義

# cp -ipv /etc/fstab{,.bak}
# vim /etc/fstab
+ /swapfile swap swap defaults 0 0

対象のMicroインスタンスをリブート

以上!
随分と悩ませてくれたじゃないか…。