2010-11-08 81 views
3

是否可以腳本所有的日誌傳送配置?腳本日誌傳送自動化

例如:我需要編寫從兩個數據庫啓動日誌傳送從服務器A到服務器B.工作

作業將在服務器A

運行順便說都是SQL 2008 R2企業版。

有服務器A上 共享\ serverA的\登錄

我相信這是所有需要。 是否可以通過腳本來完成? 我是否需要初始化數據庫或者是否有像SSMS這樣的選項來自動初始化?

我需要手動創建作業嗎?還是以創建作業並管理它們的方式進行配置?

它是腳本?有沒有人做過這樣的事情? 有沒有人有腳本來做到這一點?

在此先感謝。

回答

8

這是完全可能的,它可以通過日誌傳送設置GUI腳本化。在它生成的腳本中要克服的唯一障礙是需要在同一個腳本中連接主要和次要。這可以通過使用CONNECT命令使用SQLCMD的SQLCMD模式命令來完成,確保將GO放在連接之間。作爲獎勵,您還可以執行操作系統命令(複製,刪除等),以便您腳本化備份和恢復。見下面的例子。

-- Execute the following statements at the Primary to configure Log Shipping 
-- for the database [primary\instance1].[mydb], 
-- The script needs to be run at the Primary in the context of the [msdb] database. 
------------------------------------------------------------------------------------- 
-- Adding the Log Shipping configuration 

-- ****** Begin: Script to be run at Primary: [primary\instance1] ****** 

:setvar PRIMARY primary\instance1 
:setvar SECONDARY secondary\instance2 
:setvar DATABASE mydb 
:setvar PBKDIR "D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BACKUP\" 
:setvar PBKSHARE "\\primary\d$\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BACKUP\" 
:setvar SBKSHARE "\\secondary\d$\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BACKUP\" 
:setvar SDATADIR "D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\" 


:connect $(PRIMARY) 

alter database [$(DATABASE)] set recovery full 

DECLARE @LS_BackupJobId AS uniqueidentifier 
DECLARE @LS_PrimaryId AS uniqueidentifier 
DECLARE @SP_Add_RetCode As int 


EXEC @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database 
     @database = N'$(DATABASE)' 
     ,@backup_directory = N'$(PBKDIR)' 
     ,@backup_share = N'$(PBKSHARE)' 
     ,@backup_job_name = N'LSBackup_$(DATABASE)' 
     ,@backup_retention_period = 1440 
     ,@backup_threshold = 180 
     ,@threshold_alert_enabled = 1 
     ,@history_retention_period = 5760 
     ,@backup_job_id = @LS_BackupJobId OUTPUT 
     ,@primary_id = @LS_PrimaryId OUTPUT 
     ,@overwrite = 1 


IF (@@ERROR = 0 AND @SP_Add_RetCode = 0) 
BEGIN 

DECLARE @LS_BackUpScheduleUID As uniqueidentifier 
DECLARE @LS_BackUpScheduleID AS int 


EXEC msdb.dbo.sp_add_schedule 
     @schedule_name =N'LSBackupSchedule_$(PRIMARY)' 
     ,@enabled = 1 
     ,@freq_type = 4 
     ,@freq_interval = 1 
     ,@freq_subday_type = 4 
     ,@freq_subday_interval = 60 
     ,@freq_recurrence_factor = 0 
     ,@active_start_date = 20100101 
     ,@active_end_date = 99991231 
     ,@active_start_time = 0 
     ,@active_end_time = 235900 
     ,@schedule_uid = @LS_BackUpScheduleUID OUTPUT 
     ,@schedule_id = @LS_BackUpScheduleID OUTPUT 

EXEC msdb.dbo.sp_attach_schedule 
     @job_id = @LS_BackupJobId 
     ,@schedule_id = @LS_BackUpScheduleID 

EXEC msdb.dbo.sp_update_job 
     @job_id = @LS_BackupJobId 
     ,@enabled = 1 


END 


EXEC master.dbo.sp_add_log_shipping_alert_job 

EXEC master.dbo.sp_add_log_shipping_primary_secondary 
     @primary_database = N'$(DATABASE)' 
     ,@secondary_server = N'$(SECONDARY)' 
     ,@secondary_database = N'$(DATABASE)' 
     ,@overwrite = 1 

backup database [$(DATABASE)] to disk = '$(PBKDIR)$(DATABASE)_dr_init.bak' with init 
go 


print '$(PBKSHARE)$(DATABASE)_dr_init.bak' 
print '$(SBKSHARE)' 
print 'copy $(PBKSHARE)$(DATABASE)_dr_init.bak $(SBKSHARE) /y' 

!!copy $(PBKSHARE)$(DATABASE)_dr_init.bak $(SBKSHARE) /y 
go 

!!del $(PBKSHARE)$(DATABASE)_dr_init.bak /Q 
go 

-- ****** End: Script to be run at Primary: [primary\instance1] ****** 


-- Execute the following statements at the Secondary to configure Log Shipping 
-- for the database [secondary\instance2].[mydb], 
-- the script needs to be run at the Secondary in the context of the [msdb] database. 
------------------------------------------------------------------------------------- 
-- Adding the Log Shipping configuration 

-- ****** Begin: Script to be run at Secondary: [secondary\instance2] ****** 

:connect $(SECONDARY) 

!!sqlcmd /E /S$(SECONDARY) -i DRRestoreDatabase.sql -v BKDIR="$(SBKSHARE)" -v DATADIR="$(SDATADIR)" -v LOGDIR="$(SLOGDIR)" 

!!del $(SBKSHARE)$(DATABASE)_dr_init.bak /Q 
go 


DECLARE @LS_Secondary__CopyJobId AS uniqueidentifier 
DECLARE @LS_Secondary__RestoreJobId AS uniqueidentifier 
DECLARE @LS_Secondary__SecondaryId AS uniqueidentifier 
DECLARE @LS_Add_RetCode As int 


EXEC @LS_Add_RetCode = master.dbo.sp_add_log_shipping_secondary_primary 
     @primary_server = N'$(PRIMARY)' 
     ,@primary_database = N'$(DATABASE)' 
     ,@backup_source_directory = N'$(PBKSHARE)' 
     ,@backup_destination_directory = N'$(SBKSHARE)' 
     ,@copy_job_name = N'LSCopy_$(PRIMARY)_$(DATABASE)' 
     ,@restore_job_name = N'LSRestore_$(PRIMARY)_$(DATABASE)' 
     ,@file_retention_period = 1440 
     ,@overwrite = 1 
     ,@copy_job_id = @LS_Secondary__CopyJobId OUTPUT 
     ,@restore_job_id = @LS_Secondary__RestoreJobId OUTPUT 
     ,@secondary_id = @LS_Secondary__SecondaryId OUTPUT 

IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) 
BEGIN 

DECLARE @LS_SecondaryCopyJobScheduleUID As uniqueidentifier 
DECLARE @LS_SecondaryCopyJobScheduleID AS int 


EXEC msdb.dbo.sp_add_schedule 
     @schedule_name =N'DefaultCopyJobSchedule' 
     ,@enabled = 1 
     ,@freq_type = 4 
     ,@freq_interval = 1 
     ,@freq_subday_type = 4 
     ,@freq_subday_interval = 60 
     ,@freq_recurrence_factor = 0 
     ,@active_start_date = 20090505 
     ,@active_end_date = 99991231 
     ,@active_start_time = 0 
     ,@active_end_time = 235900 
     ,@schedule_uid = @LS_SecondaryCopyJobScheduleUID OUTPUT 
     ,@schedule_id = @LS_SecondaryCopyJobScheduleID OUTPUT 

EXEC msdb.dbo.sp_attach_schedule 
     @job_id = @LS_Secondary__CopyJobId 
     ,@schedule_id = @LS_SecondaryCopyJobScheduleID 

DECLARE @LS_SecondaryRestoreJobScheduleUID As uniqueidentifier 
DECLARE @LS_SecondaryRestoreJobScheduleID AS int 


EXEC msdb.dbo.sp_add_schedule 
     @schedule_name =N'DefaultRestoreJobSchedule' 
     ,@enabled = 1 
     ,@freq_type = 4 
     ,@freq_interval = 1 
     ,@freq_subday_type = 4 
     ,@freq_subday_interval = 60 
     ,@freq_recurrence_factor = 0 
     ,@active_start_date = 20090505 
     ,@active_end_date = 99991231 
     ,@active_start_time = 0 
     ,@active_end_time = 235900 
     ,@schedule_uid = @LS_SecondaryRestoreJobScheduleUID OUTPUT 
     ,@schedule_id = @LS_SecondaryRestoreJobScheduleID OUTPUT 

EXEC msdb.dbo.sp_attach_schedule 
     @job_id = @LS_Secondary__RestoreJobId 
     ,@schedule_id = @LS_SecondaryRestoreJobScheduleID 


END 


DECLARE @LS_Add_RetCode2 As int 


IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) 
BEGIN 

EXEC @LS_Add_RetCode2 = master.dbo.sp_add_log_shipping_secondary_database 
     @secondary_database = N'$(DATABASE)' 
     ,@primary_server = N'$(PRIMARY)' 
     ,@primary_database = N'$(DATABASE)' 
     ,@restore_delay = 0 
     ,@restore_mode = 1 
     ,@disconnect_users = 1 
     ,@restore_threshold = 180 
     ,@threshold_alert_enabled = 1 
     ,@history_retention_period = 2880 
     ,@overwrite = 1 

END 


IF (@@error = 0 AND @LS_Add_RetCode = 0) 
BEGIN 

EXEC msdb.dbo.sp_update_job 
     @job_id = @LS_Secondary__CopyJobId 
     ,@enabled = 1 

EXEC msdb.dbo.sp_update_job 
     @job_id = @LS_Secondary__RestoreJobId 
     ,@enabled = 1 

END 
go 


-- ****** End: Script to be run at Secondary: [secondary\instance2] ****** 
+0

要使用這個我應該創建一個工作,並設置CMDEXEC?這會工作嗎?順便說一下,有什麼辦法來循環這個選擇像光標? – 2010-11-09 17:50:21

+0

將該腳本另存爲DRLogShippingSetup.sql,然後可以在運行如下所示的SQLCMD的CMDEXEC作業中進行設置(需要腳本的完整路徑),但腳本的構建方式需要從輔助實例運行。我稱之爲批處理腳本的方式,每個數據庫都有一個如下所示的調用。你可以把一個包裝批處理(或PowerShell)腳本放在這個調用的每個數據庫上。 sqlcmd/E/S secondary \ instance1 -i DRLogShippingSetup.sql – 2010-11-10 16:30:45

+0

應該刪除備份文件嗎?這是否破壞了您的主要備份鏈? – Sam 2013-04-01 23:25:02