首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试授予权限时拒绝用户'root'@'localhost‘的访问。如何授予特权?

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

Stack Overflow用户
提问于 2011-12-13 13:26:19
回答 11查看 600.9K关注 0票数 181

我看过许多类似的问题,所以我演示了我已经检查了基础知识。当然,这并不意味着我没有错过一些非常明显的东西。:-)

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

背景:

通过ssh登录到运行MySQL服务器的机器的外壳,我以超级用户身份登录:

代码语言:javascript
复制
[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> 

太棒了。我在阅读类似问题的答案时发现,我应该确保权限与授权表中的权限保持一致

代码语言:javascript
复制
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> 

下一步,确保我是我认为的那个人:

代码语言:javascript
复制
mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

...and真的很确定:

代码语言:javascript
复制
mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> 

到目前一切尚好。那么我有什么特权呢?

代码语言:javascript
复制
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”用户):

代码语言:javascript
复制
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拥有所有这些特权。这意味着我应该能够做我想做的事,对吗?

代码语言:javascript
复制
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的用户,这很好,一旦我可以给另一个用户一些特权,我就会考虑这样做。

谢谢!

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-01-24 10:51:39

请注意,

代码语言:javascript
复制
SHOW GRANTS FOR 'root'@'localhost';

没有说“所有权限”,但必须详细说明root@localhost拥有的权限。

授予所有权限将失败,因为用户不能授予他/她没有的权限,并且服务器似乎认为这里没有什么……

那么,到底少了什么呢?

在我的系统上,我得到了这个:

代码语言:javascript
复制
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没有针对此实例执行,从而导致了所看到的行为。

票数 63
EN

Stack Overflow用户

发布于 2012-01-22 11:19:47

在从MySQL 5.1升级到Windows5.5之后,我在Windows上也遇到了同样的问题。我已经尝试过更改、创建和重置herehereherehere中提到的密码,没有任何线索。我仍然得到相同的错误:

代码语言:javascript
复制
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

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

我设法解决了这个问题,方法是使用here中提到的MySQL服务器bin/目录上的以下命令修复权限

代码语言:javascript
复制
C:\MySQL Server 5.5\bin> mysql_upgrade

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

票数 72
EN

Stack Overflow用户

发布于 2013-04-15 04:44:09

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

但是,以下方法应该有效:

代码语言:javascript
复制
GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;

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

票数 67
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8484722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档