尝试授予权限时拒绝用户“root”@“localhost”的访问。如何授予权限?

Posted

技术标签:

【中文标题】尝试授予权限时拒绝用户“root”@“localhost”的访问。如何授予权限?【英文标题】:Access denied for user 'root'@'localhost' while attempting to grant privileges. How do I grant privileges? 【发布时间】:2012-01-19 01:28:10 【问题描述】:

我查看了许多类似的问题,因此我证明我已经检查了基础知识。当然,这并不意味着我没有错过一些完全明显的东西。 :-)

我的问题是:为什么我拒绝访问有权执行我正在尝试执行的操作以及我已经输入密码并被授予访问权限的用户? (为了完整起见,我尝试输入错误的密码只是为了确保 mysql 客户端会在程序启动时拒绝我访问。)

背景:

通过ssh登录到运行MySQL服务器的机器的shell,我以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 的用户的人,这很好,一旦我可以给另一个用户一些权限,我会考虑这样做。

谢谢!

【问题讨论】:

我在远程也遇到了同样的情况(选择 * FROM mysql.user where user= 'root' and host = '%' 显示与您相同的权限)。但是,它确实在 LOCALHOST 上工作,即使 mysql.user 中 host = '%' 的行与 host = 'localhost' 的行相同,但该字段除外。我在 Windows Server 2003 上运行 5.0.45。任何答案都非常感谢! +1 对于这样一个有组织的问题! 确保您已经以管理员身份运行打开了 cmd 我在-p 和密码之间有一个空格。我知道这很愚蠢,但可能会对某人有所帮助。 【参考方案1】:

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

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

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

【讨论】:

这对我有用。看起来mysql没有为'user'@'localhost'创建权限。所以我必须创建该用户并确保它有密码。 权限错误!我很惊讶。非常感谢您发布。【参考方案2】:

我也有同样的问题,但在从 MySQL 5.1 升级到 MySQL 5.5 后在 Windows 上。 我已经尝试过更改、创建和重置here、here、here 和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

然后,问题就消失了。我希望这个解决方案也适用于 Linux,因为通常 MySQL 在 Linux 和 Windows 上提供相同的命令。

【讨论】:

thanx.. 在通过 homebrew 安装 mysql 的 mac OS 中运行以下命令 cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade 如果你在 CentO 上或者已经通过包管理器安装了 MySQL,这很可能是你应该运行的命令:/usr/bin/mysql_upgrade -u root -p enter password and Bob's Your Uncle! 在和这么多的cmets在这里和那里战斗之后,这个帮助了我。非常感谢 我知道这是旧的,但这对我有很大帮助,我想为未来的访问者添加一条评论:如果您在尝试运行 mysql_upgrade 时遇到访问被拒绝,请尝试像这样运行它: mysql_upgrade -p 我发现如果您通过mysqldump ... --all-databases 从 MySQL = 5.5,您的用户将被替换(当然),但是您的root 会遇到和 OP 一样的问题。而mysql_upgrade 将不起作用-您必须添加--force 标志,即mysql_upgrade -u root -p --force。希望对这里的人有所帮助。【参考方案3】:

注意输出是怎样的

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)

5.5 中还有新的表,例如 mysql.proxies_user:确保你有它们。

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

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

这只是一个猜测,但似乎 mysql_upgrade 没有为此实例完成,导致看到的行为。

【讨论】:

这是有用的信息,但我该如何解决这个问题? @augurar,运行 mysql_upgrade 或者,检查您是否有另一个具有“所有权限”的用户并切换到该用户并更改本地主机的权限。例如,我拥有 root@127.0.0.1 的所有权限,而 root@localhost 没有。 @CarabusManuel 谢天谢地,我看到了你的消息。在我的 Virtualmin 系统上显示 grants 没有所有的授权,但有 root@127 有。还 show grants 显示了该 root 的密码。所以我使用mysql -uroot -pnewpass -h127.0.0.1 修复了它 @EugenevanderMerwe 很高兴能帮到你!【参考方案4】:

当您尝试将所有表的所有权限授予另一个用户时,可能会发生这种情况,因为 mysql.users 表被认为是除 root 用户之外的用户的禁区。

但是,以下应该可以工作:

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

请注意,我们使用 `%`.* 而不是 *.*

【讨论】:

请解释一下。为什么'%'.* 有效但*.* 无效? 这是正确的做法。您必须以 root 身份登录 MySQL,然后尝试授予权限。 我收到错误 1044 access denied :( 请帮帮我 谢谢,正在尝试使用 pymysql 从 python 应用程序访问 mysql。出现错误提示“不允许主机连接到此 MariaDB 服务器”,通过添加给定 [此处](***.com/questions/19101243/…) 的新用户解决了该问题,然后出现另一个错误提示“用户访问被拒绝”,并由您解决方法。 如果您使用'%'.* 而不是`%`.* 不起作用。您必须使用`%`.*【参考方案5】:

当我尝试安装比发行版附带的更高版本的 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 命令一切正常...

【讨论】:

谢谢,这帮助了我。幸运的是,如果我清除了所有的数据库也没关系...【参考方案6】:

当我尝试向 performance_schema 添加权限时,我运行了这个,这是 mysql 错误 http://bugs.mysql.com/bug.php?id=44898(添加 --single-transaction 的解决方法)。

【讨论】:

【参考方案7】:

我有同样的问题,即授予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 后,它工作正常。

【讨论】:

【参考方案8】:

输入SHOW GRANTS FOR 'root'@'localhost'; 向我显示了一些模糊的密码,所以我在另一个系统上使用 HeidiSQL 登录到该系统的 mysql(使用 root 作为用户名和相应的密码)并输入GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

当我返回系统并使用 mysql -uroot -pthepassword;

登录时,它起作用了

【讨论】:

【参考方案9】:

在带有 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

…然后在单个数据库/用户帐户上更精确地使用它。

【讨论】:

这也为我解决了这个问题,但只是在我发现你需要 FLUSH PRIVILEGES 之后;之后重新登录以设置授权选项。【参考方案10】:

对于那些仍然像我一样偶然发现的人,值得检查以确保尝试的 GRANT 不存在:

SHOW GRANTS FOR username;

在我的情况下,错误实际上并不是因为存在权限错误,而是因为 GRANT 已经存在。

【讨论】:

【参考方案11】:

我遇到了同样的问题,我花了很多时间阅读 SO 帖子和 Google 的文档。我终于从Cloud SQL FAQ找到了这个:

Google Cloud SQL 不支持 SUPER 权限,这意味着 GRANT ALL PRIVILEGES 语句将不起作用。作为替代方案,您可以使用GRANT ALL ON `%`.*

【讨论】:

【参考方案12】:

您可能已经安装了 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

【讨论】:

我明白了,这突出了声明中我的用户名存在的问题。【参考方案13】:

当遇到 mysql “拒绝访问”错误时,一个简单的解决方案总是对我有用:使用 sudo

sudo mysql -u root

那么GRANT 命令的必要权限就存在了。

【讨论】:

以上是关于尝试授予权限时拒绝用户“root”@“localhost”的访问。如何授予权限?的主要内容,如果未能解决你的问题,请参考以下文章

给用户授予权限时应该尽量避免ANY系统权限

MySQL:为 CREATE 授予权限被拒绝

即使用户授予位置权限检查,三星 note 20 也总是会被拒绝

在我的 PostGres 表上授予所有权限,但在尝试插入/选择时仍然收到“权限被拒绝”错误

授予非 root 用户访问权限以登录 phpMyAdmin

mysql:在 information_schema 上的访问被拒绝