编写自动化 SQLServer 2008 DR 移动脚本

编写自动化 SQLServer 2008 DR 移动脚本

我们使用 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 的混合方式完成。这取决于时间花在全部解决方案还是部分解决方案上更好。我个人会选择部分解决方案,因此在执行此类任务时,您总是希望有手动元素参与。

此致敬礼,马克。

相关内容