MySQL が再起動しない場合の対応

環境

  • CentOS7
  • MySQL は 5.x で起きたことなどがほとんどなので最近バージョンでは未確認

MySQL が動いていない

ログインしてみる

$ mysql -u root -p

Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
が出たら単純に起動してみると動くかもしれない。

起動してみる

$ systemctl start mysqld.service

MySQL が起動しない or MySQL が起動しているのにエラーが出る

明らかにヤバそうな雰囲気がした時はログを見るのが一番良い。

エラーログを見る

起動しない原因は多々あるのでこの記事では全て対応できないです。
エラーログを見てネットで調べて解決してくださいごめんなさい。
ちゃんとバックアップをとっているのであれば正直 MySQL を入れ直したほうが早いです。

$ cat /var/log/mysqld.log
  • InnoDB: Cannot allocate memory for the buffer pool
    • メモリ不足
      • 暴走してるプログラムがあるかも。該当プログラムを kill してメモリを確保する。
      • メモリを増やす。仕事で使っているサーバーであれば管理者に要確認
  • InnoDB: Database was not shut down normally
    • MySQL が正常にシャットダウンできなかった
      • エラーログを注意深くみる
  • InnoDB: Starting crash recovery
    • InnoDB が破損した
      • バックアップがあって色々めんどくさい時は MySQL を入れ直すか、ログインできるようであれば phpMyAdmin のようなツールで壊れてる DB を削除してデータを入れ直せば動いたりする。

InnoDB が破損している

# MySQL を停止する
$ systemctl stop mysqld.service


# mysql ファイルのバックアップをとる
$ cp -ar /var/lib/mysql /var/lib/mysql_temp


# my.cnf に強制リカバリーの項目を追加
$ vi /etc/my.cnf

[mysqld]
innodb_force_recovery = 1 から 3 までの値
# 起動しない場合は下記も追加
innodb_purge_threads=0


# MySQL を起動
$ systemctl start mysqld.service


# DB のバックアップをとる
$ mysqldump -u root -p -x --all-databases > db_backup.dump


# MySQL を停止
$ systemctl stop mysqld.service


# mysql ファイルを削除する
$ rm -rf /var/lib/mysql/*


# my.cnf で追加した項目を削除
$ vi /etc/my.cnf

innodb_force_recovery を削除


# MySQL を起動
$ systemctl start mysqld.service


# DB を入れ直す
$ mysql -u root -p < db_backup.dump