web-dev-qa-db-ja.com

特権を付与しようとしているときに、ユーザー 'root' @ 'localhost'のアクセスが拒否されました。特権を付与するにはどうすればいいですか?

私はいくつかの似たような質問を見たので、私は基本をチェックしたことを示しています。もちろん、それは私が全く明白なことを見逃していないという意味ではありません。 :-)

私の質問は、「自分がやろうとしていることをする権限を持つユーザーのアクセスを拒否したのはなぜですか。また、既にパスワードを入力してアクセスを許可されているのはなぜですか? (完全を期すために、MySQLクライアントがプログラム起動時にアクセスを拒否するようにするために、間違ったパスワードを入力してみました。)

バックグラウンド:

Ssh経由でMySQLサーバを実行しているマシンのシェルにログインし、rootとしてログインします。

[myname@Host ~]$ mysql -u root -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

驚くばかり。私が似たような質問に対する答えを読んだことは、私が特権が助成金テーブルにあるものと最新であることを確かめるべきであることを示唆します

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> 

次に、自分が自分だと思っている人であることを確認します。

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

...そして本当に 本当に

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> 

ここまでは順調ですね。今、私はどんな特権を持っていますか?

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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 '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

これは少し読みにくいので、この方法を試してみましょう(非ローカルホストの「root」ユーザーがいることもわかります)。

mysql> SELECT * FROM mysql.user WHERE User='root'\G
*************************** 1. row ***************************
                 Host: localhost
                 User: root
             Password: *[OBSCURED]
          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
*************************** 2. row ***************************
                 Host: [HOSTNAME].com
                 User: root
             Password: *[OBSCURED]
          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
 2 rows in set (0.00 sec)

驚くばかり! MySQLは、私はroot @ localhostであり、root @ localhostはこれらすべての特権を持っていると考えています。つまり、自分がやりたいことができるはずですよね。

mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

この基本的なことをどうやって失敗させたのでしょうか。

サイドノート:rootという名前のユーザーにすべての特権を与えているわけではないという提案をしたいという人にとっては、それは素晴らしいことで、他のユーザーに特権を与えてもらうことを検討します。

ありがとうございました!

155
Steven Scotten

の出力がどのようになっているかに注意してください。

SHOW GRANTS FOR 'root'@'localhost';

「ALL PRIVILEGES」とは言っていませんでしたが、root @ localhostが何を持っているのかを綴ってください。

GRANT ALL PRIVILEGESは失敗します、なぜならユーザーは自分が持っていないものを許可することができず、サーバーは何かがここにはないと考えているようです...

今、何が足りないのですか?

私のシステムでは、私はこれを得ます:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM mysql.user WHERE User='root' and Host='localhost'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: 
           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 <----------------------------- new column in 5.5
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: <------------------------------- new column in 5.5
 authentication_string: <------------------------------- new column in 5.5
1 row in set (0.00 sec)

Mysql.proxies_userなど、5.5には新しいテーブルもあります。それらがあることを確認してください。

まったく新しいmysqlサーバーインスタンスをインストールするとき、インストールスクリプトはすべてのmysql。*テーブルを適切な構造で作成します。

古いバージョンからアップグレードする場合は、適切なアップグレード手順(mysql_upgrade)が使用されていることを確認してください。これにより、不足しているテーブル/列が追加されます。

推測にすぎませんが、mysql_upgradeがこのインスタンスに対して実行されていないため、動作が見られます。

51
Marc Alff

MySQL 5.1からMySQL 5.5にアップグレードした後、私はこれと同じ問題を抱えていましたが、Windows上で。 hereherehere 、および here に記載されているパスワードの変更、作成、および再設定をすでに試してみました。私はまだ同じエラーが出ます:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

私は普通に接続でき、すべてのデータベースを表示し、選択して挿入し、ユーザーを作成して追加することができますが、GRANTに関して言えば、私は失敗しています。それらのアクセス拒否エラーが再び表示されます。

here に記載されているように、MySQLサーバーのbin /ディレクトリで次のコマンドを実行して特権を修正することで、この問題を解決することができました。

C:\MySQL Server 5.5\bin> mysql_upgrade

その後、問題は解決しました。通常、MySQLはLinuxとWindowsの両方で同じコマンドを提供するため、このソリューションがLinuxでも機能することを願います。

72
Aryo

これは、mysql.usersテーブルがroot以外のユーザーの制限を超えていると見なされるため、すべてのテーブルに対するすべての特権を別のユーザーに付与しようとしたときに発生する可能性があります。

しかし、以下はうまくいくはずです。

GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;

*。*の代わりに `%`。*を使用していることに注意してください。

53
Anuj Gupta

私がディストリビューションに同梱されているバージョンよりも新しいバージョンのMySQLをインストールしようとしたときに、これが起こりました。

私は古いバージョンを消してから新しいものをインストールしました(rpm -e ...それからrpm -i MySQL-server *)。 Marc Alffによる説明 - ありがとう!

Mysql_upgradeを実行することもできましたが、ゼロから始めたいので、次のようにしました。

# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start

それからrootパスワード(/ usr/bin/mysqladmin -u rootパスワード)を設定してください。そしてすべてGRANTコマンドで期待通りに動きました...

7
phil_w

私は同じ問題を抱えていた、すなわちすべての特権がrootに与えられた:

SHOW GRANTS FOR 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*[blabla]' WITH GRANT OPTION

...しかし、まだテーブルを作成することはできません:

 create table t3(id int, txt varchar(50), primary key(id));
ERROR 1142 (42000): CREATE command denied to user 'root'@'localhost' for table 't3'

まあ、それは迷惑なユーザーエラー、つまりデータベースを選択しなかったことが原因でした。 USE dbnameを発行した後 それはうまくいきました。

5
tzp

MySQLバージョン8をインストールして(私のように)この質問にきたかもしれませんが、満足のいく答えが見つかりません。バージョン8では、このようなユーザーを作成することはできません。

GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;

戻ってくるというやや紛らわしいエラーメッセージは次のとおりです。ERROR 1410 (42000): You are not allowed to create a user with GRANT

バージョン8でユーザーを作成するためには、2つのステップでそれをしなければなりません:

CREATE USER 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]';
GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' WITH GRANT OPTION;

もちろん、お望みなら、(GRANT ALL PRIVILEGESではなく)限られた数の特権を与えることもできます。 GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER

4
gloriphobia

基本的にこのエラーは、パスワードを指定していない場合に発生します。これは、誤ったパスワードがオプションファイルにリストされていることを意味します。

アカウントへのパスワードの割り当てと管理方法を理解するには、この _ doc _ を読んでください。

また、フォルダ/var/lib/mysql/mysqlに対する権限が711かどうかを確認してください。

4

MySQL 5.5.40を使用するDebian( Wheezy 、7.8)では、SELECT * FROM mysql.user WHERE User='root'\GEvent_privおよび 'Trigger_priv`フィールドを示していたpresentであるが not はYに設定されています。

mysql_upgradeを実行しても(--forceの有無にかかわらず)違いはありません。私はマニュアルをする必要がありました:

update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'

それから最後に私は使用することができます:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION

…そしてそれを個々のデータベース/ユーザーアカウントでより正確に使います。

4
William Turrell

SHOW GRANTS FOR 'root'@'localhost';とタイプするとパスワードがわかりにくくなるので、別のシステムでHeidiSQLを使用して(そのユーザー名と対応するパスワードとしてrootを使用して)そのシステムのmysqlにログインして入力しました。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

システムに戻ってログオンしたときにうまくいきました。
mysql -uroot -pthepassword;

3
Nav

Mysqlのバグ http://bugs.mysql.com/bug.php?id = 44898 (--single-transactionを追加するための回避策)であるperformance_schemaに特権を追加しようとしたときに実行しました。

2
pevik

私がやったようにまだこれにつまずいている人のために、試みたGRANTが既に存在していないことを確かめるためにチェックする価値があります:

SHOW GRANTS FOR username;

私の場合、エラーは実際にはパーミッションエラーがあったためではなく、GRANTが既に存在していたためです。

1
mopo922

私も同じ問題を抱えていたので、SOの投稿やGoogleのドキュメントを読むのに多くの時間がかかりました。 Cloud SQL FAQ :からこれを見つけました。

Google Cloud SQLはSUPER権限をサポートしていません。つまり、GRANT ALL PRIVILEGESステートメントは機能しません。代わりに、GRANT ALL ON `%`.*を使うことができます。

1
kurdtpage