MySQL
CentOS
systemd

MySQL 5.7 on CentOS7 で起動時にこける問題

More than 1 year has passed since last update.

起きた問題

MySQL の起動に失敗する

$ sudo systemctl start mysqld.service
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.

$ sudo journalctl -b | tail -n 100 | grep ERROR
# 以下のエラーメッセージがみつかる
# [ERROR] --initialize specified but the data directory has files in it. Aborting.

data ディレクトリにファイルがあって失敗してることがわかる(本来は空っぽの状態から実行されている必要がある)

結論

以下の形で MySQL 起動前に初期化を明示的に行う (--initialize は後述の理由で起動に失敗する)

mysqld --initialize-insecure

何が起きてたのか

  • MySQL 5.7.6 から従前の mysqld_install_db から mysqld --initialize に変更された
    • もうひとつのオプションとして mysqld --initialize-insecure が存在する
  • CentOS7 では systemd を経由し起動前に起動前初期化スクリプト /usr/bin/mysqld_pre_systemd を実行する
    • そのスクリプトは datadirmysql ディレクトリがない場合 mysqld --initialize を直指定して実行するもの
    • mysql ディレクトリは MySQL 自体の情報を格納する重要なデータベースだからであろう
  • mysqld --initialize だと証明書関連のファイル *.pem が作られてしまうためディレクトリが空の状態にならず起動に失敗する
  • つまり起動前に mysqld --initialize が実行されてファイルが作られてしまうがために「起きた問題」のエラーが発生した

参考資料