我想设置一个辅助的、镜像的SQL Server 用于报告目的。
报告数据库不必与主数据库保持同步,通常可以比生产数据库滞后一天,甚至更多。
几天来,我一直在尝试实现这样的目标,但几乎没有成功,使用 Brent Ozar 的SQL-Server-First-Responder-Kit和sp_AllNightLog
.
通常,第一个 FULL 备份会被恢复,有时甚至会恢复一些 LOG 备份,但随后它就会卡住,它不再看到更新的备份,只是进入一个循环,什么都不做。
故障排除似乎向我表明,sp_AllNightLog @Restore = 1
在恢复数据库或日志文件时遇到错误,将其记录在restore_worker
表中,这会阻止发出所有进一步的恢复。如果我清除error_number
(-1) 并last_error_date
从表中清除,它会再次开始恢复,但随后再次出现错误,因为它开始恢复 FULL 备份,而不是继续进行 LOG 恢复。然后它记录错误日期和错误编号并再次停止。
另一个问题是sp_DatabaseRestore
(来自 Kit)使恢复的数据库(无论是从 FULL 恢复还是 LOG 恢复)处于未恢复状态(始终使用NORECOVERY
并且从不运行RESTORE WITH RECOVERY
)。这使得数据库在辅助数据库上不可读,除非我sp_AllNightLog
从 using更改@RunRecovery = 0
为@RunRecovery = 1
:
-- Line 1302
IF @restore_full = 0
BEGIN
IF @Debug = 1 RAISERROR ('Starting Log only restores', 0, 1) WITH NOWAIT;
EXEC master.dbo.sp_DatabaseRestore @Database = @database,
@BackupPathFull = @restore_path_full,
@BackupPathLog = @restore_path_log,
@ContinueLogs = 1,
@RunRecovery = 1,
@OnlyLogsAfter = @only_logs_after,
@Debug = @Debug
END
IF @restore_full = 1
BEGIN
IF @Debug = 1 RAISERROR ('Starting first Full restore from: ', 0, 1) WITH NOWAIT;
IF @Debug = 1 RAISERROR (@restore_path_full, 0, 1) WITH NOWAIT;
EXEC master.dbo.sp_DatabaseRestore @Database = @database,
@BackupPathFull = @restore_path_full,
@BackupPathLog = @restore_path_log,
@ContinueLogs = 0,
@RunRecovery = 1,
@Debug = @Debug
END
我是否必须在设置之前删除备份历史记录?有没有人写过一个完整的指南来设置这样的东西?即使在谷歌搜索时,我似乎也真的找不到。
任何帮助是极大的赞赏!