クラウド使うまでもない程度のDBはファイルをローカルで永続化して、コンテナとして立ち上げているのですがrootのパスワードを完全に忘れてしまった時の復旧方法です。
※ちなみに無停止では出来ないです。すごく頑張っても2分くらいとまります。
MySQLを権限テーブル非参照で再立ち上げ
DockerのMySQL公式イメージをそのまま利用しているのが前提です。例としてdocker-compose
の設定ファイルで説明しますが、Swarm
でもK8S
でも基本は一緒です。
元のdocker-compose.yml
はこんな程度かと思います。永続化のvolumeマウントがあって、imageの指定があります。それ以外はデフォルトのまま。
1 | version: '2' |
パスワードをリセットするためには、mysqlのコンテナ起動時に権限テーブルの参照を無視してもらう必要があります。docker-compose.yml
への変更は下記のような感じになります。
1 | version: '2' |
3306
番ポートを外部公開していない場合は、--skip-networking
の指定が無くても問題ないとは思いますが、念の為ローカルホスト以外からの接続を禁止します。
docker-composeはstop&startだと変更が反映されないので、停止したあとはupし直す必要があります。
1 | $ docker-compose stop mysql |
rootパスワードのリセット
残りの手順は、Ubuntuのドキュメントに分かりやすいものがあったので紹介しておきます。
https://help.ubuntu.com/community/MysqlPasswordReset
注意点としては、ユーザ名とホスト名の組み合わせです。ホスト名がlocalhostなのか%
なのか、事前に以下のようなSQLを叩いて、rootユーザの接続元ホストを確認しておくと確実です。
1 | mysql > use mysql; |
パスワードを設定しなおしたら、commandオプションの設定を削除して、MySQLコンテナを起動しなおせば完了です。基本的にサーバー上で起動しているMySQLのパスワードリセットとやることは変わりませんが、起動オプションをコンテナの設定ファイル経由で使うというのがポイントです。