【问题标题】:Restoring two databases to precisely the same time将两个数据库恢复到完全相同的时间
【发布时间】:2009-11-16 03:36:34
【问题描述】:

在 SQL Server 2008 中,我的父表在一个数据库中,子表在另一个数据库中,FK 关系由触发器维护。我无法更改它,无法将两个表都移动到一个数据库中并具有常规的 FK 约束。当我从完全备份恢复两个数据库时,我的子表中有孤儿,因为没有同时进行完全备份。我也有交易记录。 在容灾的情况下,是否可以将两个数据库恢复到完全相同的时刻,使两个数据库保持一致?

【问题讨论】:

    标签: sql-server sql-server-2008 triggers


    【解决方案1】:

    只要数据库处于完全恢复模式并进行定期日志备份,就可以同时恢复。 See How to: Restore to a Point in Time (Transact-SQL).

    但是,时间点恢复本身并不能确保跨数据库事务的一致性,您还需要在逻辑上跨越数据库边界的所有操作上使用过事务。触发器可能已经确保了删除和更新的这一点,因为它们在父操作的上下文中运行,因此将跨数据库边界操作隐式包装在事务中,但对于插入,您的应用程序通常必须将插入包装到父操作中并将插入到子操作中单笔交易。

    恢复操作的一致性是应用程序在不同数据库之间拆分的最大障碍。

    【讨论】:

    • Remus,即使我恢复到精度为 3 毫秒的精确时间,也可以在一毫秒内提交大量数据。我认为仍然可能有一些孤儿。
    • @SQL 这也是我的观点:如果数据库被拆分,您将无法进行可靠的恢复。跨数据库事务有助于减少它,但不能强制执行。
    【解决方案2】:

    我看不到您问题的完整解决方案,但您可以使用完整备份和事务日志备份。 首先,您使用 NORECOVERY 选项在 poth 基础上恢复完整备份,然后在两个基础上使用 STOPAT='xxxxxxxx' 重新恢复事务日志备份。因此,您可以在同一时间点恢复两个数据库。

    【讨论】:

      【解决方案3】:

      执行此操作的最佳方法是在您进行备份时修复它。大多数多数据库应用程序都这样做:

      在备份之前,执行命令将标记的事务写入所涉及的每个数据库的事务日志中。 (BEGIN TRANSACTION WITH MARK) 然后做备份。

      这样,您以后可以使用 STOPAT MARK 进行 RESTORE 以将它们全部恢复到同一时间点。它并不完美,但 比其他方法更接近。

      【讨论】:

      • Greg,我怎么知道什么时候标记?我需要在灾难后以最少的数据丢失进行恢复。我应该经常标记,比如每 5 秒一次吗?
      • 多数据库应用程序可以在开始备份之前执行此操作。有一个对每个数据库执行此操作的作业步骤。然后开始备份。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2022-08-19
      • 2021-07-17
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多