cas*_*One 9 sql-server-2008 sql-server backup sql-server-2008-r2
我有一个大型(数千万条记录)数据库,我将在其上执行完整的数据库备份。
但是,数据库足够大,事务可以在备份发生之前和期间启动,也可以在备份发生期间和之后提交。
例如:
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
||----------||----------||----------||----------||----------||---------->
Run Code Online (Sandbox Code Playgroud)
我的理解是在备份期间不使用锁(尽管由于高 I/O 可能会出现其他性能问题),但我不确定我能保证什么会被提交。
此外,我担心的不是数据库将处于不一致状态,而是该状态将是什么(即使它不是确定性的,如果有一组可以一致应用的规则)以及它是如何到达那里的(例如,有多少数据文件与事务日志一起用于创建备份文件)?
本质上,当它完成备份的数据读取部分时,备份将是数据库的状态(因此所有数据都将被备份),加上任何数量的事务日志以确保事务一致性(开始所包含日志的时间是MIN(most recent checkpoint time, oldest active transaction start time)
)。Paul Randal在这里介绍了这一点(借助图表,这使得这一切变得更加容易)。在您的示例中,A
将被提交(或回滚,如果ROLLBACK TRANSACTION
发出 a 而不是 a COMMIT
)并B
回滚(无论该事务的最终结果如何)。
(除了 I/O 争用之外,您尝试在安静时间进行备份的另一个原因是备份期间生成的所有事务日志通常都必须包含在备份中。)
数据库还原的恢复阶段从备份中包含的日志中取出所有已提交的事务并将它们应用到数据库,并回滚所有未提交的事务。(这就是为什么WITH RECOVERY
/WITH NORECOVERY
很重要。WITH RECOVERY
您可以使用数据库,但不能应用任何进一步的日志备份,您需要恢复它WITH NORECOVERY
以滚动日志备份。恢复通过回滚未提交的事务来破坏日志链。 )
进一步阅读:
归档时间: |
|
查看次数: |
4249 次 |
最近记录: |