Transactional Replication - Iniciando un "pull subscriber" desde respaldos

Imagen de kenneth

Votar: 

Average: 5 (8 votes)

Alguna vez se le ha caido una replicación en la cual la publicación es bastante grande, y restablecerla desde un snapshot puedo tomar varios dias; o sencillamente necesita agregar una segunda subscripción a una publicación ya existente? Bueno los siguientes pasos le pueden ayudar a hacer ese proceso menos doloroso, y ahorrar bastante tiempo de arreglagar problemas.

Transactional replication con pull subcriber funciona tal y como lo muestra la siguiente imagen:

Replicación
 
 
 
 
En resumen, el publicador le envia los cambios al distribuidor , y este se encarga de servirselos a cada uno de los subscriptores. Y en pocas palabras esa es toda la lógica detras de replicación.
 
El problema viene cuando se necesita agregar un nuevo subscriptor, o el subscriptor actual se desconfigura. Laruta de inicializarlo apartir de un snapshot puede ser tremendamente dolorosa en bases de datos de cierto tamaño.
 
 
 
 
 
 
Los siguientes pasos le pueden ayudar a inicializar una subscripción desde un respaldo:
  1. Verificar la configuración de la publicación.
  2. Tomar un "full backup" del publicador.
  3. Restaurar el "full backup" en el subscriptor.
  4. Tomar un "Differential Backup" del publicador(Opcional).
  5. Restaurar el "Differential Backup" en el subscriptor(Opcional).
  6. Recuperar la base de datos del subscriptor.
  7. Obtener procedimientos almacenados personalizados para replicación(Opcional).
  8. Desactivar triggers en suscriptor(Optional).
  9. Agregar el suscriptor en el publicador.
  10. Configurar la suscripción en el subscriptor..

Verificar la configuración de la publicación

La publicación debe de estar inicializada para permitir "pull subscriber" y permitir a los subscriptores inicializarse apartir de backups. tal y como lo muestra la siguiente imagen:

Publication options

Ir al Arriba

Tomar un "full backup" del publicador

Una vez la publicación este configurada para permitir que el subcriptor se inicialice apartir de respaldos, tome un "full backup" de la que la publicación esta asociciada. Si toma el respaldo  antes de configurar el la publicación, la inicialización del subscriptor puede fallar.

El siguiente es código ejemplo del respaldo

  1. -- Ejecute este código en el publicador
  2.  
  3. BACKUP DATABASE [publicacionDB] TO DISK = '\\Directorio compartido entre el suscriptor y el publicador\publicacionDB_FULL.bak'
  4. WITH FORMAT,INIT, STATS=5

Ir al Arriba

Restaurar el "full backup" en el subscriptor

Naturalmente, despues de tomar el backup, se comienza a restauralo en el servidor que va a servir como subscriptor, es importante no recuperar todavía la base de datos, para poder seguir aplicandole otros respaldos. tal y como lo muestra el siguiente código:

  1. -- Ejecute este código en el suscriptor
  2. RESTORE DATABASE [publicacionDB] FROM DISK = '\\Directorio compartido entre el suscriptor y el publicador\publicacionDB_FULL.bak'
  3. WITH NoRecovery, REPLACE, stats = 5

Ir al Arriba

Tomar un "Differential Backup" del publicador(Opcional)

Si la toma y la restauración del full backup tomó mucho tiempo, lo ideal es tomar un respaldo complementario para que la sincronización de transacciones sea el mínimo posible, a mi en lo personal me gusta la idea del diferencial, ya que no afecta la cadena de respaldos. El respaldo lo puede tomar tal y como lo muestra el siguiente código:

  1. -- Ejecute este código en el publicador
  2.  
  3. BACKUP DATABASE [publicacionDB] TO DISK = '\\Directorio compartido entre el suscriptor y el publicador\publicacionDB_DIFF.bak'
  4. WITH FORMAT,INIT, STATS=5, DIFFERENTIAL

Restaurar el "Differential Backup" en el subscriptor(Opcional)

Ya que hay un "Differential Backup" proceda a restaurarlo en el subscriptor, asegurese de no recuperar la misma, esta es una medida de protección en caso de que el repaldo falle, no tenga que volver a empezar de 0. El siguiente código muestra como hacérlo:

  1. -- Ejecute este código en el suscriptor
  2. RESTORE DATABASE [publicacionDB] FROM DISK = '\\Directorio compartido entre el suscriptor y el publicador\publicacionDB_DIFF.bak'
  3. WITH NoRecovery, stats = 5

Ir al Arriba

Recuperar la base de datos del subscriptor

Ya que la base de datos del subscriptor esta bastante cerca del publicador, es hora de recuperar la base de datos en el subscriptor, tal y como lo muestra el siguiente código:

  1. -- Ejecute este código en el suscriptor
  2.  
  3. RESTORE DATABASE [publicacionDB] WITH recovery

Ir al Arriba

Obtener procedimientos almacenados personalizados para replicación(Opcional)

Aunque este paso es opcional, cuando la publicación tiene procedimientos almacenados personalizados para el manejo de ciertas partes de la replicación misma, este paso se vuelme mandatorio, el siguiente codigo muestra como obtener estos procedimientos almacenados.

  1. -- Ejecute este código en el publicador
  2.  
  3. USE [publicacionDB]
  4.  
  5. EXEC sp_scriptpublicationcustomprocs 'Publicacion'

Una vez que se tienen los procedimientos almacenados, ejecutelos en el subscriptor.

Ir al Arriba

Desactivar triggers en suscriptor(Optional)

Muchas veces las bases de datos incluyen triggers dentro de su manejo de la información misma, debido a que la replicación en el publicador maneja esa lógica, el subscriptor no deberia de volver hacer los cálculos. Y si ademas estos trigger se encargan de hacer inserciones en tablas replicadas, una vez que replicación comience a enviar las instrucciones, esta va a comenzar a fallar.

El siguiente código va a retornar todos los triggers de la base de datos, y el código para desactivarlo:

  1. -- Ejecute este código en el suscriptor
  2.  
  3. USE [publicacionDB]
  4.  
  5. SELECT 'DISABLE TRIGGER DBO.' + T.name +' ON DBO.' + TA.name + ';'
  6. FROM SYS.triggers T
  7. INNER JOIN SYS.objects O ON O.OBJECT_ID = T.OBJECT_ID
  8. INNER JOIN SYS.TABLES TA ON TA.OBJECT_ID = O.PARENT_OBJECT_ID

Ir al Arriba

Agregar el suscriptor en el publicador

Ya que el subscriptor esta listo para comenzar a recibir transacciones del publicador, el siguiente paso es agregar el subscriptor a la publicación de la base de datos del publicador, es importante asegurarse que el valor de los siguientes parametros sea brindado:

  1. @sync_type = N'initialize with backup'
  2. @backupdevicetype ='Disk'
  3. @backupdevicename ='\\Directorio compartido entre el suscriptor y el publicador\publicacionDB_DIFF.bak'

, tal y como lo muestra el siguiente código:

  1. -- Ejecute este código en el publicador
  2. USE [publicacionDB]
  3. GO
  4. -- Agregar el suscriptor a la publicacion
  5. EXEC SP_ADDSUBSCRIPTION
  6. @publication = N'Publicacion',
  7. @subscriber = N'Suscriber Instance name',
  8. @destination_db = N'publicacionDB',
  9. @sync_type = N'initialize with backup',
  10. @backupdevicetype='Disk',
  11. @backupdevicename='\\Directorio compartido entre el suscriptor y el publicador\publicacionDB_DIFF.bak',
  12. @subscription_type = N'pull',
  13. @update_mode = N'read only'
  14. GO

Ir al Arriba

Configurar la suscripción en el suscriptor

Este es el último paso, el siguiente código muestra como configurar en el suscriptor la suscripción.

  1. -- Ejecute este código en el suscriptor
  2.  
  3. USE [publicacionDB]
  4. EXEC SP_ADDPULLSUBSCRIPTION @publisher = N'Servidor de la publicacion',
  5.     @publication = N'Publicacion',
  6.     @publisher_db = N'publicacionDB', @independent_agent = N'True',
  7.     @subscription_type = N'pull', @description = N'',
  8.     @update_mode = N'read only', @immediate_sync = 0
  9.  
  10. EXEC SP_ADDPULLSUBSCRIPTION_AGENT @publisher = N'Servidor de la publicacion',
  11.     @publisher_db = N'publicacionDB',
  12.     @publication = N'Publicacion',
  13.     @distributor = N'Servidor de la distribucion', @distributor_security_mode = 1,
  14.     @distributor_login = N'', @distributor_password = NULL,
  15.     @enabled_for_syncmgr = N'False', @frequency_type = 64,
  16.     @frequency_interval = 0, @frequency_relative_interval = 0,
  17.     @frequency_recurrence_factor = 0, @frequency_subday = 0,
  18.     @frequency_subday_interval = 0, @active_start_time_of_day = 0,
  19.     @active_end_time_of_day = 235959, @active_start_date = 20140909,
  20.     @active_end_date = 99991231,
  21.     @alt_snapshot_folder = N'\\Directorio del snapshot de la publicacion',
  22.     @working_directory = N'', @use_ftp = N'False',
  23.     @job_login = N'usuario para el job', @job_password = 'clave del usuario',
  24.     @publication_type = 0

Ir al Arriba

Espero esta pequeña guía les haya ayudado a configurar o reconfigurar el suscriptor.

 

Tags: