在备份大型SQL Server数据库的同时执行数据更新操作


9

我有一个大型数据库(有上千万条记录),我将在该数据库上执行完整的数据库备份

但是,数据库足够大,可以在备份之前和期间以及在备份发生期间和之后启动事务。

例如:

T0 = Transaction A start
T1 = Full database backup start
T2 = Transaction B start (will not deadlock with A)
T3 = Transaction A commit/rollback (does not matter, does it?)
T4 = Full database backup end
T5 = Transaction B commit/rollback (again, does not matter, does it?)

T0          T1          T2          T3          T4          T6
||----------||----------||----------||----------||----------||---------->

我的理解是,在备份过程不使用任何锁(尽管由于诸如较高的I / O可能会导致其他性能问题),但是我不确定我可以保证将提交或不提交什么。

另外,我担心的不是数据库将处于不一致状态,而是该状态将是什么状态(即使不是确定性的,如果有一组可以一致地应用的规则)以及它如何到达那里(例如,有多少数据文件与事务日志一起用于创建备份文件)?


我删除了我的第一条评论,并将其扩展为答案。我仍在尝试找出如何准确地读取备份的数据。
西蒙·里加特斯

Answers:


7

本质上,当备份完成备份的数据读取部分时,备份将处于数据库状态(因此将备份所有数据),再加上需要确保事务一致性的事务日志量(开始包含的日志的时间为MIN(most recent checkpoint time, oldest active transaction start time))。保罗·兰德尔(Paul Randal)在这里介绍了这一过程(借助图表,使一切变得如此简单)。在您的示例中,A将被提交(如果ROLLBACK TRANSACTION发出a而不是,则将被回滚COMMIT),并且B将被回滚(无论该事务的最终结果如何)。

(除了I / O争用之外,尝试在安静的时间进行备份的另一个原因是,备份期间通常必须将备份过程中生成的所有事务日志都包括在内。)

数据库还原的恢复阶段从备份中包含的日志中获取所有已提交的事务,并将它们应用于数据库,然后回滚所有未提交的事务。(这就是为什么WITH RECOVERY/ WITH NORECOVERY很重要的原因。WITH RECOVERY您可以使用数据库,但不能再应用任何日志备份,您需要对其进行还原WITH NORECOVERY才能进行日志备份。恢复通过回滚未提交的事务来破坏日志链。 )

进一步阅读:


4

完整备份将还原到备份的数据读取部分完成时的时间点,此时将减去所有未提交的事务。

如前所述,在备份发生时,数据库保持在线状态并可供写入。备份系统如何备份一组不一致的数据页(因为读取数据花费的时间不为零)-涉及到每个数据页时,无论其处于何种状态,都需要对其进行复制完整备份还包括事务日志记录,该记录从备份开始时最早的活动事务的开始开始,到数据读取部分完成时的最后一个日志记录。

还原备份后,数据和日志将按原样重构(请记住数据页处于不一致状态),然后重做过程将从备份事务日志的开头开始(同样,在完整备份内部) ,一直到最后;然后,如果您使用进行了还原,则在备份完成时RECOVERY撤消会回滚所有未提交的事务。该撤消操作就是使数据库的事务一致的状态,以备使用。使用还原将NORECOVERY跳过撤消过程,从而使您可以还原其他备份(差异日志或事务日志)。

请注意,如果数据库很大且写入工作量很大,则如果当前分配的空间不足,则在备份过程中可能需要增加事务日志。即使您要进行事务日志备份,在完整备份期间也不能(内部)清除日志,因为完整备份需要日志记录。如果在进行完全备份时进行事务日志备份,则会自动推迟日志清除,直到完全备份完成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.