【EC2】メモリ不足でMySQLが起動しない

MySQLに関してのChefをゴリゴリと書いた後にchef実行でうぇーいとやったら、以下のmysqldがスタート出来ないというエラーが。

$ knife solo cook hostname
(中略)
STDOUT: MySQL Daemon failed to start.
Starting mysqld:  [FAILED]
STDERR:
(後略)

とりあえずmysqldのログを見てみる。
場所がわからなかったので、my.cnfで場所を確認。

$ cat /etc/my.cnf | grep log-error
log-error=/var/log/mysqld.log

ログの場所でtail。

$ tail -f /var/log/mysqld.log

再度実行してエラーを確認。

(前略)
InnoDB: mmap(137363456 bytes) failed; errno 12
2014-11-25 09:35:13 28858 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2014-11-25 09:35:13 28858 [ERROR] Plugin 'InnoDB' init function returned error.
2014-11-25 09:35:13 28858 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2014-11-25 09:35:13 28858 [ERROR] Unknown/unsupported storage engine: InnoDB
2014-11-25 09:35:13 28858 [ERROR] Aborting
(後略)

どうやらこの辺りでエラーを吐いている様子。

ググってみると、EC2のt1.microインスタンスだとMySQLに必要なメモリ領域が確保できないから出現するエラーとのこと。
swap領域を確保してあげれば良いらしいので、記事末尾の参考内コードを参照しつつ記述を加える。

script 'create swapfile' do
  interpreter 'bash'
  not_if { File.exists?('/var/swapfile') }
  code <<-eof
    dd if=/dev/zero of=/var/swapfile bs=1M count=2048 &&
    chmod 600 /var/swapfile &&
    mkswap /var/swapfile
  eof
end

mount '/dev/null' do  # swap file entry for fstab
  action :enable  # cannot mount; only add to fstab
  device '/var/swapfile'
  fstype 'swap'
end

script 'activate swap' do
  interpreter 'bash'
  code 'swapon -ae'
end

というわけで再度chefを実行。

無事成功!


後々Chef実践入門を読み直していたら、P76辺りからEC2のマイクロインスタンススワップファイルを作る例が載っていた。
というか、作りましょう常識なので、と書いてあった。
本はちゃんと読まないといかんですね。


参考
Creating a swap file with Chef
Chef で aws の t1.micro に swap を作るレシピ - Qiita
Amazon EC2, mysql aborting start because InnoDB: mmap (x bytes) failed; errno 12 - Stack Overflow

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)