Vagrant+VirtualBox+CentOS環境でMySQL5.6が起動しない場合の対処法
発生した現象
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 ]
問題なく起動した。