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


166

同様の質問をいくつか見てきたので、基本を確認したことを示しています。もちろん、それは私が完全に明らかなものを見逃していないという意味ではありません。:-)

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

バックグラウンド:

MySQLサーバーを実行しているマシンのシェルにsshを介してログインし、ルートとしてログインします。

[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)

これは少し読みにくいので、この方法を試してみましょう(localhost以外の「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という名前のユーザーがいないことを提案したい人にとっては、これは素晴らしいことであり、別のユーザーにいくつかの特権を与えることができるようになれば検討します。

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


2
私は同じようにリモートで発生しています(そして、* FROM mysql.userを選択します。ここで、user = 'root'とhost = '%'は、あなたがするのと同じ特権を示します)。ただし、mysql.userのhost = '%'の行がhost = 'localhost'の行と同じであっても、そのフィールドを除いて、LOCALHOSTで機能します。私はWindows Server 2003で5.0.45を実行しています。
Richard Fawcett、2011

3
そのような整理された質問の+1!
Dewsworld 2013

1
あなたが管理者として実行することにより自動的に開いたCMDを持たせる
Lijo

1
-pパスワードの間にスペースがあっただけです。私はその愚かなことを知っていますが、誰かを助けるかもしれません。
Vinay W

回答:


57

の出力方法に注意してください

SHOW GRANTS FOR 'root'@'localhost';

「すべての特権」とは言いませんでしたが、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が実行されなかったため、動作が確認されました。


7
これは役立つ情報ですが、問題を解決するにはどうすればよいですか?
オーグラ2016

2
@ augurar、mysql_upgradeを実行
Marc Alff

または、「ALL PRIVILEGES」を持つ別のユーザーがいるかどうかを確認し、そのユーザーに切り替えて、ローカルホストの権限を変更します。exの場合、私はroot@127.0.0.1に対するすべての特権を持っていましたが、root @ localhostは持っていませんでした。
Carabus Manuel

72

私も同じ問題を抱えていましたが、WindowsでMySQL 5.1からMySQL 5.5にアップグレードした後です。ここでここでここで、ここでここで言及されているパスワードを変更、作成、およびリセットしようとしましたが、手がかりはありません。私はまだ同じエラーが出ます:

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

私は正常に接続し、すべてのデータベースを表示し、選択と挿入を行い、ユーザーを作成して追加することができますが、GRANTに関しては、めちゃくちゃです。これらのアクセス拒否エラーが再び表示されます。

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

C:\MySQL Server 5.5\bin> mysql_upgrade

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


2
thanx .. homebrewを介してmysqlがインストールされているMac OSで、次のコマンドを実行しますcd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras

30
CentOを使用しているか、パッケージマネージャーを介してMySQLをインストールしている場合、これは実行するコマンドである可能性があります。/usr/bin/mysql_upgrade -u root -pパスワードを入力して、Bobの叔父さんです!
Zjoia

あちこちでたくさんのコメントを交えて戦った後、これは私を助けました。
どうも

私は、これは古いです知っているが、これは私をたくさん助けたと私は、将来の訪問者のための1件の以上のコメントを追加したい:あなたはmysql_upgradeコマンドを実行しようとして拒否されたアクセスを取得している場合、代わりにこのようにそれを実行してみてください:mysql_upgradeコマンド-p
blizz

2
私が見つけたのは、MySQL <= 5.1からデータベースをエクスポートしmysqldump ... --all-databases、それをMySQL> = 5.5にインポートした場合、ユーザーは(もちろん)置き換えられますrootが、OPと同じ問題が発生するということです。そしてmysql_upgrade動作しません-あなたは--forceフラグを追加する必要があります、すなわちmysql_upgrade -u root -p --force。ここで誰かを助けることを願っています。
gregoltsov 2013年

62

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

ただし、以下は機能するはずです。

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

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


28
説明してください。なぜ '%'.*動作するの*.*ですか?
Pacerier、2015年

これが正しい方法です。MySQLにrootとしてログインし、権限を付与する必要があります。
ナビ

エラー1044アクセスが拒否されました:(助けてください
Bhaumik Thakkar 2017年

ありがとう、pymysqlを使用してpythonアプリケーションからmysqlにアクセスしようとしていました。「ホストはこのMariaDBサーバーへの接続を許可されていません」というエラーが発生し、[ここ](stackoverflow.com/questions/19101243/…)に新しいユーザーを追加することで解決し、「ユーザーのアクセスが拒否されました」という別のエラーが発生した、あなたの方法でそれを解決しました。
Balraj Bains 2017

1
'%'.*代わりに使用した場合、 `%`.*機能しません。使用する必要があります`%`.*
Rosario Russo

7

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

古いバージョンを消去してから新しいバージョンをインストールしました(rpm -e ...次にrpm -i MySQL-server *)が、/ var / lib / mysqlのファイルが古いバージョンのものであることを認識していません(違いはマーク・アルフが説明-ありがとう!)

mysql_upgradeを実行することもできましたが、最初からやりたいので、次のようにしました。

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

次にrootパスワード(/ usr / bin / mysqladmin -u root password)を設定し、すべてGRANTコマンドで期待どおりに機能しました...


おかげで、これは私を助けました。幸いにも、すべてのDBを消去しても問題ありませんでした...
ジャロッドモーセン2013

5

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

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

また、フォルダのアクセス許可/var/lib/mysql/mysql が711かどうかを確認します。


これでうまくいきました。mysqlは 'user' @ 'localhost'の権限を作成しないようです。そのため、そのユーザーを作成し、パスワードがあることを確認する必要がありました。
ジェリナウ2014

権限が間違っていました!びっくりしました。投稿いただきありがとうございます。
アダム

5

私は同じ問題を抱えていました、すなわち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

MySQL 5.5.40がインストールされているDebian(Wheezy、7.8)SELECT * FROM mysql.user WHERE User='root'\Gでは、Event_priv「Trigger_priv」フィールド存在するが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

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


1
これで問題も解決しましたが、特権をフラッシュする必要があることがわかりました。その後、再ログインして付与オプションを設定します。
Hendrik

5

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


3

入力SHOW GRANTS FOR 'root'@'localhost';すると、不明瞭なパスワードが表示されたため、別のシステムのHeidiSQLを使用rootして(ユーザー名と対応するパスワードとして使用して)そのシステムのmysqlにログインし、次のように入力しました。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

そして、私がシステムに戻って、
mysql -uroot -pthepassword;



2

同じ問題があり、SOの投稿とGoogleのドキュメントを読むのに多くの時間がかかりました。私は最終的にこれをCloud SQL FAQから見つけました:

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


1

私のようにまだこれにつまずく人のために、試みGRANTがまだ存在していないことを確認することを確認する価値があります:

SHOW GRANTS FOR username;

私の場合、エラーは実際には権限エラーがあったからではなく、GRANTすでに存在していることが原因でした。


1

mysqlの「アクセス拒否」エラーに直面したときに常に機能する簡単な解決策の1つ:を使用しますsudo

sudo mysql -u root

次に、GRANTコマンドに必要な権限が存在します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.