尝试授予权限时,用户"root"@"localhost"的访问被拒绝.我如何授予特权?

Ste*_*ten 163 mysql mysql-error-1045

我看了很多类似的问题,所以我证明我已经检查了基础知识.当然,这并不意味着我没有错过任何完全明显的东西.:-)

我的问题是:为什么我拒绝具有执行我正在尝试的权限的用户以及我已经输入密码并被授予访问权限的用户的访问权限?(为了完整起见,我尝试输入错误的密码,以确保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> 
Run Code Online (Sandbox Code Playgroud)

真棒.我阅读类似问题的答案表明,我应该确保权限与授权表中的内容一致

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

mysql> 
Run Code Online (Sandbox Code Playgroud)

接下来确保我是我认为的我:

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

...... 真的确保:

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

mysql> 
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在我有什么特权?

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)
Run Code Online (Sandbox Code Playgroud)

现在这有点难以阅读,所以让我们尝试这种方式(您还将看到有一个非本地主机'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)
Run Code Online (Sandbox Code Playgroud)

真棒!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)
Run Code Online (Sandbox Code Playgroud)

我怎么能搞砸这个基本的东西?

旁注:对于任何想要建议我没有名为root的用户具有所有权限的人来说,这很棒,而且一旦我可以给另一个用户一些特权,我会考虑做些什么.

谢谢!

Ary*_*ryo 72

我也遇到了同样的问题,但在从MySQL 5.1升级到MySQL 5.5后,在Windows上也出现了问题.我已经尝试过更改,创建和重置这里提到的密码,这里,这里,这里,没有任何线索.我仍然得到同样的错误:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)

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

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

C:\MySQL Server 5.5\bin> mysql_upgrade
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您使用的是CentO或通过软件包管理器安装了MySQL,则可能是您应该运行的命令:`/ usr/bin/mysql_upgrade -u root -p`输入密码和Bob's Your Uncle! (30认同)
  • 在通过自制程序安装mysql的mac OS中运行以下命令```cd /usr/local/Cellar/mysql/5.5.25a/bin&&mysql_upgrade``` (2认同)
  • 我发现如果你从MySQL <= 5.1通过`mysqldump ... --all-databases`导出数据库,然后将其导入你的MySQL> = 5.5,你的用户将被替换(当然),但你的`root`会遇到与OP相同的问题.并且`mysql_upgrade`不起作用 - 你必须添加`--force`标志,即`mysql_upgrade -u root -p --force`.希望能在这里帮到某人. (2认同)

Anu*_*pta 56

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

但是,以下应该有效:

GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

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

  • 请解释一下.为什么''%'.*`工作但不是`*.*`? (26认同)

Mar*_*lff 53

注意输出如何

SHOW GRANTS FOR 'root'@'localhost';
Run Code Online (Sandbox Code Playgroud)

没有说'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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

这只是猜测,但似乎没有为此实例执行mysql_upgrade,导致看到的行为.

  • 这是有用的信息,但我该如何解决问题? (5认同)
  • @augurar,运行mysql_upgrade (2认同)

phi*_*l_w 7

当我尝试安装比分发版更高版本的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
Run Code Online (Sandbox Code Playgroud)

然后设置root密码(/ usr/bin/mysqladmin -u root密码),并使用GRANT命令按预期工作...


glo*_*bia 7

您可能在安装了 MySQL 版本 8 的情况下(像我一样)遇到了这个问题,但没有找到满意的答案。您不能再在版本 8 中创建这样的用户:

GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

您返回的相当混乱的错误消息是: 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;
Run Code Online (Sandbox Code Playgroud)

当然,如果您愿意,您也可以提供有限数量的权限(而不是GRANT ALL PRIVILEGES),例如GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER


Mit*_*ran 5

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

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

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


tzp*_*tzp 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
Run Code Online (Sandbox Code Playgroud)

...但仍然不允许创建表格:

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

好吧,这是由一个恼人的用户错误引起的,即我没有选择数据库.发出USE dbname后,它运行正常.


Wil*_*ell 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

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