2010-11-08 6 views
3

Est-il possible de programmer toutes les configurations de livraison de journaux?Journal de script Expédition Automatisation

Par exemple: je dois écrire un travail qui initie l'envoi de journaux à partir de deux bases de données du serveur A au serveur B.

Le travail sera exécuté sur le serveur A.

Par ailleurs les deux sont SQL 2008 R2 Enterprise.

Il y a une part sur le serveur A. \ serverA \ Log

Je crois que c'est tout ce qui est nécessaire. Est-il possible de le faire simplement par script? Dois-je initialiser les bases de données ou existe-t-il une option comme SSMS pour l'initialisation automatique?

Dois-je créer les travaux manuellement? ou est-il configuré de manière à créer les tâches et à les gérer?

Est-il scriptable? Est-ce que quelqu'un a fait quelque chose comme ça? Quelqu'un at-il un script pour le faire?

Merci d'avance.

Répondre

8

Ceci est totalement possible, et il peut être écrit à l'aide de l'interface graphique de configuration de l'envoi de journaux. Le seul obstacle à surmonter dans le script qu'il génère devra se connecter au primaire et au secondaire dans le même script. Cela peut être accompli en utilisant les commandes de mode SQLCMD de SQLCMD en utilisant la commande CONNECT, en veillant à mettre GO entre les connexions. En prime, vous pouvez également exécuter des commandes du système d'exploitation (copie, del, etc.) afin de pouvoir également sauvegarder la sauvegarde et la restauration. Voir l'exemple ci-dessous.

-- 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

Pour l'utiliser, je devrais créer un travail et le configurer CMDEXEC? Est-ce que ça va marcher? En passant est-il un moyen de faire une boucle pour un select comme un curseur? –

+0

Enregistrez le script en tant que DRLogShippingSetup.sql et ensuite vous pouvez le configurer dans un travail CMDEXEC qui exécute SQLCMD comme ci-dessous (le chemin complet du script sera nécessaire), mais la façon dont le script est construit doit être exécutée depuis l'instance secondaire . La façon dont j'appelle ceci est d'un script de lot, avec un appel comme celui ci-dessous pour chaque base de données. Vous pouvez mettre un script wrapper batch (ou powershell) autour de l'appel pour faire une base de données. Sqlcmd/E/S secondaire \ instance1 -i DRLogShippingSetup.sql –

+0

Faut-il supprimer le fichier de sauvegarde? Est-ce ruiner votre chaîne de sauvegarde sur le primaire? – Sam

Questions connexes