Vagrant+VirtualBox+CentOS環境でMySQL5.6が起動しない場合の対処法

f:id:tmknom:20140322105543p:plain

発生した現象

Vagrant+VirtualBox+CentOSって環境にMySQL5.6をインストールして起動しようとしたところ

$ sudo service mysqld start
MySQL Daemon failed to start.
Starting mysqld:                                 [FAILED]

とこんな感じで起動できなかったので調べてみたよ。

まず、ログの場所を確認。

$ cat /etc/my.cnf
...
[mysqld_safe]
log-error=/var/log/mysqld.log

/var/log/mysqld.logにログがあるようだ。

エラーメッセージ確認

というわけで、ログからエラーメッセージを探してみる。

$ sudo cat /var/log/mysqld.log
...
2014-03-21 15:21:46 2492 [Note] InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
2014-03-21 15:21:46 2492 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2014-03-21 15:21:46 2492 [ERROR] Plugin 'InnoDB' init function returned error.
2014-03-21 15:21:46 2492 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2014-03-21 15:21:46 2492 [ERROR] Unknown/unsupported storage engine: InnoDB
2014-03-21 15:21:46 2492 [ERROR] Aborting
...

原因っぽいメッセージ発見→ InnoDB: Cannot allocate memory for the buffer pool

どうもメモリの確保に失敗しているらしい。

メモリの状況を確認。

$ free
             total       used       free     shared    buffers     cached
Mem:        603580     140024     463556          0       5484      83680
-/+ buffers/cache:      50860     552720
Swap:            0          0          0

結構空きがあるように見えるが、まだ足りないらしい。

解決法1:仮想OSのメモリサイズを増やす

一番簡単なのは、仮想OSのメモリサイズを増やすことだ。

Vagrantfileにこれを記述する。

config.vm.provider :virtualbox do |v|
  v.customize ["modifyvm", :id, "--memory", 1024]
end

ここでは、仮想OSのメモリを1024MBに設定した。

これでもう一度仮想OSを立ち上げて確認してみると

$ sudo service mysqld start
Starting mysqld:                                 [  OK  ]

正常にMySQLを起動できた。

解決法2:スワップ領域の確保

解決法1が採用できるならそうすべきだが、それが無理な場合は、スワップ領域を確保することで解決できる。

まずは、現状スワップ領域がどうなっているか見てよう。

$ swapon -s
Filename    Type  Size Used Priority

スワップ領域は存在しないらしい。

というわけでスワップ用のファイルを作成する。

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

とりあえず、サイズは1024MBとした。

次に作成したファイルをスワップ領域として初期化する。

$ sudo mkswap /swapfile

それではスワップ領域を有効にしよう。

$ sudo swapon /swapfile

では、確認。

$ swapon -s
Filename                Type        Size    Used    Priority
/swapfile                               file        1048568 0   -1

正常にスワップ領域が有効になった。

最後に、再起動時にもスワップ領域が使えるように /etc/fstab に設定しておけばOK。

$ sudo sh -c "echo '/swapfile swap swap defaults 0 0' >> /etc/fstab"

では、MySQLを起動してみよう。

$ sudo service mysqld start
Starting mysqld:                                 [  OK  ]

問題なく起動した。