¿Cómo puedo solucionar los problemas de registro de transacciones lleno en el origen de RDS para SQL Server cuando la CDC está activada en la tarea de AWS DMS?

6 minutos de lectura
0

Tengo una tarea del servicio AWS Database Migration Service (AWS DMS) que tiene activada la captura de datos de cambios (CDC). Mi tarea usa el servicio Amazon Relational Database Service (Amazon RDS) para SQL Server como origen. Veo errores «Registro de transacciones de SQL Server lleno» en mi tarea de AWS DMS.

Descripción breve

Si utiliza SQL Server como origen para las tareas de AWS DMS, active la captura de datos de cambios (CDC) de MS en sus instancias para replicar los cambios. Puede usar MS-CDC para las instancias de Amazon RDS SQL Server, SQL Server local y SQL Server en Amazon Elastic Compute Cloud (Amazon EC2).

Una vez activada la CDC, esta herramienta utiliza la función fn_dblog() para leer los cambios de DML continuos y hacer un seguimiento de los mismos desde el archivo de registro activo. Para cada tabla de origen, la CDC crea una tabla de cambios de CDC correspondiente.

Para hacer un seguimiento de los cambios, la CDC crea dos trabajos:

  • Trabajo de captura: analiza los registros de transacciones y, a continuación, utiliza el procedimiento de almacenamiento sp_replcmds para capturar y registrar los cambios en la tabla de cambios correspondiente.
  • Trabajo de limpieza: limpia el seguimiento de los cambios según la política de retención.

Ejecute el siguiente procedimiento almacenado para ver el conjunto de valores de esta configuración:

EXEC sys.sp_cdc_help_jobs
  • Maxtrans: la cantidad máxima de transacciones a procesar en cada ciclo de análisis.
  • Maxscans: la cantidad máxima de ciclos de análisis que se deben ejecutar para extraer todas las filas del registro.
  • Pollinginterval: la cantidad de segundos entre los ciclos de análisis del registro.

En Amazon RDS para SQL Server, las copias de seguridad del registro de transacciones se realizan cada 5 minutos por diseño. Durante la copia de seguridad del registro de transacciones, SQL Server trunca la parte inactiva del registro de transacciones. Esta parte contiene números de secuencia de registro (LSN) que AWS DMS no leyó. Como resultado, es posible que AWS DMS no encuentre los LSN necesarios para replicar los cambios de datos deseados.

Para evitar este problema, AWS DMS cuenta con las opciones awsdms_truncation_safeguard y pollingInterval .

awsdms_truncation_safeguard: AWS DMS crea una tabla denominada awsdms_truncation_safeguard en la base de datos de origen. Esta tabla evita el truncamiento del registro de transacciones al imitar una transacción en la base de datos

Sin embargo, si AWS DMS retrasa la lectura de los registros más de 10 minutos, la tarea vuelve a fallar. Para evitar este problema, utilice el parámetro pollingInterval . Para obtener más información, consulte Uso de una base de datos de Microsoft SQL Server como origen para AWS DMS.

**pollingInterval:**El valor predeterminado se establece en 5 segundos para los trabajos de captura. Esto significa que pollingInterval se ejecuta cada 5 segundos, analiza el registro de transacciones para leer los cambios y, a continuación, marca estos registros como replicados. A continuación, trunca los registros.

Se recomienda establecer el valor de pollingInterval a >=3599. Esto evita que los trabajos de captura se ejecuten con demasiada frecuencia. También configura los registros de transacciones para que no se trunquen durante un período de tiempo específico.

Una base de datos altamente transaccional puede dar como resultado un estado completo del registro de transacciones. A continuación, la tarea falla y se produce un error similar al siguiente:

E: RetCode: SQL_ERROR SqlState: 42000 NativeError: 9002 Message: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The transaction
log for database 'yourdatabase' is full due to 'REPLICATION'

Resolución

**Nota:**Si recibe errores al ejecutar comandos de la interfaz de la línea de comandos de AWS (AWS CLI), asegúrese de utilizar la versión más reciente.

Solucione y resuelva los problemas de registro de transacciones de SQL Server lleno cuando la CDC esté activada

Complete los siguientes pasos para solucionar y resolver los problemas de registro de transacciones de SQL Server lleno cuando la CDC esté activada.

1.    Compruebe el tamaño de los archivos de registro de transacciones:

DBCC SQLPERF(logspace)

2.    Si el registro de transacciones está lleno, ejecute el siguiente comando para ver el contenido del registro:

select name, log\_reuse\_wait\_desc from sys.databases where name = ' db\_name '
  • Replication: La replicación ha dejado de funcionar o no lee las transacciones activas.
  • Active_transaction: Hay una transacción abierta.

Si hay una transacción activa, consulte la lista de transacciones abiertas:

select \* from sys.sysprocesses where open\_tran=1

Nota: No es posible reducir el registro de transacciones de una base de datos que tiene la CDC activada cuando AWS DMS se encuentra en estado de ejecución. En cambio, detenga la tarea y espere a que la copia de seguridad de los registros trunque los registros de transacciones. A continuación, reduzca el registro de transacciones de la base de datos.

Reduzca los archivos de registro de transacciones y REINICIE la tarea

Una vez que se hayan limpiado los registros, reduzca los archivos de registro de transacciones y, a continuación, reinicie la tarea:

1.    Detenga la tarea.

2.    Compruebe el estado de la CDC y, a continuación, desactive la CDC.

Compruebe el estado de la CDC:

select b.name,a.run\_date,a.run\_status from msdb.dbo.sysjobhistory as a
join msdb.dbo.sysjobs as b on a.job\_id=b.job\_id
where b.name like '%cdc%capture%';

Desactive la CDC a nivel de base de datos:

exec msdb.dbo.rds_cdc_disable_db '<db_name>'

Busque tablas que formen parte de la CDC:

USE db\_name
GO
SELECT s.name AS Schema\_Name, tb.name AS Table\_Name
, tb.object\_id, tb.type, tb.type\_desc, tb.is\_tracked\_by\_cdc
FROM sys.tables tb
INNER JOIN sys.schemas s on s.schema\_id = tb.schema\_id
WHERE tb.is\_tracked\_by\_cdc = 1

Desactive la CDC a nivel de tabla:

use <db_name>
EXEC sys.sp_cdc_disable_table
@source_schema = N'<schema>',
@source_name = N'<table>',
@capture_instance = N'<schema_table>'

3.    Compruebe que la CDC esté desactivada:

select is_cdc_enabled, * from sys.databases where name = 'dbname' Value 1- enabled and 0 -Disabled

4.    Tras confirmar que la CDC esté desactivada, espere al menos 10 minutos y, a continuación, reduzca los registros de transacciones:

use <dbname>
SELECT file_id, name
FROM sys.database_files;
GO
USE <dbname>
GO
DBCC SHRINKFILE (N'dbname_log' , 0, TRUNCATEONLY)
GO

5.    Confirme el tamaño de los registros:

DBCC SQLPERF(logspace)

6.    Vuelva a activar la CDC y, a continuación, reinicie la tarea. La reanudación de la tarea podría causar la pérdida de transacciones. Amazon RDS para SQL Server no admite el acceso al registro de transacciones archivado.

Información relacionada

Requisitos previos para utilizar la replicación continua (CDC) desde un origen de SQL Server

Configuración recomendada al utilizar Amazon RDS para SQL Server como origen para AWS DMS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año