我正在尝试设置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
。
提前感谢您提供任何建议。
答案 0 :(得分:15)
对于未来的搜索者,我发现在使用MySQL Workbench和phpMyAdmin的组合时出现此错误:如果您从表列表中“复制SQL”,它会将模式名称添加到create语句中的表名称(以及可能属于它的外键命令。)
小心删除架构名称为我解决了这个问题。
例如:
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...
答案 1 :(得分:14)
我想建议如下:
下次登录时运行此查询:
SELECT USER(),CURRENT_USER();
如果您看到两个不同的用户名,则会出现奇怪的情况
您可以在MySQL 5.0认证学习指南(ISBN 0-672-32812-7),第34章或第35章中找到
USER()
回应您尝试登录的内容
CURRENT_USER()
回复mysql允许您登录的内容。
尝试使用127.0.0.1作为复制器进行连接并运行相同的查询。
您可能还想确保mysql.user中存在所有必需的列,以用于您正在使用的mysql版本。如果你没有升级mysql.user表(从MySQL 4的迁移 - MySQL 5,或MySQL 5.0到5.1),mysql.user中的列可能不同步。
答案 2 :(得分:5)
奇怪的是,只需退出客户端并重新连接即可解决问题!显然,FLUSH PRIVILEGES
还不够。
如果您了解其中的原因,我想听听您的意见。我一直听说FLUSH PRIVILEGES
会做到这一点。它可能与我最初以'replicator'@'%'
登录然后创建'replicator'@'localhost'
帐户有关吗?
在任何情况下,如果你有这样奇怪的权限问题,我想重新连接客户端是值得的。
答案 3 :(得分:0)
当使用MySQL Workbench Migration Wizard将数据库从一台服务器复制到另一台服务器时,我收到了相同的错误消息,因为新的数据库名称与原始数据库名称不匹配。新服务器自动将其域名放在所有数据库名称的前面,从而导致名称不匹配。因此,在将数据库xyz
传输到新服务器domain
时,它会调用新数据库domain_xyz
,并且每次创建表时都会出现上述错误消息。
要解决此问题,我在生成迁移架构后手动编辑了新的数据库名称,并将其从xyz
更改为doman_xyz
。
对Camwyn的回应提示,让我朝这个方向看。