MySQL能否可靠地恢复包含视图的备份?

Ree*_*ece 8 mysql mysql-management mysqldump

环境:Ubuntu 11.10,MySQL 5.1.58

我有一个包含视图的小型数据库.当我尝试转储和恢复时,我明白了

ERROR 1356 (HY000) at line 1693: View 'curation2.condition_reference_qrm_v' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
Run Code Online (Sandbox Code Playgroud)

但是,我可以连接到部分还原的数据库并自己创建视图.因此,我怀疑错误消息是由与视图本身无关的问题引起的(而不是它是如何恢复的).

这是我用来演示问题的简单方法:

MYSQL_PWD='xxx' mysqldump -u root --routines -B curation \
| perl -pe 's/`curation`/`curation2`/' \
| MYSQL_PWD='xxx' mysql -u root
Run Code Online (Sandbox Code Playgroud)

还有许多其他类似问题的在线报告.mysqldump手册页有一个关于备份视图的错误的神秘笔记,但它是作为历史问题而不是当前问题编写的.

所以,问题是:MySQL能否可靠地恢复包含视图的备份?如果可以,怎么样?如果没有,人们做什么作为解决方法?

谢谢,Reece

iva*_*hoe 11

这个问题有点陈旧,但我只是浪费了几个小时试图解决完全相同的问题,所以我想一个明确的解释可能会在未来派上用场......

切入追逐:问题出在你的mysql转储的DEFINER字段中.它看起来像:

/*!50013 DEFINER=`some_user`@`localhost` SQL SECURITY DEFINER */
Run Code Online (Sandbox Code Playgroud)

问题是这个*some_user @ localhost*将始终硬编码到用于在原始数据库中创建视图的用户帐户,而不是您曾经用于导出或导入数据库的用户(或者至少我做过).稍后,在导入期间,此用户将用于重新创建视图.

因此,您可以以root身份导出/导入,但如果原始数据库在另一个用户下运行且新数据库中没有CREATE VIEW权限,则导入将失败.

你有两个简单的解决方案:

  1. 使用新用户(用于导入转储的用户,例如root @ localhost)搜索并替换转储文件中对some_user@的所有引用localhost
  2. 或者,您可以在新数据库上授予*some_user*适当的权限,以便可以在其帐户下创建视图

无论哪种方式都可以解决问题,但我认为第一种方法更好更清洁,因为您将来不必担心多个用户.


dli*_*ink 8

我发现解决问题的方法是在最初创建视图时使用'sql security invoker'.

  create or replace sql security invoker view <VIEW_NAME> as select ...
Run Code Online (Sandbox Code Playgroud)

它定义了调用者对视图的访问,而不是定义者.

然后,在加载转储文件时,将正确创建视图.

使用Amazon RDS:

要使用Amazon RDS(不允许超级私有(需要执行上述操作)),可以在转储文件上运行此命令:

 # Remove DEFINER statement from VIEWS in Dump file
 sed -i 's/\sDEFINER=`[^`]*`@`[^`]*`//' $DUMPFILE_NAME
Run Code Online (Sandbox Code Playgroud)

然后,当转储文件加载到RDS中时,视图将正确创建.


Ree*_*ece 3

我在我的案例中发现了问题。我不确定它是否能解决网络上的类似报告。

从根本上来说,这是一个权限问题,是由于尝试将此数据库复制到新名称而导致的。此用户和架构不存在权限(位于 curation2 上)。我手动添加了“GRANT ALL ON curation2.* TO locus”(轨迹是错误中报告的用户)。完成此操作后,上面的命令行就可以正常工作了。

教训是,在创建新数据库时,必须手动向目标数据库和表授予必要的权限。