【问题标题】:Can MySQL reliably restore backups that contain views or not?MySQL 能否可靠地恢复包含视图的备份?
【发布时间】:2011-12-08 07:52:07
【问题描述】:

环境: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

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

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

MYSQL_PWD='xxx' mysqldump -u root --routines -B curation \
| perl -pe 's/`curation`/`curation2`/' \
| MYSQL_PWD='xxx' mysql -u root

网上还有很多其他类似问题的报告。 mysqldump 手册页有一个关于备份视图错误的神秘注释,但它是作为历史问题而不是当前问题编写的。

所以,问题是:MySQL 能否可靠地恢复包含视图的备份?如果可以,怎么做?如果没有,人们会怎么做?

谢谢, 里斯

【问题讨论】:

    标签: mysql mysqldump mysql-management


    【解决方案1】:

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

    切入正题:问题出在 mysql 转储中的 DEFINER 字段中。它看起来像:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我发现解决问题的方法是在最初创建视图时使用“sql 安全调用程序”。

        create or replace sql security invoker view <VIEW_NAME> as select ...
      

      它定义调用者而不是定义者对视图的访问。

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

      使用 Amazon RDS:

      要使这项工作与不允许超级 priv(执行上述操作所需)的 Amazon RDS 一起使用,可以在转储文件上运行此命令:

       # Remove DEFINER statement from VIEWS in Dump file
       sed -i 's/\sDEFINER=`[^`]*`@`[^`]*`//' $DUMPFILE_NAME
      

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

      【讨论】:

      • 这似乎是亚马逊一个非常模糊的要求。我想知道为什么默认情况下不简单地包含视图?
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        几件事:

        1.) 是的,您可以使用某些客户端创建视图,但可能表的所有者不是视图的所有者,这会导致

        2.) 通常,在 mysql 中备份视图包括一些“无用的垃圾”,例如

        create algorithm xxx definer=<USER> sql security view <view_name> as ....
        

        并且该用户通常包括用户在创建视图时登录的 IP 或机器名称...所以,视图将无法正确创建。看看这个,可能对你有帮助。

        【讨论】:

        • 我正在以 root 身份执行所有这些操作。这不是我的标准做法,但是当我以 root 身份执行此操作时,权限不太可能成为问题(我认为)。我不明白你想对视图定义说什么,但在转储中我觉得它是合理的。
        • 请将视图定义带到这里并将其添加到问题中。只是为了检查
        猜你喜欢
        • 2012-02-07
        • 1970-01-01
        • 2011-05-28
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-24
        • 2013-02-24
        相关资源
        最近更新 更多