mysql をリセットする
apt でインストールしたmysql のデータを全消しして、初期化し直す。
mysql を消したくなるとき。
何らかの作業をしていて、いったんmysql をサクッと削除して作り直したい時がある。
しかし、apt はしたくない。
sudo apt purge mysql.server sudo apt purge mysql
コンテナを使っていると、消去して再インストールしたいが、aptからやり直すと不便。たとえば、次のようなとき。
docker でボリュームを設定したとき
たとえば、docker ubuntu に mysql を apt インストールしたものを ボリュームで外部と共有するとき。
VOLUME ['/var/lib/mysql']
このとき、docker run -v ./mysql:/var/lib/mysql
などととやると、MySQLの初期データが完全に消えて起動しなくなる。
ubuntu をそのままに、mysql を消したいとき
apt で再インストールすればいいのだろうが。バージョンはそのままで管理ファイルをまっさらにしたいとき。 インストールスクリプトを作っているときなど
ネット接続無しで初期化したい。
パスワードがわからないので初期化したい。でもインターネットに接続できない(接続設定してない)のでapt で再インストール出来ない
apt remove / apt install は事情により出来ない。このときにmysqlのデータフォルダだけを再初期化してrootパスワードを再発行できる。
mysql を初期化する、
次のコマンドを使えば、インストールされているMySQLはそのままに、データの格納ディレクトリを再初期化できる。
mysqld --initialize
mysql を /var/lib/mysqlに入れた場合は、次のコマンドで再初期化ができる。
sudo systemctl stop mysql sudo rm -rf /var/lib/mysql/* sudo mysqld --initialize sudo systemctl start mysql
この手順は、apt install mysql
されたものをデータベースの保存ディレクトリだけを初期化し直すに使える。
初期化後の作業:パスワード再設定。
初期化コマンド mysqld --initialize
は、root@localhost の mysql パスワードも初期化されているので、パスワードを再設定する。
先程の初期化コマンド mysqld --initialize
実行後に、ランダムなパスワードで初期化されている。ランダムパスワードが生成されているんで注意する。
初期化後の初回パスワードの確認
初期化パスワードを確認する。ログに書かれている。
# cat /var/log/mysql/error.log | grep -i pass
実際にやった例
root@1626170b71af:/# cat /var/log/mysql/error.log | grep -i pass 2021-06-22T08:34:32.575385Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. 2021-06-22T08:34:40.773077Z 0 [Note] Shutting down plugin 'sha256_password' 2021-06-22T08:34:40.773089Z 0 [Note] Shutting down plugin 'mysql_native_password' 2021-06-22T08:34:43.290236Z 0 [Note] Shutting down plugin 'sha256_password' 2021-06-22T08:34:43.290244Z 0 [Note] Shutting down plugin 'mysql_native_password' 2021-07-12T08:39:58.067661Z 1 [Note] A temporary password is generated for root@localhost: mGUTPx0fyXSx
パスワードを再設定
初期パスワードはそのままでは使えません。
実行時に You must reset your password と言われて怒られます。
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
実際に怒られている例。
root@1626170b71af:/# mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.34-0ubuntu0.18.04.1 Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mysql; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
パスワード再設定
rootユーザーでログインしたあと
mysql -p
パスワードを再設定のALTER TABLEを発行する。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MYSQL_ROOT_PASSWORD'; flush privileges;
password を指定するときは、identified by 'XXX' で指定。その後、権限を反映する。
まとめ
- MySQLのデータフォルダ削除
rm /var/lib/mysql
- 初期化コマンド
mysqld --initialize
- 生成パスワード確認
cat /var/log/mysql/error.log | grep -i pass
- 初期パスワード変更 ` ALTER USER 'root'@'localhost' IDENTIFIED BY 'MYSQL_ROOT_PASSWORD'| mysql -p '
これで、いつでもMySQLを初期化してサクッとつくって使い潰せる。
docker-compose で mysql だけのインスタンスを立ち上げなくても、全部入りdocker を作って開発環境を無精できる。
追記
- 2022/03/18
参考資料
https://stackoverflow.com/questions/8911115/how-to-recover-recreate-mysqls-default-mysql-database https://serverok.in/you-must-reset-your-password-using-alter-user