Mysql

使用者 ‘root’@’%’ 的訪問被拒絕

  • April 26, 2020

我以前在 MySQL 中訪問 root 使用者就好了。但是最近,我已經不能了。

我可以正常登錄:

mysql -u root -p

這是登錄後的mysql狀態:

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (i686) using readline 6.2

Connection id:      37
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.28-0ubuntu0.12.04.3 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         4 min 16 sec

Threads: 1  Questions: 112  Slow queries: 0  Opens: 191  
Flush tables: 1  Open tables:  6  Queries per second avg: 0.437
--------------

但是當我想做任何動作時,例如:

mysql> CREATE DATABASE moyennegenerale;
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'moyennegenerale'

我知道%用於表示任何主機,但我的狀態清楚地表明了 localhost。有人知道可能會發生什麼嗎?

我認為您有匿名使用者

嘗試執行這個:

SELECT user,host,password FROM mysql.user WHERE user='';

這將顯示存在哪些匿名使用者。最有可能的是,您會看到一行空白使用者、主機%和空白密碼,如下所示:

mysql> select user,host,password from mysql.user;
+-----------+-------------+-------------------------------------------+
| user      | host        | password                                  |
+-----------+-------------+-------------------------------------------+
| lwdba     | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | %           | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| vanilla   | localhost   |                                           |
| mywife    | %           |                                           |
|           | %           |                                           | <<<--- LOOK !!!
| replicant | 10.64.113.% | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| kumar     | %           |                                           |
+-----------+-------------+-------------------------------------------+

那麼,您是如何登錄的呢?執行此查詢:

SELECT USER(),CURRENT_USER();

這告訴你什麼?

  • USER()報告您如何嘗試在 MySQL 中進行身份驗證
  • CURRENT_USER()報告您是如何被允許在 MySQL 中進行身份驗證的

第二個函式CURRENT_USER()揭示瞭如何使用哪個匿名使用者登錄。

您登錄時有哪些特權?

請執行

SHOW GRANTS;

這將揭示您在登錄時擁有的特權。您被阻止創建數據庫的事實表明您不是 root 使用者,而是某個較低特權的使用者。

請清理您的使用者授權。

至於重置root密碼,請執行以下操作:

echo "SET PASSWORD FOR root@localhost=PASSWORD('password');" > /var/lib/mysql/rootpwd.sql
service mysql restart
rm -f /var/lib/mysql/rootpwd.sql

從 @ShlomiNoach 學到了這種有效的方法

試一試 !!!

我知道你做了什麼。

做這個:

SELECT `User`, `Grant_priv` FROM `mysql`.`user` WHERE `User` = 'root';

您可能會注意到它為 Grant_priv 返回一個“N”。所以這樣做:

UPDATE `mysql`.`user` SET `Grant_priv` = 'Y' WHERE `User` = 'root';
FLUSH PRIVILEGES;
SELECT `User`, `Grant_priv` FROM `mysql`.`user`;

還有瓦拉!希望有幫助。

引用自:https://dba.stackexchange.com/questions/30768