SQL Server数据库为什么不能恢复单表数据

如果能从备份文件中只恢复一个表的数据,那不是很好吗?比如,你备份了AdventureWorks数据库,现的你只恢复里面Vendor表数据。不幸的是,SQL Server本身并不支持这样还原,你需要从第三方提供的工具中来执行这样的任务。

提供这种功能的程序都是一些SQL Server第三方备份工具。它们可以让你从备份文件中抽取或是读取单个表数据。

但是这里有一点要注意是,假如你选择恢复一个完整数据库,那么你选择要恢复的数据有可能与你获取的数据不同。原因就是因为当你执行完整数据库备份时,备份文件包括数据文件和事务日志文件。有一些已经提交的事务还没有写入数据文件,在这种情况下,事务仅仅存储在事务日志中,或者部份数据存储在数据文件。当你使用第三方程序恢复所选择的单表数据时,仅仅只能从备份文件中的数据库文件中获取数据,事务日志中的新数据将会被忽略。

下图显示了在备份期间没有checkpoint的备份序列。

SQL Server数据库为什么不能恢复单表数据_第1张图片

在备份开始之前,如果事务还没有被写到数据文件中,那会怎么样呢?答案是不确定,因为当备份开始后,SQL Server会自动执行checkpoint操作。当checkpoint期间,脏数据页已经被写到磁盘上了。当我们从备份文件恢复单独一个表的数据时,我们能不能认为要恢复的数据就处于备份开始处呢?这取决于备份过程。如果在备份期间没有事务在运行,那就没问题。如果这期间有事务在运行而且checkpoint也没有被触发,那也没问题。但是如果在备份期间有事务在执行,那我们恢复的数据也许就会包括备份起始时的数据,而且在备份期间数据被提交了的话,如果在备份期间发生了checkpoint而且数据也被写到了数据页,而这个数据页在checkpoint发生时没有被备份。(最后这句实在不知道怎么翻译才好,附上原文如下:If however there were transactions performed during the backup, the data we recover may include data at the beginning of the backup, and data that were committed during the backup IF checkpoints occurred during the backup AND the data was written to pages that were not yet backed up yet at the time the checkpoint occurred.)

下图显示了带checkpoint的备份序列

当你进行表级别的恢复之前,要先考虑一些事情。一个完整备份包括所有的数据,还有数据库所有直到备份结尾的改变。一个单独的数据文件无法映射出指定时刻数据库的状态。因此,表级别的恢复包括旧、脏数据。假如在备份期间发生checkpoint的话,就会导致数据不一致,也就是说,一个表的数据改变后被写进了备份文件中,但是另外一些表的数据却没有。

本文翻译自sqlbackuprestore,更多精彩内容请浏览http://www.sqlbackuprestore.com

你可能感兴趣的:(sql,数据库,server,存储,工具,include,transactions)