Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQLのrootアカウントが消えてしまった!!そんなときの復旧手順

f:id:hit10231023:20160523181920j:plain

何が起きたのかさっぱりわからないのですが、MySQL(MariaDBのパスワードがrootから何から消えてしまった。。 なぜ消えたのかは置いておいて、とりあえず、現状復帰しないことには、だーれも接続できない状態が続いてしまう・・これはまずい。

そんな場合のrootが消えた、もしくはrootのパスワードを忘れた場合の --skip-grant-tableオプションを利用した復帰方法をまとめました。mysqlとかmariadbのrootのパスワードを忘れたという対応事例は探すとあるのですが、 アカウントが丸ごと変わってしまったといい事例はあまりないのでメモ代わりに残しておきます。ちなみに今回、MariaDBでの話ですが、対応方法は、MySQLも同じかと思いますので、流用できるかと思います。

以下、復旧手順になります

アカウント復帰までの道のり

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

ユーザーに特権を付与します。長いので、こちらを参照ください

mariadb.com

以上、こちらの環境では、この作業で無事、ログインできるようになりました。それにしてもなんでアカウントが全部消えたんだろう・・・