尝试授予特权时,拒绝用户'root'@'localhost'的访问。如何授予特权?


166

我已经看过许多类似的问题,因此表明我已经检查了基础知识。当然,这并不意味着我没有错过任何显而易见的事情。:-)

我的问题是:为什么我拒绝具有特权的用户访问权限,而我却有权在其中输入密码并被授予访问权限?(为了完整起见,我尝试输入错误的密码只是为了确保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的用户都具有所有特权的用户,这很好,一旦我可以给另一个用户一些特权,我就会考虑做一些事情。

谢谢!


2
我正在远程体验相同的操作(并选择* FROM mysql.user,其中user ='root'和host ='%'显示与您相同的特权)。但是,即使mysql.user中host ='%'的行与host ='localhost'的行相同,除了该字段,它也可以在LOCALHOST上运行。我在Windows Server 2003上运行5.0.45。非常感谢所有回答!
理查德·福塞特

3
+1这样有组织的问题!
Dewsworld 2013年

1
确保您已通过以管理员
身份

1
-p和密码之间只有一个空格。我知道它很傻,但可能会对某人有所帮助。
Vinay W

Answers:


57

注意输出

SHOW GRANTS FOR 'root'@'localhost';

没有说“ ALL PRIVILEGES”,而是不得不说出root @ localhost的含义。

授予所有特权将失败,因为用户无法授予他/她没有的特权,并且服务器似乎认为这里不存在某些东西...

现在,接下来缺少什么呢?

在我的系统上,我得到以下信息:

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)

5.5中也有新表,例如mysql.proxies_user:确保您具有它们。

安装全新的mysql服务器实例时,安装脚本将创建具有适当结构的所有mysql。*表。

从旧版本升级时,请确保使用正确的升级过程(mysql_upgrade),它将添加缺少的表/列。

这只是一个猜测,但似乎该实例的mysql_upgrade未完成,导致出现了该行为。


7
这是有用的信息,但是如何解决该问题?
augurar

2
@augurar,运行mysql_upgrade
Marc Alff

或者,检查您是否还有另一个具有“ ALL PRIVILEGES”的用户,然后切换到该用户并更改localhost的特权。例如,我对root@127.0.0.1拥有所有特权,而root @ localhost没有。
Carabus Manuel

72

我也有同样的问题,但是在Windows上从MySQL 5.1升级到MySQL 5.5之后。我已经尝试过更改,创建和重置herehereherehere中提到的密码。我仍然收到相同的错误:

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

我能够正常连接,显示所有数据库,选择和插入,创建和添加用户,但是当涉及到GRANT时,我就搞砸了。这些拒绝访问错误再次出现。

我设法通过作为中提到的MySQL服务器bin /目录下面的命令固定的特权来解决这个问题在这里

C:\MySQL Server 5.5\bin> mysql_upgrade

然后,问题消失了。我希望该解决方案也能在Linux上使用,因为通常MySQL在Linux和Windows上都提供相同的命令。


2
在Mac OS中,thanx ..和通过cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
Homebrew

30
如果您使用的是CentO,或者已通过软件包管理器安装了MySQL,则可能应该运行以下命令:/usr/bin/mysql_upgrade -u root -p输入密码,然后输入Bob的Your Uncle!
Zjoia 2012年

在到处打了很多评论之后,这个帮助了我。非常感谢
siddhusingh

我知道这是旧的,但是这对我帮助很大,我想添加更多的一个评论对未来用户:如果你要拒绝访问试图运行mysql_upgrade,尝试这样运行它,而不是:mysql_upgrade -p
暴雪

2
我发现的是,如果您从MySQL <= 5.1通过导出数据库mysqldump ... --all-databases,然后将其导入到MySQL> = 5.5,那么您的用户将被替换(当然),但是您root将遇到与OP相同的问题。而且mysql_upgrade不起作用-您必须添加--force标志,即mysql_upgrade -u root -p --force。希望能对这里的人有所帮助。
gregoltsov

62

当您尝试将所有表的所有特权授予另一个用户时,可能会发生这种情况,因为mysql.users表被视为除root用户以外的其他用户的访问权限。

但是,以下方法应该起作用:

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

请注意,我们使用`%`。*代替*。*


28
请解释一下。为什么行 '%'.*而不行*.*
Pacerier

这是正确的方法。您必须以root用户身份登录MySQL,然后尝试授予权限。
2016年

我收到错误1044访问被拒绝:(请帮帮我
Bhaumik Thakkar

谢谢,试图使用pymysql从python应用程序访问mysql。出现错误消息“不允许主机连接到此MariaDB服务器”,通过在[此处](stackoverflow.com/questions/19101243/…)添加新用户来解决该问题,然后出现另一个错误消息:“拒绝用户访问” ,并通过您的方法解决了。
Balraj Bains

1
如果使用'%'.*代替 `%`.*不起作用。您必须使用`%`.*
Rosario Russo

7

当我尝试安装比发行版随附的MySQL版本更高的MySQL版本时,发生了这种情况。

我删除了旧版本,然后安装了新版本(rpm -e ...然后是rpm -i MySQL-server *),但没有意识到/ var / lib / mysql中的文件仍然来自较早版本(区别在于由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命令正常工作...


谢谢,这帮助了我。幸运的是,我淘汰了所有DB都没关系……
Jarrod Mosen

5

基本上,当您未指定密码时会出现此错误,这意味着您在某些选项文件中列出了错误的密码。

阅读此DOC,以了解如何分配和管理帐户密码。

另外,请检查文件夹的权限/var/lib/mysql/mysql 是否为711。


这对我有用。看来mysql没有为'user'@'localhost'创建权限。因此,我必须创建该用户并确保它具有密码。
Jerinaw

权限错误!我很惊讶。非常感谢您发布。
亚当

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

在Debian(喘息,7.8)与MySQL 40年5月5日,我发现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中创建用户,您必须分两个步骤进行操作:

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登录到该系统的mysql(用作用root户名和相应的密码)并输入
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“拒绝访问”错误时总是对我有用:use sudo

sudo mysql -u root

然后,GRANT命令具有必要的权限。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.