mysqlで適切な権限があるにも関わらずgrant文でエラーが出た場合の対処法

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

エラー内容

mysql> grant all on *.* to ...
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

調査した事

mysql.user テーブルは問題なさそう
userテーブルが何らかの原因で空になってしまい、rootユーザが消えてしまった場合は
rootユーザ追加で対処できますが、今回はこのパターンではなさそうです。

mysql> select user,host, password from mysql.user
+---------+-----------+-----------+
| user    | host      | password  |
+---------+-----------+-----------+
| root    | localhost | *XXX1     |
| root    | 127.0.0.1 | *XXX2     |
| zabbix  | localhost | *XXX3     |
+---------+-----------+-----------+

Superユーザ権限もありました。

mysql> show grants
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, 
INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, 
REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER 
ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*XXXX' WITH GRANT OPTION

解決策

mysql のversionをよく見てみたところ
5.1を利用していたはずが、いつの間にか5.5になっていました。
開発用途サーバのため他パッケージのVerUpに釣られてUpgradeされてしまっていたようです。
/var/log/yum.log に updateされた事がロギングされていました。

非常に分かりづらいエラーでしたが、テーブル構成が古いバージョンのままでは
ユーザ作成が出来ない事象に当ってしまっていたようでした。

mysql_upgradeの実行

# mysql_upgrade -u root -p
Enter password:
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
Running 'mysqlcheck with default connection arguments
Running 'mysqlcheck with default connection arguments
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
...

mysql.user テーブルのカラムBefore/After

Before

mysql> select * from mysql.user where User='root' \G
*************************** 1. row ***************************
                 Host: localhost
                 User: root
             Password: *XXXX
          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
             ssl_type:
           ssl_cipher:
          x509_issuer:
         x509_subject:
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0

After

mysql> select * from mysql.user where User='root' \G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: *XXXX
           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
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin:
 authentication_string: NULL

結果

正常にユーザ追加できました

mysql> grant all on *.* to ...
Query OK, 0 rows affected (0.00 sec)

投稿者プロフィール

takashi
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。
個人ブログではRaspberryPiを利用したシステムやロボット作成も
実施しております。

スカイアーチネットワークスで一緒に働きましょう!

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。 個人ブログではRaspberryPiを利用したシステムやロボット作成も 実施しております。 スカイアーチネットワークスで一緒に働きましょう!