Jav*_*ava 2 sql-server recovery restore log-shipping standby
我正在尝试提出一种使用“备用”还原模式跟上每日数据库更新过程的策略。
我从第三方的 FTP 站点获取 24 个日志传送文件(用于前一天的每小时事务日志文件)。我会在每晚运行时更新这 24 个文件。我最初以 SQB 文件格式获取这些文件,然后我有一个工具和脚本将这些 SQB 文件转换为 BAK 文件格式。
现在,我正在尝试制定一个持续备份计划的策略。
数据库不必更新或修改,只需读取即可。 我是否始终将每个事务日志文件恢复为“备用”,而将它们保留为“备用”模式?
我计划创建一个单独的数据库,以便仅从这个“只读”数据库的某些表中检索必要的数据。
我还有一个问题。如果我不小心运行脚本将此数据库恢复为“NoRecovery or Recovery”模式,有没有办法通过运行脚本将模式更改回“Standby”,或者我是否必须再次将完整的 bak 文件恢复为“Standby”(做整个过程再次)?
我是否始终将每个事务日志文件恢复为“备用”,而将它们保留为“备用”模式?
两者都可以,但使用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”
您可以从 更改NORECOVERY
为STANDBY
,反之亦然,例如:
-- 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)
您无需更改STANDBY
为NORECOVERY
即可应用下一组日志备份。
一旦数据库恢复 ( WITH RECOVERY
),您将无法返回,并且必须再次启动整个恢复序列。在您的场景中,您永远不会这样做。
备用文件将在下一个还原步骤中自动删除(或重新使用),但 SQL Server 不会在还原命令未主动使用该文件时锁定该文件。像对待任何其他数据库文件一样谨慎对待该文件 - 如果它丢失,数据库也会丢失。
推荐阅读: