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

我已经看了一些类似的问题,所以我正在certificate我已经检查了基本知识。 当然,这并不意味着我没有错过一些非常明显的东西。 🙂

我的问题是:为什么我拒绝访问权限的用户做我想做的事情,我已经input密码,并被授予访问权限? (为了完整起见,我尝试input错误的密码,以确保MySQL客户端在程序启动时会拒绝我访问。)

背景:

通过sshlogin到运行MySQL服务器的机器的shell,我以root身份login:

[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) 

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

注意:对于任何想要build议我没有一个名为root拥有所有权限的用户来说,这是非常好的,而且一旦我可以给予其他用户某些权限,我会考虑这样做。

谢谢!

注意如何输出

 SHOW GRANTS FOR 'root'@'localhost'; 

没有说'所有特权',但必须明确root @ localhost有什么。

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

那么现在缺less什么?

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

 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服务器实例时,安装脚本将创build所有具有适当结构的mysql。*表。

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

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

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

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

我能够正常连接,显示所有数据库,做select和插入,创build和添加用户,但是当涉及到GRANT,我搞砸了。 那些访问被拒绝的错误再次出现。

我设法解决这个问题,通过以下命令修复MySQL服务器bin /目录中的特权,如下所述:

 C:\MySQL Server 5.5\bin> mysql_upgrade 

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

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

但是,以下应该工作:

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

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

当我试图安装比发行版更高版本的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命令。

我有同样的问题,即为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 

…但仍不允许创build表格:

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

那么,这是由于一个恼人的用户错误,即我没有select一个数据库。 发出USE数据库名后,它工作正常。

基本上这个错误是在你没有指定密码的时候出现的,这意味着你在一些选项文件中列出了不正确的密码。

阅读此DOC了解如何分配和pipe理密码到帐户。

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

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

当我回到系统并login使用时,它工作
mysql -uroot -pthepassword;

在Debian( Wheezy ,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

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

我试图添加权限到performance_schema,这是mysql的bug http://bugs.mysql.com/bug.php?id=44898 (解决方法添加 – 单一事务)运行在此。

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

 SHOW GRANTS FOR username; 

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