Martes, 29 Mayo 2012 16:03

Log Shipping hacia dos servidores en sql 2005 - II parte

Escrito por
Valora este artículo
(2 votos)

En la primera parte de este artículo, se presento a grandes rasgos la solución de log shipping para tener un servidor de base de datos de alta disponibilidad.

Veremos ahora como realizar el log shipping hacia más de un servidor secundario en sql 2005 (algo que la herramienta implementó recién a partir de sql 2008)

El modo más simple consiste en ejecutar el wizard de configuración a partir de las propiedades de la base de datos :

2 1

Es de notar que información "sensible" (como el nombre de la base de datos y de servidor) fueron borrados de esta pantalla.

Una vez configurados los parámetros deseados (no es objetivo de este artículo como configurar el log shipping), es necesario presionar la flecha en el botón "script configuration" para obtener las tres opciones posibles: copiar el script al portapapeles, a un archivo o abrir una nueva pantalla de query del sql management studio con el script creado:

2 2

La mejor opción es la de crear un archivo con el script obtenido de configurar el log shipping.

Un ejemplo de script es el siguiente (fue obtenido del wizard y luego modificado para ocultar datos sensibles):

-- Execute the following statements at the Primary to configure Log Shipping
-- for the database [primario].[basedatos],
-- 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: [primario] ******


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'basedatos'
        ,@backup_directory = N'\\primario\backup'
        ,@backup_share = N'\\primario\backup'
        ,@backup_job_name = N'LSBackup_basedatos'
        ,@backup_retention_period = 4320
        ,@backup_threshold = 60
        ,@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_primario1'
        ,@enabled = 1
        ,@freq_type = 4
        ,@freq_interval = 1
        ,@freq_subday_type = 4
        ,@freq_subday_interval = 15
        ,@freq_recurrence_factor = 0
        ,@active_start_date = 20120529
        ,@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'basedatos'
        ,@secondary_server = N'secundario'
        ,@secondary_database = N'basedatos'
        ,@overwrite = 1

-- ****** End: Script to be run at Primary: [primario]  ******


-- Execute the following statements at the Secondary to configure Log Shipping
-- for the database [secundario].[basedatos],
-- 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: [secundario] ******


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'primario'
        ,@primary_database = N'basedatos'
        ,@backup_source_directory = N'\\primario\backup'
        ,@backup_destination_directory = N'c:\restore'
        ,@copy_job_name = N'LSCopy_primario_basedatos'
        ,@restore_job_name = N'LSRestore_primario_basedatos'
        ,@file_retention_period = 4320
        ,@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 = 15
        ,@freq_recurrence_factor = 0
        ,@active_start_date = 20120529
        ,@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 = 15
        ,@freq_recurrence_factor = 0
        ,@active_start_date = 20120529
        ,@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'basedatos'
        ,@primary_server = N'primario'
        ,@primary_database = N'basedatos'
        ,@restore_delay = 0
        ,@restore_mode = 0
        ,@disconnect_users    = 0
        ,@restore_threshold = 45   
        ,@threshold_alert_enabled = 1
        ,@history_retention_period    = 5760
        ,@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


-- ****** End: Script to be run at Secondary: [secundario] ******

Como se puede notar, el mismo script separa el código a ser ejecutado en el primario y en el servidor secundario. El truco consiste en modificar esta segunda parte del script y cambiar el nombre del servidor secundario y luego ejecutar esta parte del script en el nuevo servidor

Una buena idea antes de hacerlo, es modificar el parámetro "file retention period" en la stored  procedure master.dbo.sp_add_log_shipping_secondary_primary (que se encarga de la copia de los archivos de backup) para evitar que uno de los secundarios borre los archivos luego de copiarlos. Este parámetro está expresado en minutos e indica cuanto tiempo luego de copiar correctamente el archivo, espera sql server para borrarlos del directorio fuente.

 

Leer 3608 veces Modificado por última vez en Miércoles, 30 Mayo 2012 17:06
Volver arriba