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

我已经研究了许多类似的问题,所以我要证明我已经检查了基础知识。当然,这并不意味着我没有错过一些显而易见的事情。:-)

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

谢谢!

619277 次浏览

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

阅读此 医生了解如何分配和管理密码帐户。

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

在从 MySQL 5.1升级到 MySQL 5.5之后,我在 Windows 上也遇到了同样的问题。 我已经尝试改变,创建和重置密码中提到的 给你给你给你给你,没有线索。我仍然得到相同的错误:

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 上都提供相同的命令。

注意

SHOW GRANTS FOR 'root'@'localhost';

没有说“所有特权”,但必须说明 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.proxy _ user: 请确保您拥有它们。

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

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

这只是一个猜测,但似乎 mysql _ update 没有在这个实例中完成,从而导致了所看到的行为。

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

不过,以下措施应该可以奏效:

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

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

当我试图安装一个比发行版更高级的 MySQL 版本时,就发生了这种情况。

我删除了旧版本,然后安装了新版本(rpm-e... then rpm-i MySQL-server *) 但是没有意识到/var/lib/mysql 中的文件仍然来自旧版本(与 Marc Alff 解释的不同——谢谢!)

我本来可以做一个 mysql _ update,但是因为我想从头开始,所以我做了:

# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start

然后设置 root 密码(/usr/bin/mysqladmin-u root password) ,所有这些命令都可以按预期的方式使用 GRANT 命令..。

当我试图向 Performance _ schema 添加特权时,我就是这样运行的,这是 mysql bug http://bugs.mysql.com/bug.php?id=44898(要添加的解决方案——单事务)。

我遇到了同样的问题,也就是所有被授予 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'

它是由一个恼人的用户错误引起的,也就是说,我没有选择一个数据库。 在发出 使用 dbname之后,它工作得很好。

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

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

在 Debian (气喘吁吁,7.8)和 MySQL 5.5.40上,我发现 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

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

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

SHOW GRANTS FOR username;

在我的例子中,错误实际上不是因为存在权限错误,而是因为 GRANT已经存在。

我也有同样的问题,需要花很多时间阅读 SO 文章和 Google 的文档。我终于在 云 SQL 常见问题解答上找到了这个:

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

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

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

sudo mysql -u root

然后存在 GRANT命令所需的权限。