MySQLが起動しない際の対処法一覧

  •  
 
トビウオ2018年7月26日 - 17:13 に投稿

タグ

概要

 エラーが起きるたびにググりまくるのがいい加減嫌になったのでまとめました。
 急いでいる時はDocker公式のMySQLイメージを使えばいいと思います。
(Dockerの公式MySQLイメージの使い方を徹底的に解説するよ)

共通事項

  • サーバーの起動コマンドはmysql.server startだが、sodoが必要な場合も多い
  • クライアントの起動コマンドはmysql -u {ユーザー名} -p {パスワード} -h {ホスト名}
    • 端折ってmysql -urootmysql -uroot -pとだけ書く場合もままある
  • Homebrewでインストールするコマンドはbrew install mysql、アンインストールするコマンドはbrew uninstall mysql。サービスとして登録するにはbrew services start mysqlで、サービスを停止するにはbrew services stop mysql
  • 現在のHomebrewだとデフォルトのMySQLがVer.8系なので、brew install mysql@5.7など意図的に古いものを導入する場合もある(例:Drupal8がVer.5.7を要求)
  • 設定ファイルは/usr/local/etc/my.cnfなど
  • エラーログは/usr/local/var/mysql/{ユーザー名}.local.errに保存されているので、tail -f /usr/local/var/mysql/ipridenoSakami.local.errなどとして確認する
  • なお、sudo chown -R _mysql:_mysql /usr/local/var/mysql/はネット情報を見る限り(近頃は)無駄に終わることが多い模様
    • そもそも「所有者をmysqlにしろ」と「所有者をユーザー名にしろ」といった意見が .err/.pid/mysqlフォルダ/tmpフォルダについてネット上で両方混在する時点でおかしい……

「ERROR! The server quit without updating PID file (/usr/local/var/mysql/{ユーザー名}.local.pid).」

  • 直訳すると「PIDファイル(/usr/local/var/mysql/{ユーザー名}.local.pid)を更新せずにこのサーバーが終了した」といった意味。mysql.server startする際に起きがちなエラー
  • ERROR 2002のと違い、公式マニュアルに対処法が載っていないので地道に原因を探す必要がある
  • ls -l /usr/local/var/mysql/{ユーザー名}.local.pidで当該ファイルの所有権を確認できる。ここで見つからない際は、sudo touch /usr/local/var/mysql/{ユーザー名}.local.pidと作ってしまう対策もある
  • 余計なMySQLスレッドが悪さをしている場合もあるので、ps -ef | grep mysqlなどとして確認後にkillする対策もある

「ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)」

  • 直訳すると「/tmp/mysql.sockソケットを通じてローカルのMySQLサーバーに接続できませんでした」といった意味。mysql -uroot等としてMySQLにアクセスしようとすると起きがちなエラー
  • 末尾が(38)になっている場合もある。「/tmp/mysql.sockソケットファイルが存在するが、MySQLサーバーが起動していない際にmysqlコマンドでアクセスを試みた際に(38)が出る」が通説だが詳細は不明
  • リファレンスマニュアルによると、UNIX上のMySQLクライアントは、mysqldサーバーに2つの方法で接続できる
    • UNIXソケットファイル(デフォルトは/tmp/mysql.sock。サーバー起動時に--socket={ソケットファイルのパス}とすれば指定可能)を通じて接続
    • TCP/IPでポート番号を通じて接続
  • ソケット方式はTCP/IP方式より高速だが、同一コンピュター上にあるサーバー相手にしか使えない。また、Windowsはソケット方式が使えない
  • このエラーが出る原因としては、次の2通りが考えられる
    • サーバーが実行されていない場合:
    • UNIX系ならps xa | grep mysqldで起動しているかを確認する
    • 起動していない場合はmysql.server startで起動する
    • Windows系の場合、OSが許容するエフェメラルポートの設定を増やす必要がある場合がある。詳しくはリファレンスページの対処法を参照
    • ソケット方式 or TCP/IP方式で接続できなかった場合:
    • ソケット形式なら、
      • ソケットファイルのアクセス権限がクライアントにあるか確認する。無い場合は適切なパーミッションを設定するか、/tmp/mysql.sockではない別の位置にソケットファイルを作成する……とリファレンスにはあるが、ネット情報を見る限りではソケットファイルのパーミッションを弄っても効果がない場合が多い
      • 例えば/tmp/mysql.sockなら/tmpの所有権をmysql:mysqlに変更すると効くことがある
      • ソケットファイルが存在しない場合、sudo touch /tmp/mysql.sockなどとして作成してしまう手もある
      • また、mysql.sock削除後にmysqld_safeを起動するとmysql.sockが再作成されて直ることもある
      • デフォルトで参照するソケットファイルの位置はmysql_config --socketとすれば確認できるが、それをmy.cnfを編集するなどして変更する手もある。なお、my.cnfは複数存在するのでmysql --help | grep my.cnfとして位置を確認すること
      • なぜかソケットファイルにロックが設定され、/tmp/mysql.sock.lockといったファイルが出来てしまっていることがある。その場合はmysql.sock.lockファイルを消す
    • TCP/IP形式なら、外部からの接続を遮断していないかを確認する
      • サーバー起動時に--skip-networkingを設定するとTCP/IP方式が使えない
      • サーバー起動時に--bind-address=127.0.0.1を設定するとlocalhost以外接続できない
      • ファイアウォールがアクセスをブロックしている可能性がある
      • そのサーバーがそのマシン上で実行されていない可能性がある
      • そのサーバー上のSELinuxによってmysqldプロセスが保護されている場合は無効化する
    • 1つのMySQLサーバーのスレッドが停止した場合、再起動する前に他のmysqldスレッドを強制終了する必要がある。ワンライナーで殺す場合は次のようにする
kill `ps -ef | grep mysql | awk '{print $2;}'`

それでも駄目な時は

  • 徹底的にアンインストールする処方箋:
    • sudo rm -rf /usr/local/var/mysql
    • brew uninstall mysql --force
    • brew cleanup
  • 入念にパスを通す
    • brew link mysql@5.7 --force
  • 上記2つはこのページを参考にした

参考記事一覧

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。