MySQLのrootアカウントが消えてしまった!!そんなときの復旧手順
何が起きたのかさっぱりわからないのですが、MySQL(MariaDBのパスワードがrootから何から消えてしまった。。 なぜ消えたのかは置いておいて、とりあえず、現状復帰しないことには、だーれも接続できない状態が続いてしまう・・これはまずい。
そんな場合のrootが消えた、もしくはrootのパスワードを忘れた場合の --skip-grant-tableオプションを利用した復帰方法をまとめました。mysqlとかmariadbのrootのパスワードを忘れたという対応事例は探すとあるのですが、 アカウントが丸ごと変わってしまったといい事例はあまりないのでメモ代わりに残しておきます。ちなみに今回、MariaDBでの話ですが、対応方法は、MySQLも同じかと思いますので、流用できるかと思います。
ASUS ノートパソコン Chromebook Flip C100PA-RK3288 タッチパネル/10.1インチ/シルバー
- 出版社/メーカー: Asustek
- 発売日: 2015/10/03
- メディア: Personal Computers
- この商品を含むブログを見る
以下、復旧手順になります
アカウント復帰までの道のり
MariaDBを停止する
とりあえず、今のままですと、どうしようもないので、MariaDBを停止します。(MariaDB無停止でこの対応はできません)
/etc/init.d/mysql stop
MariaDBを--skip-grant-tablesオプションで起動
このオプションを利用すると、rootのパスワードを求められず起動することができます。Windowsや、Linuxのセーフモードみたいなものだと思ってきださい。
/usr/bin/mysqld_safe --skip-grant-tables
MariaDBのコンソールにログインする
skip-grant-tablesモードで起動した場合のrootのパスワードは必要ありません
mysql -uroot
消えたアカウントをつくる!!!
MariaDBのコンソール上で以下のSQLを実行します。mysqlのユーザー情報は、mysqlスキーマのuserテーブルで管理しております
mysql> USE mysql ; INSERT INTO user (user, host, password) values('root', 'localhost', PASSWORD('yourpassword')); UPDATE USER SET Select_priv= 'Y', Insert_priv= 'Y', Update_priv= 'Y', Delete_priv= 'Y', Create_priv= 'Y', Drop_priv= 'Y', Reload_priv= 'Y', Shutdown_priv= 'Y', Process_priv= 'Y', File_priv= 'Y', Grant_priv= 'Y', References_priv= 'Y', Index_priv= 'Y', Alter_priv= 'Y', Show_db_priv= 'Y', Super_priv= 'Y', Create_tmp_table_priv= 'Y', Lock_tables_priv= 'Y', Execute_priv= 'Y', Repl_slave_priv= 'Y', Repl_client_priv= 'Y', Create_view_priv= 'Y', Show_view_priv= 'Y', Create_routine_priv= 'Y', Alter_routine_priv= 'Y', Create_user_priv= 'Y', Event_priv= 'Y', Trigger_priv= 'Y', Create_tablespace_priv= 'Y' WHERE User='root'; FLUSH PRIVILEGES; exit ;
MariaDBの停止
上記にてアカウントが追加されましたら、いったんMariaDBを再起動します
pkill mysqld
MariaDBの開始
今回は、通常通り起動します
/etc/init.d/mysql start
MariaDBへ接続
MariaDBが無事起動できましたら、先ほど設定したパスワードでログインできるか確認してみましょう
mysql -uroot -pyourpassword
その他アカウントの設定
上記にて、正常に接続できましたら、その他アカウントの設定を行います。その他のアカウントは、利用環境によってまちまちだと思います、なので、このままやっても意味ないよってことだけ御理解いただければと・・ アカウントを作成できる(grantオプション付きのユーザー)rootでログインできたので、後は、rootアカウントで、通常通りアカウントを作り直しましょうねってだけです
mysql> GRANT ALL PRIVILEGES ON *.* to admin@'%' IDENTIFIED BY 'yourpassword'; GRANT SELECT,INSERT,UPDATE,DELETE,FILE,EXECUTE,SHOW DATABASES,SHOW VIEW,CREATE TEMPORARY TABLES on *.* to develop@'%' IDENTIFIED BY 'yourpassword'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,FILE,ALTER,EXECUTE,SHOW DATABASES,SHOW VIEW,CREATE TEMPORARY TABLES,CREATE on *.* to production@'%' IDENTIFIED BY 'yourpassword'; EXIT ;
その他
今回の話とはまったく関係ないのですが、ユーザー周りのコマンドは以下のようなものがあります
- パスワードの変更
mysql> SET PASSWORD FOR admin = PASSWORD('new_passwd') ; SET PASSWORD FOR develop = PASSWORD('new_passwd') ; SET PASSWORD FOR production = PASSWORD('new_passwd') ;
- ユーザーの作成
mysql> CREATE USER admin IDENTIFIED BY [PASSWORD] 'password1', develop IDENTIFIED BY [PASSWORD] 'password2', production IDENTIFIED BY [PASSWORD] 'password3' ;
- ユーザーの削除
mysql> DROP USER admin,develop,product
- ユーザー名の変更
mysql> RENAME USER admin TO new_admin, develop TO new_develop, production TO new_production ;
- GRANT
ユーザーに特権を付与します。長いので、こちらを参照ください
以上、こちらの環境では、この作業で無事、ログインできるようになりました。それにしてもなんでアカウントが全部消えたんだろう・・・