Comment puis-je résoudre les problèmes de T-Log saturé sur ma source RDS pour SQL Server lorsque la CDC est activée pour ma tâche AWS DMS ?

Lecture de 6 minute(s)
0

J’ai une tâche AWS Database Migration Service (AWS DMS) pour laquelle la capture des données de modification (CDC) est activée. Ma tâche utilise Amazon Relational Database Service (Amazon RDS) pour SQL Server comme source. Je rencontre des problèmes de type SQL Server T-Log saturé dans ma tâche AWS DMS.

Brève description

Si vous utilisez SQL Server comme source pour les tâches AWS DMS, activez la capture des données de modification (CDC) MS sur vos instances pour répliquer les modifications. Vous pouvez utiliser la MS-CDC pour Amazon RDS SQL Server, SQL Server sur site et SQL Server sur les instances Amazon Elastic Compute Cloud (Amazon EC2).

Une fois la CDC activée, à l’aide de la fonction fn_dblog(), elle suit et lit les modifications DML en cours à partir du fichier journal actif. Pour chaque table source, la CDC crée une table des modifications de la CDC correspondante.

Pour suivre les modifications, la CDC crée deux tâches :

  • Tâche de capture : analyse les T-logs, puis utilise la procédure de stockage sp_replcmds pour capturer et enregistrer les modifications dans la table des modifications correspondante.
  • Tâche de nettoyage : nettoie le suivi des modifications en fonction de la politique de conservation.

Pour afficher la valeur définie pour ces paramètres, exécutez cette procédure stockée :

EXEC sys.sp_cdc_help_jobs
  • Maxtrans - Nombre maximum de transactions à traiter au cours de chaque cycle d’analyse.
  • Maxscans - Nombre maximum de cycles d’analyse à exécuter pour extraire toutes les lignes du journal.
  • Intervalle d'interrogation - Nombre de secondes entre les cycles d'analyse du journal.

Sur Amazon RDS for SQL Server, les sauvegardes du journal de transactions sont effectuées toutes les cinq minutes conformément à la conception. Lors de la sauvegarde du journal de transactions, SQL Server tronque la partie inactive du journal de transactions. Cette partie contient des numéros de séquence de journal (LSN) qu'AWS DMS n'a pas lus. Par conséquent, AWS DMS risque de ne pas localiser les LSN requis pour répliquer les modifications de données souhaitées.

Pour éviter ce problème, AWS DMS dispose des options awsdms_truncation_safeguard et pollingInterval.

awsdms_truncation_safeguard : AWS DMS crée une table appelée awsdms_truncation_safeguard dans la base de données source. Ce tableau évite la troncature du journal de transactions en imitant une transaction dans la base de données.

Toutefois, si AWS DMS retarde la lecture des journaux pendant plus de 10 minutes, la tâche échoue à nouveau. Pour éviter ce problème, utilisez le paramètre pollingInterval. Pour plus d'informations, consultez la section Utilisation d'une base de données Microsoft SQL Server comme source pour AWS DMS.

**pollingInterval :**la valeur par défaut est fixée à cinq secondes pour les tâches de capture. Cela signifie que pollingInterval s'exécute toutes les cinq secondes, analyse le T-log pour y lire les modifications, puis marque ces journaux comme répliqués. Ensuite, il tronque les journaux.

Il est recommandé de définir la valeur pollingInterval sur >=3599. Cela évite que les tâches de capture ne s'exécutent trop fréquemment. Il configure également les T-logs afin qu'ils ne soient pas tronqués pendant une durée spécifiée.

Une base de données hautement transactionnelle peut aboutir à l'état complet du T-Log. La tâche échoue alors avec une erreur similaire à celle-ci :

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'

Résolution

Remarque : si des erreurs surviennent lors de l’exécution des commandes de l’Interface de la ligne de commande (AWS CLI), vérifiez que vous utilisez la version la plus récente d’AWS CLI.

Dépanner et résoudre les problèmes de SQL Server T-Log saturé lorsque la CDC est activée

Procédez comme suit pour dépanner et résoudre les problèmes de SQL Server T-Log saturé lorsque la CDC est activée.

1.    Vérifiez la taille de vos fichiers journaux de transactions :

DBCC SQLPERF(logspace)

2.    Si le journal de transactions est plein, exécutez la commande suivante pour voir le contenu du journal :

select name, log\_reuse\_wait\_desc from sys.databases where name = ' db\_name '
  • **Réplication :**la réplication a cessé de fonctionner ou ne lit pas les transactions actives.
  • **Active_transaction :**il y a une transaction ouverte.

S'il y a une transaction active, consultez la liste des transactions ouvertes :

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

**Remarque :**lorsque AWS DMS est en cours d'exécution, vous ne pouvez pas réduire le T-Log d'une base de données sur laquelle la CDC est activée. Arrêtez plutôt la tâche, puis attendez la sauvegarde des journaux pour tronquer les journaux de transactions. Ensuite, réduisez le T-Log de la base de données.

Réduire les fichiers T-log et REDÉMARRER la tâche

Après avoir nettoyé les journaux, réduisez les fichiers T-log, puis redémarrez la tâche :

1.    Arrêtez la tâche.

2.    Vérifiez l'état de la CDC, puis désactivez-la.

Vérifiez l'état 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%';

Désactivez la CDC au niveau de la base de données :

exec msdb.dbo.rds_cdc_disable_db '<db_name>'

Trouvez les tables qui font partie 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

Désactivez la CDC au niveau de la table :

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

3.    Vérifiez que la CDC est désactivée :

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

4.    Après avoir confirmé que la CDC est désactivée, attendez au moins 10 minutes, puis réduisez vos T-logs :

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

5.    Confirmez la taille des journaux :

DBCC SQLPERF(logspace)

6.    Activez à nouveau la CDC, puis redémarrez la tâche. La reprise de la tâche peut entraîner des transactions manquantes. Amazon RDS for SQL Server ne prend pas en charge l'accès au T-log archivé.

Informations connexes

Conditions préalables à l'utilisation de la réplication continue (CDC) à partir d'une source SQL Server

Paramètres recommandés lors de l'utilisation d'Amazon RDS for SQL Server comme source pour AWS DMS

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an