🔖

MySQLトラブル発生時に使えるコマンド集まとめ【ローカル開発用】

に公開

これはなに

  • macOS(Homebrewインストール) 上で MySQL を使っていたら色々トラブった
  • データディレクトリを初期化したり、認証をスキップして root のパスワードをリセットする必要があった
  • 勉強用にサイト構築を利用したコマンドをまとめた

注意

今回ご紹介したコマンドはあくまで 「ローカルの開発環境で緊急対応したときの」 ものです
実務では、MySQL のバージョンや OS によって若干コマンドが変わることもあるので注意してください

環境

  • maxOS M1
  • Homebrew
  • bash

1. MySQL の起動・停止

起動:

(bash)
brew services start mysql

Homebrew のサービスとして MySQL をバックグラウンド起動
「Successfully started mysql」等が表示されればOK

停止:

(bash)
brew services stop mysql

MySQL を停止するコマンド

2. プロセスの確認・強制終了

プロセス一覧(確認)

(bash)
ps aux | grep mysqld

現在動いている mysqld(MySQLサーバー)のプロセスを探せる

出力例:

(bash)
username    12345   0.3  0.2  ... mysqld --skip-grant-tables ...
username1    67890   0.0  0.0  ... grep mysqld

前者の「12345」みたいな番号が PID(プロセスID)

強制終了

(bash)
kill -9 12345

「kill -9」で 強制終了
構文は、kill -9 <PID>

Ctrl+C で止まらないときなどに使う

3. データディレクトリ削除・バックアップ

データディレクトリを完全削除

(bash)
rm -rf /usr/local/var/mysql

MySQL のデータをすべて初期化 したい場合に使う
設定ファイル・認証情報・すべてのDBが消えるので要注意

バックアップしてから消す

(bash)
mv /usr/local/var/mysql /usr/local/var/mysql_backup_$(date +%Y%m%d%H%M)

データを バックアップ しておきたいならこちらを使う
日付付きでリネームすると管理しやすい

4. ソケットファイルの場所を探す

(bash)
lsof -U | grep mysql

Unixソケット を開いている MySQL プロセスがわかる

出力例:

(bash)
mysqld  12345 username  20u  unix /tmp/mysql.sock

→ /tmp/mysql.sock のファイルを使っていることがわかる。
Rails の database.yml にこのソケットパスを合わせないとエラーになる場合がある

5. 認証をスキップして root パスワードを再設定

5.1 認証スキップ起動

(bash)
mysqld --skip-grant-tables --socket=/tmp/mysql.sock

別ターミナルを開いて コマンドを実行し続ける形
このモードだと パスワード認証を無視 して MySQL にログインできる。

5.2 別ターミナルで root ログイン

(bash)
mysql -u root --socket=/tmp/mysql.sock

-p なしで入れるので、「パスワード忘れた!」ときに助かる。

5.3 パスワード再設定

sql
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';

FLUSH PRIVILEGES; を入れて権限情報をリロード。
FLUSH PRIVILEGES; を使わないと反映されないことがあるっぽい
ALTER USER で root ユーザーのパスワードを変えられる。

5.4 通常ログインで確認

一度 mysqld --skip-grant-tables を kill -9 で停止してから、改めて

(bash)
brew services start mysql
mysql -u root -p --socket=/tmp/mysql.sock

これで新しいパスワードで入れるか確認

6. まとめ・注意点

  • コマンドは慎重に
    • rm -rf はもちろん、 kill -9 も使い方を誤ると不整合が起きるリスクあり
  • 本番環境では絶対にやらない
    • --skip-grant-tables モードはセキュリティ上危険なので、緊急時以外は使わない
  • パスワードやソケット位置を整える
    • Rails の database.yml と MySQL のソケットパスがズレていると Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) が出る。

今回ご紹介したコマンドはあくまで 「ローカルの開発環境で緊急対応したときの」 ものです
実務では、MySQL のバージョンや OS によって若干コマンドが変わることもあるので注意してください

Discussion