dockerコンテナで立ち上げたMySQLのrootパスワードをリセットする

2019-09-12
Docker
MySQL

クラウド使うまでもない程度のDBはファイルをローカルで永続化して、コンテナとして立ち上げているのですがrootのパスワードを完全に忘れてしまった時の復旧方法です。

※ちなみに無停止では出来ないです。すごく頑張っても2分くらいとまります。

MySQLを権限テーブル非参照で再立ち上げ

DockerのMySQL公式イメージをそのまま利用しているのが前提です。例としてdocker-composeの設定ファイルで説明しますが、SwarmでもK8Sでも基本は一緒です。

元のdocker-compose.ymlはこんな程度かと思います。永続化のvolumeマウントがあって、imageの指定があります。それ以外はデフォルトのまま。

1
2
3
4
5
6
version: '2'
services:
mysql:
image: mysql:5.7.27
volumes:
- ./data/mysql:/var/lib/mysql

パスワードをリセットするためには、mysqlのコンテナ起動時に権限テーブルの参照を無視してもらう必要があります。docker-compose.ymlへの変更は下記のような感じになります。

1
2
3
4
5
6
7
version: '2'
services:
mysql:
image: mysql:5.7.27
command: mysqld --skip-grant-tables --skip-networking
volumes:
- ./data/mysql:/var/lib/mysql

3306番ポートを外部公開していない場合は、--skip-networkingの指定が無くても問題ないとは思いますが、念の為ローカルホスト以外からの接続を禁止します。

docker-composeはstop&startだと変更が反映されないので、停止したあとはupし直す必要があります。

1
2
$ docker-compose stop mysql
$ docker-compose up -d mysql

rootパスワードのリセット

残りの手順は、Ubuntuのドキュメントに分かりやすいものがあったので紹介しておきます。

https://help.ubuntu.com/community/MysqlPasswordReset

注意点としては、ユーザ名とホスト名の組み合わせです。ホスト名がlocalhostなのか%なのか、事前に以下のようなSQLを叩いて、rootユーザの接続元ホストを確認しておくと確実です。

1
2
mysql > use mysql;
mysql > SELECT user, host FROM user;

パスワードを設定しなおしたら、commandオプションの設定を削除して、MySQLコンテナを起動しなおせば完了です。基本的にサーバー上で起動しているMySQLのパスワードリセットとやることは変わりませんが、起動オプションをコンテナの設定ファイル経由で使うというのがポイントです。