MySQLトラブル発生時に使えるコマンド集まとめ【ローカル開発用】
これはなに
- macOS(Homebrewインストール) 上で MySQL を使っていたら色々トラブった
- データディレクトリを初期化したり、認証をスキップして root のパスワードをリセットする必要があった
- 勉強用にサイト構築を利用したコマンドをまとめた
注意
今回ご紹介したコマンドはあくまで 「ローカルの開発環境で緊急対応したときの」 ものです
実務では、MySQL のバージョンや OS によって若干コマンドが変わることもあるので注意してください
環境
- maxOS M1
- Homebrew
- bash
1. MySQL の起動・停止
起動:
brew services start mysql
Homebrew のサービスとして MySQL をバックグラウンド起動
「Successfully started mysql」等が表示されればOK
停止:
brew services stop mysql
MySQL を停止するコマンド
2. プロセスの確認・強制終了
プロセス一覧(確認)
ps aux | grep mysqld
現在動いている mysqld(MySQLサーバー)のプロセスを探せる
出力例:
username 12345 0.3 0.2 ... mysqld --skip-grant-tables ...
username1 67890 0.0 0.0 ... grep mysqld
前者の「12345」みたいな番号が PID(プロセスID)
強制終了
kill -9 12345
「kill -9」で 強制終了
構文は、kill -9 <PID>
Ctrl+C で止まらないときなどに使う
3. データディレクトリ削除・バックアップ
データディレクトリを完全削除
rm -rf /usr/local/var/mysql
MySQL のデータをすべて初期化 したい場合に使う
設定ファイル・認証情報・すべてのDBが消えるので要注意
バックアップしてから消す
mv /usr/local/var/mysql /usr/local/var/mysql_backup_$(date +%Y%m%d%H%M)
データを バックアップ しておきたいならこちらを使う
日付付きでリネームすると管理しやすい
4. ソケットファイルの場所を探す
lsof -U | grep mysql
Unixソケット を開いている MySQL プロセスがわかる
出力例:
mysqld 12345 username 20u unix /tmp/mysql.sock
→ /tmp/mysql.sock のファイルを使っていることがわかる。
Rails の database.yml にこのソケットパスを合わせないとエラーになる場合がある
5. 認証をスキップして root パスワードを再設定
5.1 認証スキップ起動
mysqld --skip-grant-tables --socket=/tmp/mysql.sock
別ターミナルを開いて コマンドを実行し続ける形
このモードだと パスワード認証を無視 して MySQL にログインできる。
5.2 別ターミナルで root ログイン
mysql -u root --socket=/tmp/mysql.sock
-p なしで入れるので、「パスワード忘れた!」ときに助かる。
5.3 パスワード再設定
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
FLUSH PRIVILEGES; を入れて権限情報をリロード。
FLUSH PRIVILEGES; を使わないと反映されないことがあるっぽい
ALTER USER で root ユーザーのパスワードを変えられる。
5.4 通常ログインで確認
一度 mysqld --skip-grant-tables を kill -9 で停止してから、改めて
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