Posted at

MySQL5.6が起動しない時

More than 3 years have passed since last update.

yumでMySQL5.6を入れて早速動かしてみたら早速[FAILED]という文字列に出くわす。


MySQLの起動

[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'を見てみることにする。


/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に以下の設定を加えると解決できる。


my.cnf

[mysqld]

explicit_defaults_for_timestamp = 1


⚠注意

くれぐれも[mysqld]の下に記述すること。

なんとなく末尾に追記〜なんてやっていると[mysqld_safe]の下に書いてしまっていて一向に動かないなんてことがある。


MySQLの再起動


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 ~]#