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