yumでMySQL5.6を入れて早速動かしてみたら早速[FAILED]という文字列に出くわす。
[XX:XX:XX][root@test-web ~]# /etc/init.d/mysqld start
MySQL Daemon failed to start.
Starting mysqld: [FAILED]
[XX:XX:XX][root@test-web ~]#
ログを見てみよう
ログが出力される場所を探す
そもそものMySQLの設定のあるファイルがどこかを探してみよう。
[XX:XX:XX][root@test-web ~]# mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
[XX:XX:XX][root@test-web ~]#
だいたい一番左に表示されているのが設定ファイルの場所になる。
なので今回は'/etc/my.cnf'を見てみることにする。
log-error=/var/log/mysqld.log
なるほど/var/log/mysqld.logにログが出力されるらしいので[FAILED]になった原因のエラーを探してみる。
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
このエラーはmy.cnfに以下の設定を加えると解決できる。
[mysqld]
explicit_defaults_for_timestamp = 1
⚠注意
くれぐれも[mysqld]の下に記述すること。
なんとなく末尾に追記〜なんてやっていると[mysqld_safe]の下に書いてしまっていて一向に動かないなんてことがある。
MySQLの再起動
[XX:XX:XX][root@test-web ~]# /etc/init.d/mysqld start
Starting mysqld: [ OK ]
[XX:XX:XX][root@test-web ~]#
これで[OK]が表示されれば大丈夫👍
更にエラーが出ている場合は引き続きログの確認を繰り返す。
---以下発生したエラーとその対応について記載---
Error: Fetch of persistent statistics requested for table "example_db"."example_table" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.
このエラーは恐らく、以前にMySQLを立ち上げて、DBを作成したことがある場合に起こっている。
今回の場合、"example_db"というDBを作成したことがある、ということになる。
それで、DBを作成するとDB名のディレクトリがMySQLのディレクトリ内にできて、それが悪さをしているらしい。
該当箇所を探す
[XX:XX:XX][root@test-web ~]# find / -name 'example_db*'
/var/lib/mysql/mysql/example_db
[XX:XX:XX][root@test-web ~]#
問題が無ければ消す。問題があればバックアップを取っておく。
(自分の場合は「またDB作り直せばいいやー」ということで消してしまったので、バックアップを取っておいたところでどうやってDBを復元するかは不明だったり...)
どのみちMySQLのディレクトリ内にrenameをした状態で残してもエラーが出たので、一旦別の場所に置いてから以下コマンドで削除を行う。
[XX:XX:XX][root@test-web ~]# rm -f /var/lib/mysql/mysql/example_db
[XX:XX:XX][root@test-web ~]#
[ERROR] InnoDB: space header page consists of zero bytes in data file ./ibdataX もしくは [ERROR] InnoDB: Cannot create ./ib_logfileXXX
このエラーは既にibdataXやib_logfileXXXが存在している時に発生する。
ディレクトリの場所を探す
ibdataXの場合
[XX:XX:XX][root@test-web ~]# find / -name 'ibdataX*'
/var/lib/mysql/ibdataX
[XX:XX:XX][root@test-web ~]#
削除
そのまま削除で問題は無いけど、心配な場合はバックアップを取っておく。
[XX:XX:XX][root@test-web ~]# rm -f /var/lib/mysql/ibdataX -r
[XX:XX:XX][root@test-web ~]#