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 が起動しているのにエラーが出る

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

エラーログを見る

$ 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