我正在使用 AdventureWorks 数据库练习文件恢复,但没有得到我期望的恢复。我确信有一些非常简单的原因,但我还没有找到它。
这是我所做的
- 创建了一个名为
USERTABLES_01
. - 将数据从表复制
HumanResources.Employee
到新的 .HumanResources.Employee_01
在USERTABLES_01
文件组中。 - 生成了完整备份。
DELETE FROM HumanResources.Employee_01
在没有 where 子句的情况下执行- Shazbot,我需要恢复表格。好的,我会恢复文件组
USERTABLES_01
。 - 执行
RESTORE DATABASE [AdventureWorks2012] FILE N'AdventureWorks2012_UserTables_01'
... - 生成尾日志备份
- 恢复尾日志备份
一切恢复无怨无悔。但是我HumanResources.Employee_01
的没有任何数据。
查看MS Example,也许我没有正确遵循它,但我很确定我做到了。
查看了类似的问题,但不确定这是我正在寻找的答案: Restore .mdf data file for a filegroup in SQL Server。
SQL Server 的最高优先级是遵守ACID属性。这意味着,无论您做什么,您的数据库始终在事务上保持一致。
但是,您尝试执行的操作可能会使您陷入不一致的状态。想一想解释 ACID 属性的标准示例:银行帐户。假设您有两个帐户驻留在不同的文件组中(例如,两个帐户表或一个具有分区)。现在您在事务中将资金从文件组一转移到文件组二。然后你去恢复文件组一到传输之前。这导致钱现在同时存在于两个账户中,这显然不是理想的状态。
那么,您的示例中发生了什么?
6) 文件组成功恢复到灾难发生前的某个时间点。但是它处于“正在恢复”状态并且不可访问。
8) 日志恢复使文件组与数据库的其余部分同步(在事务级别)。为此,日志备份中捕获的所有已提交事务都将重新应用于该文件组。但是,删除是一个已提交的事务,因此它也会重新执行。这使数据库保持一致,但表为空。
您指向的 Technet 示例假设文件由于某些外部原因(例如驱动器故障)而脱机。在这种情况下,所描述的恢复是有意义的,因为您希望重新应用所有事务。
在您的情况下,您需要在其他地方恢复数据库,然后将数据复制回原始表。为此,您可以只恢复包含相关数据的文件组和主文件组。您不能只恢复辅助文件组,主文件组也必须始终恢复。这是建议不要在主文件组中包含任何数据的原因之一。这样一来,必须恢复那个的影响也很小。
在恢复序列之后,您的表中没有数据,因为您恢复了上次日志备份的所有事务,其中包括从表中删除的数据。
您基本上要寻找的是时间点还原。这是一个工作示例(注意:正如 Sebastian 已经暗示的那样,在对文件执行时间点还原时需要还原 PRIMARY 文件组):
正如 Sebastian 还提到的那样,如果您希望取回已删除的数据,那么在其他地方恢复并复制数据可能本质上更容易。但我想展示你更正的测试用例只是为了说明你将如何进行时间点恢复。