起きた問題
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
を実行する- そのスクリプトは
datadir
にmysql
ディレクトリがない場合mysqld --initialize
を直指定して実行するもの -
mysql
ディレクトリはMySQL
自体の情報を格納する重要なデータベースだからであろう
- そのスクリプトは
-
mysqld --initialize
だと証明書関連のファイル*.pem
が作られてしまうためディレクトリが空の状態にならず起動に失敗する - つまり起動前に
mysqld --initialize
が実行されてファイルが作られてしまうがために「起きた問題」のエラーが発生した
参考資料
-
https://dev.mysql.com/doc/mysql-security-excerpt/5.7/en/data-directory-initialization-mysqld.html
- MySQL のデータディレクトリ初期化に関する公式資料
-
https://yoku0825.blogspot.jp/2015/03/mysql-576-mysqlinstalldbmysqld.html
- 5.7.6 以降の MySQL の初期化の挙動に関する説明の記事