每小时日志传送文件的备用还原选项策略

Jav*_*ava 2 sql-server recovery restore log-shipping standby

我正在尝试提出一种使用“备用”还原模式跟上每日数据库更新过程的策略。

我从第三方的 FTP 站点获取 24 个日志传送文件(用于前一天的每小时事务日志文件)。我会在每晚运行时更新这 24 个文件。我最初以 SQB 文件格式获取这些文件,然后我有一个工具和脚本将这些 SQB 文件转换为 BAK 文件格式。

现在,我正在尝试制定一个持续备份计划的策略。

数据库不必更新或修改,只需读取即可。 我是否始终将每个事务日志文件恢复为“备用”,而将它们保留为“备用”模式?

我计划创建一个单独的数据库,以便仅从这个“只读”数据库的某些表中检索必要的数据。

我还有一个问题。如果我不小心运行脚本将此数据库恢复为“NoRecovery or Recovery”模式,有没有办法通过运行脚本将模式更改回“Standby”,或者我是否必须再次将完整的 bak 文件恢复为“Standby”(做整个过程再次)?

use*_*856 5

我是否始终将每个事务日志文件恢复为“备用”,而将它们保留为“备用”模式?

两者都可以,但使用NORECOVERY. 最后一个应用使用STANDBY,使数据库可用于只读访问。SQL Server 必须做额外的工作才能使数据库在事务一致的状态下可供读取。然后,当您要求它应用下一个日志备份时,它必须撤消该工作(使用备用文件)。简而言之,STANDBY不必要地指定确实会减慢速度,因为您最终会执行和撤消部分恢复过程(请参阅下面由 Paul Randal 提供的链接)。

在您的情况下,这意味着使用 应用 23 个事务日志备份NORECOVERY,然后使用STANDBY. 第二天,你做同样的事情。

请注意,当您开始下一个还原序列时,您需要确保在待机模式下没有任何连接到数据库。在您的情况下,这应该不是问题,因为您控制对数据库的所有访问。如果您确实需要强行断开其他用户的连接:

ALTER DATABASE DbName 
SET SINGLE_USER 
WITH ROLLBACK IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)

不要忘记稍后再次将数据库提供给其他用户:

ALTER DATABASE DbName 
SET MULTI_USER;
Run Code Online (Sandbox Code Playgroud)

如果我不小心运行脚本将此数据库恢复为“NoRecovery or Recovery”模式,有没有办法将模式改回“Standby”

您可以从 更改NORECOVERYSTANDBY,反之亦然,例如:

-- From norecovery to standby
RESTORE DATABASE DbName
WITH STANDBY = N'C:\StandbyFiles\DbName.sby';

-- From standby to norecovery
RESTORE DATABASE DbName
WITH NORECOVERY;
Run Code Online (Sandbox Code Playgroud)

您无需更改STANDBYNORECOVERY即可应用下一组日志备份。

一旦数据库恢复 ( WITH RECOVERY),您将无法返回,并且必须再次启动整个恢复序列。在您的场景中,您永远不会这样做。

备用文件将在下一个还原步骤中自动删除(或重新使用),但 SQL Server 不会在还原命令未主动使用该文件时锁定该文件。像对待任何其他数据库文件一样谨慎对待该文件 - 如果它丢失,数据库也会丢失。

推荐阅读: