20

我正在使用mysqldump在特定机器上的帐户之间复制数据库。一切都很好,除了当我们到达我们定义的视图时。因为转储包含如下一行...

/*!50013 DEFINER=`user_a`@`localhost` SQL SECURITY DEFINER */

...当在 user_b 上将转储加载到 mysql 时,我们收到一个错误:

ERROR 1227 (42000) at line 657: Access denied; you need the SUPER privilege for this operation

不用说,我对这个 mysql 实例没有超级权限。有没有办法说服mysqldump以与用户无关的方式转储视图?关于这一点,我在手册中找不到任何内容。我是否必须实际解析转储文件来替换用户名?还是我错过了什么?

4

4 回答 4

27

同样的问题。我是这样解决的:

mysqldump -uuser1 -ppassword1 database1 > backup.sql

sed '/^\/\*\!50013 DEFINER/d' backup.sql > backup_without_50013.sql

mysql -u user2 -ppassword2 -D database2 < backup_without_50013.sql

有趣的是sed命令,它在这里删除了所有以 /*!50013 开头的行。

海蒂

于 2008-11-24T10:43:28.087 回答
12

您将需要处理备份文件并更改 DEFINER:

定义者= user_a@localhost

我喜欢将其更改为:

DEFINER=CURRENT_USER

然后它将自动关联到加载它的帐户。

于 2009-12-18T22:22:15.177 回答
2

SQL SECURITY 子句确定在检查视图的访问权限时使用哪个 MySQL 帐户(您可能已经知道了)。

创建视图时,您可以为该视图定义几个安全选项。您可以在此处阅读更多内容,但基本上默认情况下,访问权限仅限于视图的“定义者”,即创建它的用户。

于 2008-09-30T19:28:41.103 回答
0

mysqldump使用选项运行"--skip-triggers"

于 2009-11-17T19:24:56.613 回答