![编写自动化 SQLServer 2008 DR 移动脚本](https://linux22.com/image/507611/%E7%BC%96%E5%86%99%E8%87%AA%E5%8A%A8%E5%8C%96%20SQLServer%202008%20DR%20%E7%A7%BB%E5%8A%A8%E8%84%9A%E6%9C%AC.png)
我们使用 SQLServer 内置的日志传输功能将日志传输到我们的 DR 站点,但每月进行一次 DR 测试,这需要我们在实时服务器和备份服务器之间来回移动。我们在系统上运行多个(30)个数据库,因此手动备份最终日志并禁用作业的工作量太大,而且耗时太长。我认为没问题,我会编写脚本,但遇到了麻烦,总是抱怨最终日志应用得太早,即使我在将数据库置于无恢复模式之前不会导出最终日志。首先,有没有人知道一种简单可靠的方法来做到这一点?我看过一些第三方软件(我认为是 redgate sqlbackup),但在这种情况下也不容易。我希望能够做的基本上是运行一个脚本(一系列存储过程)让我进入 DR,然后运行另一个脚本让我返回而不丢失数据。我的脚本目前非常简单,但它们在这里:
2 个服务器 主服务器 巴黎 辅助服务器 巴黎T
StartAgentJobAndWait 是由其他人(ta)编写的脚本,仅检查作业是否已完成,如果作业永不结束则退出。
目前我只是使用一个名为 BOB2 的测试数据库,但如果我能让它工作,就会传递数据库和作业名称。
来自巴黎:
/* Disable backup job */
exec msdb..sp_update_job @job_name = 'LSBackup_BOB2', @enabled = 0
exec PARIST.msdb..sp_update_job @job_name = 'LSCopy_PARIS_BOB2', @enabled = 0
exec PARIST.msdb..sp_update_job @job_name = 'LSRestore_PARIS_BOB2', @enabled = 0
exec PARIST.master.dbo.DRStage2
ParisT DRStage2
DECLARE @RetValue varchar (10)
EXEC @RetValue = StartAgentJobAndWait LSCopy_PARIS_BOB2 , 2
SELECT ReturnValue=@RetValue
if @RetValue = 1
begin
print 'The Copy Task completed Succesffuly'
END
ELSE
print 'The Copy task failed, This may or may not be a problem, check restore state of database'
SELECT @RetValue = 0
EXEC @RetValue = StartAgentJobAndWait LSRestore_PARIS_BOB2 , 2
SELECT ReturnValue=@RetValue
if @RetValue = 1
begin
print 'The Restore Task completed Succesffuly'
END
ELSE
print 'The Copy task failed, This may or may not be a problem, check restore state of database'
exec PARIS.master.dbo.DRStage3
/* Do the last logship and move it to Trumpington */
BACKUP log "BOB2"
to disk='c:\drlogshipping\BOB2.bak'
with compression, norecovery
EXEC xp_cmdshell 'copy c:\drlogshipping \\192.168.7.11\drlogshipping'
EXEC PARIST.master.dbo.DRTransferFinish
AS
BEGIN
restore database "BOB2"
from disk='c:\drlogshipping\bob2.bak'
with recovery
答案1
做这个有时能行吗?我曾经做过类似的事情进行 DR 测试,但没遇到过这种情况。你的做法在技术上应该可行。
在启动 LSCopy 作业之前,您是否检查过 LSBackup 作业是否正在该数据库上运行?听起来您只是缺少 norecovery 备份之前的最新备份。LSCopy 作业可能没有获取所有内容。
运行 norecovery 备份后,尝试再次运行 LSCopy,到那时,调度程序将完成所有备份,您应该会没事。此外,如果您将 LSCopy 作业设置为将输出保存到文件,我相信如果存在无法复制的日志备份(例如,如果它正在使用中,因为备份当前正在写入它),您将看到错误。
答案2
为了让您了解如何创建用于恢复的自动生成脚本,这里是我编写的一个脚本,用于自动生成特定数据库的恢复脚本。
http://tenbulls.co.uk/2011/02/08/t-sql-tuesday-015-%E2%80%93-spend-time-now-to-save-time-later/
请注意,您想做的大部分(如果不是全部)事情都可以通过 Powershell、SMO 和 T-SQL 的混合方式完成。这取决于时间花在全部解决方案还是部分解决方案上更好。我个人会选择部分解决方案,因此在执行此类任务时,您总是希望有手动元素参与。
此致敬礼,马克。