El rincón de JMACOE

Usando sp_repldone para marcar todas las transacciones pendientes como si hubieran sido replicadas

Pensé que podría ser útil si público un ejemplo usando sp_repldone para marcar todas las transacciones pendientes como «replicadas». Hemos utilizado este comando para «saltar» un comando DELETE en lotes que fue ejecutado por error en el publicador. Esto impidió que el DELETE sea empujado a la base de datos de distribución y luego hacia los suscriptores. Ahora nos podría haber permitido el LOG Reader para recoger las filas entonces tienen que saltar el Agente de distribución, pero el DELETE fue de más de 100 millones de filas. Encontramos más fácil saltar ellos en el LOG Reader.

Para recuperar los datos que puede restaurar el publicador o volver a cargar los registros borrados desde la tabla del suscriptor. Para una base de datos de 10 TB, cargar los registros de una tabla era mucho más rápido que una completa restauración.

Este comando se encuentra en los SQL Server Books Online (de todas las versiones). El estado del BOL de la publicación debe ser inicializado. Se trata de una recomendación para asegurar que el publicador y el suscriptor tengan los mismos datos. Sin embargo, como veremos, esto no siempre es necesario.

--1st update transaction 
  update [SalesLT].[Customer]
  set FirstName = 'Tran1'
  where CustomerID = 1
 
--Start LogReader for 1 transactions (-continuous option was removed)
--Start Distributor
--Verify 'Tran1' was replicated to subscriber   
  SELECT top 1 CustomerID, FirstName
  FROM AdventureWorks_Peer_B.[SalesLT].[Customer]
 
--2nd update transaction 
  update [SalesLT].[Customer]
  set FirstName = 'Tran2'
  where CustomerID = 1
 
--Show transactions pending in the Transaction Log 
  sp_replshowcmds
 
       xact_seqno = 0x00000180000000ED0004
       {CALL [dbo].[sp_MSupd_SalesLTCustomer] (,,,N'Tran2',,,,,,,,,,,,1,0x0800)}
 
--The DBCC OPENTRAN command be used to show if there are pending transactions.
--Notice the “Oldest non-distributed LSN” is the BEGIN Tran LSN for the same UPDATE
  DBCC OPENTRAN
 
  Replicated Transaction Information:
        Oldest distributed LSN     : (384:235:4)
        Oldest non-distributed LSN : (384:237:1) >>>>>0x00000180 000000ED 0001
       
 
--The FN_DBLOG function can display the log contents from the
--     Begin Tran (DBCC OPENTRAN)    00000180:000000ed:0001
--   to the
--     Commit Tran(sp_replshowcmds)  00000180:000000ed:0004
  select  [Current LSN],[Operation],[Transaction ID], Left([Description],20)
  from::fn_dblog('0x00000180:000000ED:0001','0x00000180:000000ED:0004')
Current LSN             Operation                      Transaction ID 
----------------------- ------------------------------ -------------- --------------------
00000180:000000ed:0001  LOP_BEGIN_XACT                 0000:0001d5c2  UPDATE;0x01050000000
00000180:000000ed:0002  LOP_DELETE_ROWS                0000:0001d5c2  REPLICATE
00000180:000000ed:0003  LOP_INSERT_ROWS                0000:0001d5c2  REPLICATE
00000180:000000ed:0004  LOP_COMMIT_XACT                0000:0001d5c2  REPLICATE

 
--Mark all transactions as having been replicated.
  EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
 
 
--Re-run sp_replshowcmds, no pending transactions.
  sp_replshowcmds
 
--DBCC OPENTRAN 
  DBCC OPENTRAN
No active open transactions.
--Flush Transaction Log article cache
  sp_replflush
 
--3rd update transaction
  update [SalesLT].[Customer]
  set FirstName = 'Tran3'
  where CustomerID = 1
 
 
--Start LogReader
--Start Distributor
--Verify 'Tran3' was replicated to subscriber   
  SELECT top 1 CustomerID, FirstName
  FROM AdventureWorks_Peer_A.[SalesLT].[Customer]
 
  SELECT top 1 CustomerID, FirstName
  FROM AdventureWorks_Peer_B.[SalesLT].[Customer]
 
       CustomerID  FirstName
       ----------- ------------------------------
       1           Tran3

Nota que Tran3 se replica correctamente al suscriptor. Entonces ¿Cuál es el problema? Bueno, si hubiera habido otra transacción pendiente de la cual no sabía nada, también se han marcado como replicada y que no se ha recogido por el LOG Reader. Esto resultara con el publicador y el suscriptor fuera de sincronización. Para corregir, que hay utilizar la utilidad TableDiff.exe incluida con SQL Server para encontrar las diferencias fila/columna, o inicializar el suscriptor

Los Hands on demos son una gran manera de aprender de replicación antes de que surjan problemas. Pruebe usted mismo esta demostración rápida. Entonces si se pueden insertar dos operaciones, pero sólo marca la primera operacion como replicada mantenimiento la segunda como activa para ser recogida por el LOG Reader.

También puede ver el video de demostración en YouTube.

Comparte y diviertete: