拒绝拥有 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 命令的主要内容,如果未能解决你的问题,请参考以下文章