コピペコードで快適生活

明日使えるソースを自分のために

MySQLリストアした後にログインできない

症状

  • リストアしたDBに、一部のユーザでMySQLにログインできない

原因

  • mysql.userテーブルを直接更新した場合、権限設定が自動で再ロードされないため。

対応方法

  • mysqldをrestartするか、
  • mysql> FLUSH PRIVILEGES; すればOK。

経緯

移行元

# 移行元からダンプファイル取得
# mysqlのシステムDBも含める
mysqldump -u$user -p$pw --opt --all-database > dump.sql

移行先

# 移行先にダンプファイルをリストア
# mysqlシステムDBもまとめて上書き
mysql -u$user -p$pw -h localhost < dump.sql

# 移行元にあったMySQLユーザでログインをためす
# でもログインできない
mysql -u app_user -h localhost -p
Enter password:
ERROR 1130 (HY000): Host 'xx.xx.xx..xx' is not allowed to connect to this MySQL server

# rootではログインできた
mysql -u root -h localhost -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

# user情報を確認するが、移行元の情報と全く同じ
mysql> SELECT * FROM mysql.user WHERE User = 'app_user';

# 権限を確認するが、なぜか外れている
mysql> SHOW GRANTS FOR 'app_user'@'localhost'\G
ERROR 1141 (42000): There is no such grant defined for user 'ap_user' on host 'localhost'

# 権限反映
# https://dba.stackexchange.com/questions/32967/cant-show-grants-after-mysql-re-install
mysql> FLUSH PRIVILEGES;

# 権限が取得できるようになった
mysql> SHOW GRANTS FOR 'app_user'@'localhost'\G
*************************** 1. row ***************************
Grants for app_user@localhost: GRANT ALL PRIVILEGES ON *.* TO app_user@localhost IDENTIFIED BY PASSWORD 'xxxxxx'
1 row in set (0.00 sec)

mysql> quit

# ログインできた
mysql -u app_user -h localhost -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.