拒绝拥有 GRANT ALL PRIVILEGES 的用户的 CREATE 命令

Posted

技术标签:

【中文标题】拒绝拥有 GRANT ALL PRIVILEGES 的用户的 CREATE 命令【英文标题】:CREATE command denied for user that has GRANT ALL PRIVILEGES 【发布时间】:2011-07-12 09:22:27 【问题描述】:

我正在尝试设置一个 mysql 复制从属服务器,并且在运行 LOAD DATA FROM MASTER; 时遇到了非常困难的时间。是的,我知道它已被弃用,但我运行的是 MySQL 5.1,目前这不是我的问题。

由于某种原因,MySQL 一直告诉我 CREATE 命令被拒绝,但检查 SHOW GRANTS 时却说不然。看看这个:

mysql> SHOW GRANTS;
+--------------------------------------------------------------------------------------------------------------------+
| Grants for replicator@%                                                                                            |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'replicator'@'%' IDENTIFIED BY PASSWORD '*ABCDEFABCDEFABCDEFABCDEFBLAHBLAHBLAHBLAH' |
+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> LOAD DATA FROM MASTER;
ERROR 1142 (42000): CREATE command denied to user 'replicator'@'localhost' for table 'aggregate'
mysql>

我觉得奇怪的是,当调用LOAD DATA FROM MASTER 时,它认为我是'replicator'@'localhost',而SHOW GRANTS 却说'replicator'@'%'。为了安全起见,我也给'replicator'@'localhost' 提供了相同的权限。

mysql> SHOW GRANTS FOR 'replicator'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------+
| Grants for replicator@localhost                                                                                            |
+----------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'replicator'@'localhost' IDENTIFIED BY PASSWORD '*ABCDEFABCDEFABCDEFABCDEFBLAHBLAHBLAHBLAH' |
+----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

那么,对于为什么这一切都搞砸了有什么想法吗?是的,我也做了很多次FLUSH PRIVILEGES

提前感谢您提供的任何建议。

【问题讨论】:

这个问题最好在 ServerFault StackExchange 上提出。 @Treebranch,我以为我实际上是把它贴在那里,然后我把它放在这里后,我意识到我把它放错了地方。这里有很多 MySQL 问题,我认为这是灰色区域,所以我离开了。如果他们认为合适,我会让模组移动它。 【参考方案1】:

对于未来的搜索者,我发现在使用 MySQL Workbench 和 phpMyAdmin 的组合时出现此错误:如果您从表列表中“复制 SQL”,它会将架构名称添加到创建语句中的表名称(以及可能是其中一部分的外键命令)。

仔细删除架构名称为我解决了这个问题。

例如:

CREATE  TABLE IF NOT EXISTS `schema`.`table1` (
...blah blah blah...

CONSTRAINT `fk_user_id`
    FOREIGN KEY (`user_id` )
    REFERENCES `schema`.`table1` (`id` )
...blah blah blah...

应该改为:

CREATE  TABLE IF NOT EXISTS `table1` (
...blah blah blah...

CONSTRAINT `fk_user_id`
    FOREIGN KEY (`user_id` )
    REFERENCES `table1` (`id` )
...blah blah blah...

【讨论】:

很好的答案。此外,您不必删除模式语句。只需在 Workbench 中更改模式名称并再次导出 SQL。它对我有用。 为我工作。 +1 4 年后。【参考方案2】:

我想提出以下建议:

下次登录时运行此查询:

SELECT USER(),CURRENT_USER();

如果你看到两个不同的用户名,你的情况很奇怪

您可以在 MySQL 5.0 认证学习指南 (ISBN 0-672-32812-7) 第 34 或 35 章中找到该内容

USER() 与您尝试登录的身份相呼应

CURRENT_USER() 与 mysql 允许您登录的内容相呼应。

尝试使用 127.0.0.1 作为复制器连接并运行相同的查询。

您可能还想确保所有必要的列都存在于您正在使用的 mysql 版本的 mysql.user 中。如果您没有升级 mysql.user 表(从 MySQL 4 迁移到 MySQL 5,或从 MySQL 5.0 迁移到 5.1)mysql.user 中的列可能不同步。

【讨论】:

这个答案确实概述了我遇到的问题,并没有真正解释这个问题是如何或为什么发生的。它甚至没有解释问题是什么......为什么这是公认的答案?【参考方案3】:

奇怪的是,只需退出客户端并重新连接即可解决问题!显然,FLUSH PRIVILEGES 是不够的。

如果您有任何 cmets,我想听听他们为什么会这样。我一直听说FLUSH PRIVILEGES 会这样做。会不会和我最初以'replicator'@'%' 登录,然后创建'replicator'@'localhost' 帐户有关?

无论如何,如果你有这样奇怪的权限问题,我想值得尝试重新连接客户端。

【讨论】:

说真的,这让我发疯了!谢谢兄弟。 dev.mysql.com/doc/refman/5.0/en/privilege-changes.html 表示下次执行USE 命令时数据库权限生效,但客户端可能缓存了权限。【参考方案4】:

当使用 MySQL Workbench 迁移向导将数据库从一台服务器复制到另一台服务器时,我收到了相同的错误消息,因为新的数据库名称与原始名称不匹配。新服务器会自动将其域名放在所有数据库名称的前面,从而造成名称不匹配。因此,在将 DB xyz 转移到新服务器 domain 时,它调用了新 DB domain_xyz,并且每次创建表都会出现上述错误消息。

为解决此问题,我在生成迁移架构后手动编辑了新的数据库名称,将其从 xyz 更改为 doman_xyz

Camwyn 的回应让我朝这个方向看。

【讨论】:

以上是关于拒绝拥有 GRANT ALL PRIVILEGES 的用户的 CREATE 命令的主要内容,如果未能解决你的问题,请参考以下文章

mysql GRANT ALL PRIVILEGES ON创建用户

mysql访问权限GRANT ALL PRIVILEGES ON,访问权限表

Mysql grant all privileges on ...不生效解决方案

mysql 赋给用户远程权限 grant all privileges on

解决mysql的赋权操作之GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION问题

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant