

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Capture des modifications de données pour une réplication continue à partir de SQL Server
<a name="CHAP_Source.SQLServer.CDC"></a>

Cette rubrique décrit comment configurer la réplication CDC sur une source SQL Server.

**Topics**
+ [Capture des modifications de données pour SQL Server autogéré sur site ou sur Amazon EC2](#CHAP_Source.SQLServer.CDC.Selfmanaged)
+ [Configuration de la réplication continue sur une instance de base de données SQL Server cloud](#CHAP_Source.SQLServer.Configuration)

## Capture des modifications de données pour SQL Server autogéré sur site ou sur Amazon EC2
<a name="CHAP_Source.SQLServer.CDC.Selfmanaged"></a>

Pour capturer les modifications à partir d’une base de données Microsoft SQL Server source, assurez-vous que la base de données est configurée pour des sauvegardes complètes. Configurez la base de données en mode récupération complète ou en mode journalisation en bloc.

Pour une source SQL Server autogérée, AWS DMS utilise ce qui suit :

**Réplication Microsoft**  
Pour capturer les modifications pour des tables comportant des clés primaires. Vous pouvez le configurer automatiquement en octroyant des privilèges d'administrateur système à l'utilisateur du AWS DMS point de terminaison sur l'instance SQL Server source. Vous pouvez également suivre les étapes décrites dans cette section pour préparer la source et utiliser un utilisateur ne disposant pas des privilèges d'administrateur système pour le AWS DMS point de terminaison.

**MS-CDC**  
Pour capturer les modifications pour des tables sans clés primaires. Activez MS-CDC au niveau de la base de données et individuellement pour toutes les tables.

Lorsque vous configurez une base de données SQL Server pour la réplication continue (CDC), vous pouvez procéder de différentes manières :
+ Configurez la réplication continue en utilisant le rôle sysadmin.
+ Configurez la réplication continue pour qu'elle n'utilise pas le rôle sysadmin.

**Note**  
Vous pouvez utiliser le script suivant pour rechercher toutes les tables sans clé primaire ou unique :  

```
USE [DBname]
SELECT SCHEMA_NAME(schema_id) AS schema_name, name AS table_name
FROM sys.tables
WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 0
        AND  OBJECTPROPERTY(object_id, 'TableHasUniqueCnst') = 0
ORDER BY schema_name, table_name;
```

### Configuration de la réplication continue sur une instance SQL Server autogérée
<a name="CHAP_Source.SQLServer.CDC.MSCDC"></a>

Cette section contient des informations sur la configuration de la réplication continue sur une instance SQL Server autogérée en utilisant ou non le rôle sysadmin.

**Topics**
+ [Configuration de la réplication continue sur une instance SQL Server autogérée : Utilisation du rôle sysadmin](#CHAP_Source.SQLServer.CDC.MSCDC.Sysadmin)
+ [Configuration de la réplication continue sur une instance SQL Server autonome : sans le rôle sysadmin](#CHAP_SupportScripts.SQLServer.standalone)
+ [Configuration de la réplication continue sur une instance SQL Server dans un environnement de groupe de disponibilité : sans le rôle sysadmin](#CHAP_SupportScripts.SQLServer.ag)

#### Configuration de la réplication continue sur une instance SQL Server autogérée : Utilisation du rôle sysadmin
<a name="CHAP_Source.SQLServer.CDC.MSCDC.Sysadmin"></a>

AWS DMS la réplication continue pour SQL Server utilise la réplication native de SQL Server pour les tables dotées de clés primaires et la capture des données de modification (CDC) pour les tables sans clés primaires.

Avant de configurer la réplication continue, consultez [Conditions préalables pour l’utilisation de la réplication continue (CDC) à partir d’une source SQL Server](CHAP_Source.SQLServer.md#CHAP_Source.SQLServer.Prerequisites). 

Pour les tables avec des clés primaires, AWS DMS vous pouvez généralement configurer les artefacts requis sur la source. En revanche, pour les instances SQL Server source autogérées, assurez-vous de configurer manuellement la distribution SQL Server en premier. Ensuite, les utilisateurs de la AWS DMS source disposant d'une autorisation d'administrateur système peuvent créer automatiquement la publication pour les tables avec des clés primaires.

Pour vérifier si la distribution a déjà été configurée, exécutez la commande suivante.

```
sp_get_distributor
```

Si le résultat est `NULL` pour la distribution de colonnes, cela signifie que la distribution n’est pas configurée. Vous pouvez procéder comme suit pour configurer la distribution.<a name="CHAP_Source.SQLServer.CDC.MSCDC.Setup"></a>

**Pour configurer la distribution**

1. Connectez-vous à la base de données source SQL Server à l’aide de l’outil SQL Server Management Studio (SSMS).

1. Ouvrez le menu contextuel (clic droit) pour le dossier **Replication**, puis choisissez **Configurer la distribution**. L’assistant Configurer la distribution s’affiche. 

1. Suivez les instructions de l’assistant pour entrer les valeurs par défaut et créer la distribution.<a name="CHAP_Source.SQLServer.CDC.MSCDC.Setup.CDC"></a>

**Pour configurer la CDC**

AWS DMS la version 3.4.7 et les versions ultérieures peuvent configurer MS CDC pour votre base de données et toutes vos tables automatiquement si vous n'utilisez pas de réplique en lecture seule. Pour utiliser cette fonctionnalité, définissez l’ECA `SetUpMsCdcForTables` sur true. Pour plus d'informations sur ECAs, voir[Paramètres de point de terminaison](CHAP_Source.SQLServer.md#CHAP_Source.SQLServer.ConnectionAttrib).

Pour les versions AWS DMS antérieures à 3.4.7, ou pour une réplique en lecture seule en tant que source, effectuez les opérations suivantes :

1. Pour les tables sans clés primaires, configurez MS-CDC pour la base de données. Pour ce faire, utilisez un compte auquel le rôle sysadmin est affecté et exécutez la commande suivante.

   ```
   use [DBname]
   EXEC sys.sp_cdc_enable_db
   ```

1. Configurez ensuite MS-CDC pour chacune des tables sources. Pour chaque table disposant de clés uniques mais ne disposant pas de clé primaire, exécutez la requête suivante afin de configurer MS-CDC.

   ```
   exec sys.sp_cdc_enable_table
   @source_schema = N'schema_name',
   @source_name = N'table_name',
   @index_name = N'unique_index_name',
   @role_name = NULL,
   @supports_net_changes = 1
   GO
   ```

1. Pour chaque table ne disposant pas de clé primaire ou de clé unique, exécutez la requête suivante afin de configurer MS-CDC.

   ```
   exec sys.sp_cdc_enable_table
   @source_schema = N'schema_name',
   @source_name = N'table_name',
   @role_name = NULL
   GO
   ```

Pour plus d'informations sur la configuration de MS-CDC pour des tables spécifiques, consultez la [documentation SQL Server](https://msdn.microsoft.com/en-us/library/cc627369.aspx). 

#### Configuration de la réplication continue sur une instance SQL Server autonome : sans le rôle sysadmin
<a name="CHAP_SupportScripts.SQLServer.standalone"></a>

Cette section décrit comment configurer la réplication continue pour une source de base de données SQL Server autonome qui n’exige pas que le compte d’utilisateur dispose des privilèges sysadmin.

**Note**  
Après avoir exécuté les étapes de cette section, l’utilisateur DMS qui n’est pas un administrateur système sera autorisé à effectuer les étapes suivantes :  
Lire les modifications du journal de transactions en ligne
Accéder au disque pour lire les modifications des fichiers de sauvegarde des journaux de transactions
Ajouter ou modifier la publication utilisée par DMS
Ajouter des articles à la publication

1. Configurez Microsoft SQL Server pour la réplication comme décrit dans [Capture des modifications de données pour une réplication continue à partir de SQL Server](#CHAP_Source.SQLServer.CDC).

1. Activez la réplication Microsoft sur la base de données source. Cela peut être fait manuellement ou en exécutant la tâche une fois en tant qu’utilisateur sysadmin.

1. Créez le schéma `awsdms` sur la base de données source à l’aide du script suivant :

   ```
   use master
   go
   create schema awsdms
   go
   
   
   -- Create the table valued function [awsdms].[split_partition_list] on the Master database, as follows:
   USE [master]
   GO
   
   set ansi_nulls on
   go
   
   set quoted_identifier on
   go
   
   if (object_id('[awsdms].[split_partition_list]','TF')) is not null
   
   drop function [awsdms].[split_partition_list];
   
   go
   
   create function [awsdms].[split_partition_list]
   
   (
   
   @plist varchar(8000), --A delimited list of partitions
   
   @dlm nvarchar(1) --Delimiting character
   
   )
   
   returns @partitionsTable table --Table holding the BIGINT values of the string fragments
   
   (
   
   pid bigint primary key
   
   )   
   
   as
   
   begin
   
   declare @partition_id bigint;
   
   declare @dlm_pos integer;
   
   declare @dlm_len integer;
   
   set @dlm_len = len(@dlm);
   
   while (charindex(@dlm,@plist)>0)
   
   begin
   
   set @dlm_pos = charindex(@dlm,@plist);
   
   set @partition_id = cast( ltrim(rtrim(substring(@plist,1,@dlm_pos-1))) as bigint);
   
   insert into @partitionsTable (pid) values (@partition_id)
   
   set @plist = substring(@plist,@dlm_pos+@dlm_len,len(@plist));
   
   end
   
   set @partition_id = cast (ltrim(rtrim(@plist)) as bigint);
   
   insert into @partitionsTable (pid) values ( @partition_id );
   
   return
   
   end
   
   GO
   ```

1. Créez la procédure `[awsdms].[rtm_dump_dblog]` sur la base de données Master à l’aide du script suivant :

   ```
   use [MASTER]
   
   go
   
   if (object_id('[awsdms].[rtm_dump_dblog]','P')) is not null drop procedure [awsdms].[rtm_dump_dblog];
   go
   
   
   set ansi_nulls on
   go
   
   set quoted_identifier on
   GO
   
   
   
   CREATE procedure [awsdms].[rtm_dump_dblog]
   
   (
   
   @start_lsn varchar(32),
   
   @seqno integer,
   
   @filename varchar(260),
   
   @partition_list varchar(8000), -- A comma delimited list: P1,P2,... Pn
   
   @programmed_filtering integer,
   
   @minPartition bigint,
   
   @maxPartition bigint
   
   )
   
   as begin
   
   declare @start_lsn_cmp varchar(32); -- Stands against the GT comparator
   
   SET NOCOUNT ON -- – Disable "rows affected display"
   
   set @start_lsn_cmp = @start_lsn;
   
   if (@start_lsn_cmp) is null
   
   set @start_lsn_cmp = '00000000:00000000:0000';
   
   if (@partition_list is null)
   
   begin
   
   RAISERROR ('Null partition list waspassed',16,1);
   
   return
   
   end
   
   if (@start_lsn) is not null
   
   set @start_lsn = '0x'+@start_lsn;
   
   if (@programmed_filtering=0)
   
   
   
   SELECT
   
   [Current LSN],
   
   [operation],
   
   [Context],
   
   [Transaction ID],
   
   [Transaction Name],
   
   [Begin Time],
   
   [End Time],
   
   [Flag Bits],
   
   [PartitionID],
   
   [Page ID],
   
   [Slot ID],
   
   [RowLog Contents 0],
   
   [Log Record],
   
   [RowLog Contents 1]
   
   FROM
   
   fn_dump_dblog (
   
   @start_lsn, NULL, N'DISK', @seqno, @filename,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default)
   
   where [Current LSN] collate SQL_Latin1_General_CP1_CI_AS > @start_lsn_cmp collate SQL_Latin1_General_CP1_CI_AS
   
   and
   
   (
   
   ( [operation] in ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_ABORT_XACT') )
   
   or
   
   ( [operation] in ('LOP_INSERT_ROWS','LOP_DELETE_ROWS','LOP_MODIFY_ROW')
   
   and
   
   ( ( [context] in ('LCX_HEAP','LCX_CLUSTERED','LCX_MARK_AS_GHOST') ) or ([context] = 'LCX_TEXT_MIX' and (datalength([RowLog Contents 0]) in (0,1))))
   
   and [PartitionID] in ( select * from master.awsdms.split_partition_list (@partition_list,','))
   
   )
   
   or
   
   ([operation] = 'LOP_HOBT_DDL')
   
   )
   
   
   else
   
   
   SELECT
   
   [Current LSN],
   
   [operation],
   
   [Context],
   
   [Transaction ID],
   
   [Transaction Name],
   
   [Begin Time],
   
   [End Time],
   
   [Flag Bits],
   
   [PartitionID],
   
   [Page ID],
   
   [Slot ID],
   
   [RowLog Contents 0],
   
   [Log Record],
   
   [RowLog Contents 1] -- After Image
   
   FROM
   
   fn_dump_dblog (
   
   @start_lsn, NULL, N'DISK', @seqno, @filename,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default,
   
   default, default, default, default, default, default, default)
   
   where [Current LSN] collate SQL_Latin1_General_CP1_CI_AS > @start_lsn_cmp collate SQL_Latin1_General_CP1_CI_AS
   
   and
   
   (
   
   ( [operation] in ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_ABORT_XACT') )
   
   or
   
   ( [operation] in ('LOP_INSERT_ROWS','LOP_DELETE_ROWS','LOP_MODIFY_ROW')
   
   and
   
   ( ( [context] in ('LCX_HEAP','LCX_CLUSTERED','LCX_MARK_AS_GHOST') ) or ([context] = 'LCX_TEXT_MIX' and (datalength([RowLog Contents 0]) in (0,1))))
   
   and ([PartitionID] is not null) and ([PartitionID] >= @minPartition and [PartitionID]<=@maxPartition)
   
   )
   
   or
   
   ([operation] = 'LOP_HOBT_DDL')
   
   )
   
   
   
   SET NOCOUNT OFF -- Re-enable "rows affected display"
   
   end
   
   GO
   ```

1. Créez le certificat sur la base de données Master à l’aide du script suivant :

   ```
   Use [master]
   Go
   
   CREATE CERTIFICATE [awsdms_rtm_dump_dblog_cert] ENCRYPTION BY PASSWORD = N'@5trongpassword'
   
   WITH SUBJECT = N'Certificate for FN_DUMP_DBLOG Permissions';
   ```

1. Créez la connexion à partir du certificat à l’aide du script suivant : 

   ```
   Use [master]
   Go
   
   CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
   ```

1. Ajoutez la connexion au rôle serveur sysadmin à l’aide du script suivant :

   ```
   ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
   ```

1. Ajoutez la signature à [master].[awsdms].[rtm\$1dump\$1dblog] utilisant le certificat, à l’aide du script suivant : 

   ```
   Use [master]
   GO
   ADD SIGNATURE
   TO [master].[awsdms].[rtm_dump_dblog] BY CERTIFICATE [awsdms_rtm_dump_dblog_cert] WITH PASSWORD = '@5trongpassword';
   ```
**Note**  
Si vous recréez la procédure stockée, vous devez ajouter à nouveau la signature.

1. Créez [awsdms]. [rtm\$1position\$11st\$1timestamp] dans la base de données principale à l’aide du script suivant :

   ```
   use [master]
       if object_id('[awsdms].[rtm_position_1st_timestamp]','P') is not null
       DROP PROCEDURE [awsdms].[rtm_position_1st_timestamp];
       go
       create procedure [awsdms].[rtm_position_1st_timestamp]
       (
       @dbname                sysname,      -- Database name
       @seqno                 integer,      -- Backup set sequence/position number within file
       @filename              varchar(260), -- The backup filename
       @1stTimeStamp          varchar(40)   -- The timestamp to position by
       ) 
       as begin
   
       SET NOCOUNT ON       -- Disable "rows affected display"
   
       declare @firstMatching table
       (
       cLsn varchar(32),
       bTim datetime
       )
   
       declare @sql nvarchar(4000)
       declare @nl                       char(2)
       declare @tb                       char(2)
       declare @fnameVar                 nvarchar(254) = 'NULL'
   
       set @nl  = char(10); -- New line
       set @tb  = char(9)   -- Tab separator
   
       if (@filename is not null)
       set @fnameVar = ''''+@filename +''''
   
       set @sql='use ['+@dbname+'];'+@nl+
       'select top 1 [Current LSN],[Begin Time]'+@nl+
       'FROM fn_dump_dblog (NULL, NULL, NULL, '+ cast(@seqno as varchar(10))+','+ @fnameVar+','+@nl+
       @tb+'default, default, default, default, default, default, default,'+@nl+
       @tb+'default, default, default, default, default, default, default,'+@nl+
       @tb+'default, default, default, default, default, default, default,'+@nl+
       @tb+'default, default, default, default, default, default, default,'+@nl+
       @tb+'default, default, default, default, default, default, default,'+@nl+
       @tb+'default, default, default, default, default, default, default,'+@nl+
       @tb+'default, default, default, default, default, default, default,'+@nl+
       @tb+'default, default, default, default, default, default, default,'+@nl+
       @tb+'default, default, default, default, default, default, default)'+@nl+
       'where operation=''LOP_BEGIN_XACT''' +@nl+
       'and [Begin Time]>= cast('+''''+@1stTimeStamp+''''+' as datetime)'+@nl
   
       --print @sql
       delete from  @firstMatching 
       insert into @firstMatching  exec sp_executesql @sql    -- Get them all
   
       select top 1 cLsn as [matching LSN],convert(varchar,bTim,121) as [matching Timestamp] from @firstMatching;
   
       SET NOCOUNT OFF      -- Re-enable "rows affected display"
   
       end
       GO
   ```

1. Créez le certificat sur la base de données Master à l’aide du script suivant :

   ```
   Use [master]
   Go
   CREATE CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert]
   ENCRYPTION BY PASSWORD = '@5trongpassword'
   WITH SUBJECT = N'Certificate for FN_POSITION_1st_TIMESTAMP Permissions';
   ```

1. Créez la connexion à partir du certificat à l’aide du script suivant :

   ```
   Use [master]
   Go
   CREATE LOGIN awsdms_rtm_position_1st_timestamp_login FROM CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert];
   ```

1. Ajoutez la connexion au rôle sysadmin à l’aide du script suivant :

   ```
   ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
   ```

1. Ajoutez la signature à [master].[awsdms].[rtm\$1position\$11st\$1timestamp] en utilisant le certificat à l’aide du script suivant :

   ```
   Use [master]
       GO
       ADD SIGNATURE
       TO [master].[awsdms].[rtm_position_1st_timestamp]
       BY CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert]
       WITH PASSWORD = '@5trongpassword';
   ```

1. Accordez à l’utilisateur DMS l’accès lui permettant d’exécuter la nouvelle procédure stockée à l’aide du script suivant :

   ```
   use master
   go
   GRANT execute on [awsdms].[rtm_position_1st_timestamp] to dms_user;
   ```

1. Créez un utilisateur avec les autorisations et les rôles suivants dans chacune des bases de données suivantes :
**Note**  
Vous devez créer le compte d’utilisateur dmsnosysadmin avec le même SID sur chaque réplica. La requête SQL suivante peut aider à vérifier la valeur SID du compte dmsnosysadmin sur chaque réplica. Pour plus d’informations sur la création d’un utilisateur, consultez [CREATE USER (Transact-SQL)](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql) dans la [documentation sur Microsoft SQL Server](https://learn.microsoft.com/en-us/sql/). Pour plus d’informations sur la création de comptes d’utilisateur SQL pour la base de données Azure SQL, consultez [Géoréplication active](https://learn.microsoft.com/en-us/azure/azure-sql/database/active-geo-replication-overview).

   ```
   use master
   go
   grant select on sys.fn_dblog to [DMS_user]
   grant view any definition to [DMS_user]
   grant view server state to [DMS_user]--(should be granted to the login).
   grant execute on sp_repldone to [DMS_user]
   grant execute on sp_replincrementlsn to [DMS_user]
   grant execute on sp_addpublication to [DMS_user]
   grant execute on sp_addarticle to [DMS_user]
   grant execute on sp_articlefilter to [DMS_user]
   grant select on [awsdms].[split_partition_list] to [DMS_user]
   grant execute on [awsdms].[rtm_dump_dblog] to [DMS_user]
   ```

   ```
   use msdb
   go
   grant select on msdb.dbo.backupset to self_managed_user
   grant select on msdb.dbo.backupmediafamily to self_managed_user
   grant select on msdb.dbo.backupfile to self_managed_user
   ```

   Exécutez le script suivant sur la base de données source :

   ```
   use Source_DB
       Go
       EXEC sp_addrolemember N'db_owner', N'DMS_user'
   ```

1. Enfin, ajoutez un attribut de connexion supplémentaire (ECA) au point de terminaison SQL Server source :

   ```
   enableNonSysadminWrapper=true;
   ```

#### Configuration de la réplication continue sur une instance SQL Server dans un environnement de groupe de disponibilité : sans le rôle sysadmin
<a name="CHAP_SupportScripts.SQLServer.ag"></a>

Cette section décrit comment configurer la réplication continue pour une source de base de données SQL Server dans un environnement de groupe de disponibilité qui n’exige pas que le compte d’utilisateur dispose des privilèges sysadmin.

**Note**  
Après avoir exécuté les étapes de cette section, l’utilisateur DMS qui n’est pas un administrateur système sera autorisé à effectuer les étapes suivantes :  
Lire les modifications du journal de transactions en ligne
Accéder au disque pour lire les modifications des fichiers de sauvegarde des journaux de transactions
Ajouter ou modifier la publication utilisée par DMS
Ajouter des articles à la publication

**Pour configurer la réplication continue sans utiliser l’utilisateur sysadmin dans un environnement de groupe de disponibilité**

1. Configurez Microsoft SQL Server pour la réplication comme décrit dans [Capture des modifications de données pour une réplication continue à partir de SQL Server](#CHAP_Source.SQLServer.CDC).

1. Activez la réplication Microsoft sur la base de données source. Cela peut être fait manuellement ou en exécutant la tâche une fois en ayant recours à un utilisateur sysadmin.
**Note**  
Vous devez configurer le distributeur de réplication Microsoft comme local ou de manière à autoriser l’accès aux utilisateurs non sysadmin via le serveur lié associé.

1. Si l’option de point de terminaison **Utiliser exclusivement sp\$1repldone au sein d’une seule tâche** est activée, arrêtez la tâche Log Reader de réplication Microsoft.

1. Sur chaque réplica, procédez comme suit :

   1. Créez le schéma `[awsdms]`[awsdms] dans la base de données Master :

      ```
      CREATE SCHEMA [awsdms]
      ```

   1. Créez la fonction à valeur de table `[awsdms].[split_partition_list]` sur la base de données Master :

      ```
      USE [master]
      GO
      
      SET ansi_nulls on
      GO
        
      SET quoted_identifier on
      GO
      
      IF (object_id('[awsdms].[split_partition_list]','TF')) is not null
        DROP FUNCTION [awsdms].[split_partition_list];
      GO
      
      CREATE FUNCTION [awsdms].[split_partition_list] 
      ( 
        @plist varchar(8000),    --A delimited list of partitions    
        @dlm nvarchar(1)    --Delimiting character
      ) 
      RETURNS @partitionsTable table --Table holding the BIGINT values of the string fragments
      (
        pid bigint primary key
      ) 
      AS 
      BEGIN
        DECLARE @partition_id bigint;
        DECLARE @dlm_pos integer;
        DECLARE @dlm_len integer;  
        SET @dlm_len = len(@dlm);
        WHILE (charindex(@dlm,@plist)>0)
        BEGIN 
          SET @dlm_pos = charindex(@dlm,@plist);
          SET @partition_id = cast( ltrim(rtrim(substring(@plist,1,@dlm_pos-1))) as bigint);
          INSERT into @partitionsTable (pid) values (@partition_id)
          SET @plist = substring(@plist,@dlm_pos+@dlm_len,len(@plist));
        END 
        SET @partition_id = cast (ltrim(rtrim(@plist)) as bigint);
        INSERT into @partitionsTable (pid) values (  @partition_id  );
        RETURN
      END
      GO
      ```

   1. Créez la procédure `[awsdms].[rtm_dump_dblog]` sur la base de données Master :

      ```
      USE [MASTER] 
      GO
      
      IF (object_id('[awsdms].[rtm_dump_dblog]','P')) is not null
        DROP PROCEDURE [awsdms].[rtm_dump_dblog]; 
      GO
      
      SET ansi_nulls on
      GO 
      
      SET quoted_identifier on 
      GO
                                          
      CREATE PROCEDURE [awsdms].[rtm_dump_dblog]
      (
        @start_lsn            varchar(32),
        @seqno                integer,
        @filename             varchar(260),
        @partition_list       varchar(8000), -- A comma delimited list: P1,P2,... Pn
        @programmed_filtering integer,
        @minPartition         bigint,
        @maxPartition         bigint
      ) 
      AS 
      BEGIN
      
        DECLARE @start_lsn_cmp varchar(32); -- Stands against the GT comparator
      
        SET NOCOUNT ON  -- Disable "rows affected display"
      
        SET @start_lsn_cmp = @start_lsn;
        IF (@start_lsn_cmp) is null
          SET @start_lsn_cmp = '00000000:00000000:0000';
      
        IF (@partition_list is null)
          BEGIN
            RAISERROR ('Null partition list was passed',16,1);
            return
            --set @partition_list = '0,';    -- A dummy which is never matched
          END
      
        IF (@start_lsn) is not null
          SET @start_lsn = '0x'+@start_lsn;
      
        IF (@programmed_filtering=0)
          SELECT
            [Current LSN],
            [operation],
            [Context],
            [Transaction ID],
            [Transaction Name],
            [Begin Time],
            [End Time],
            [Flag Bits],
            [PartitionID],
            [Page ID],
            [Slot ID],
            [RowLog Contents 0],
            [Log Record],
            [RowLog Contents 1] -- After Image
          FROM
            fn_dump_dblog (
              @start_lsn, NULL, N'DISK', @seqno, @filename,
              default, default, default, default, default, default, default,
              default, default, default, default, default, default, default,
              default, default, default, default, default, default, default,
              default, default, default, default, default, default, default,
              default, default, default, default, default, default, default,
              default, default, default, default, default, default, default,
              default, default, default, default, default, default, default,
              default, default, default, default, default, default, default,
              default, default, default, default, default, default, default)
          WHERE 
            [Current LSN] collate SQL_Latin1_General_CP1_CI_AS > @start_lsn_cmp collate SQL_Latin1_General_CP1_CI_AS -- This aims for implementing FN_DBLOG based on GT comparator.
            AND
            (
              (  [operation] in ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_ABORT_XACT') )
              OR
              (  [operation] in ('LOP_INSERT_ROWS','LOP_DELETE_ROWS','LOP_MODIFY_ROW')
                AND
                ( ( [context]   in ('LCX_HEAP','LCX_CLUSTERED','LCX_MARK_AS_GHOST') ) or ([context] = 'LCX_TEXT_MIX') )
                AND       
                [PartitionID] in ( select * from master.awsdms.split_partition_list (@partition_list,','))
              )
            OR
            ([operation] = 'LOP_HOBT_DDL')
          )
          ELSE
            SELECT
              [Current LSN],
              [operation],
              [Context],
              [Transaction ID],
              [Transaction Name],
              [Begin Time],
              [End Time],
              [Flag Bits],
              [PartitionID],
              [Page ID],
              [Slot ID],
              [RowLog Contents 0],
              [Log Record],
              [RowLog Contents 1] -- After Image
            FROM
              fn_dump_dblog (
                @start_lsn, NULL, N'DISK', @seqno, @filename,
                default, default, default, default, default, default, default,
                default, default, default, default, default, default, default,
                default, default, default, default, default, default, default,
                default, default, default, default, default, default, default,
                default, default, default, default, default, default, default,
                default, default, default, default, default, default, default,
                default, default, default, default, default, default, default,
                default, default, default, default, default, default, default,
                default, default, default, default, default, default, default)
            WHERE [Current LSN] collate SQL_Latin1_General_CP1_CI_AS > @start_lsn_cmp collate SQL_Latin1_General_CP1_CI_AS -- This aims for implementing FN_DBLOG based on GT comparator.
            AND
            (
              (  [operation] in ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_ABORT_XACT') )
              OR
              (  [operation] in ('LOP_INSERT_ROWS','LOP_DELETE_ROWS','LOP_MODIFY_ROW')
                AND
                ( ( [context]   in ('LCX_HEAP','LCX_CLUSTERED','LCX_MARK_AS_GHOST') ) or ([context] = 'LCX_TEXT_MIX') )
                AND ([PartitionID] is not null) and ([PartitionID] >= @minPartition and [PartitionID]<=@maxPartition)
              )
              OR
              ([operation] = 'LOP_HOBT_DDL')
            )
            SET NOCOUNT OFF -- Re-enable "rows affected display"
      END
      GO
      ```

   1. Créez un certificat sur la base de données Master :

      ```
      USE [master]
      GO
      CREATE CERTIFICATE [awsdms_rtm_dump_dblog_cert]
        ENCRYPTION BY PASSWORD = N'@hardpassword1'
        WITH SUBJECT = N'Certificate for FN_DUMP_DBLOG Permissions'
      ```

   1. Créez une connexion à partir du certificat :

      ```
      USE [master]
      GO
      CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE
        [awsdms_rtm_dump_dblog_cert];
      ```

   1. Ajoutez la connexion au rôle serveur sysadmin :

      ```
      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
      ```

   1. Ajoutez la signature à la procédure [master].[awsdms].[rtm\$1dump\$1dblog] utilisant le certificat :

      ```
      USE [master]
      GO
      
      ADD SIGNATURE
        TO [master].[awsdms].[rtm_dump_dblog]
        BY CERTIFICATE [awsdms_rtm_dump_dblog_cert]
        WITH PASSWORD = '@hardpassword1';
      ```
**Note**  
Si vous recréez la procédure stockée, vous devez ajouter à nouveau la signature.

   1. Créez la procédure `[awsdms].[rtm_position_1st_timestamp]` sur la base de données Master :

      ```
      USE [master]
      IF object_id('[awsdms].[rtm_position_1st_timestamp]','P') is not null
        DROP PROCEDURE [awsdms].[rtm_position_1st_timestamp];
      GO
      CREATE PROCEDURE [awsdms].[rtm_position_1st_timestamp]
      (
        @dbname                sysname,      -- Database name
        @seqno                 integer,      -- Backup set sequence/position number within file
        @filename              varchar(260), -- The backup filename
        @1stTimeStamp          varchar(40)   -- The timestamp to position by
      ) 
      AS 
      BEGIN
        SET NOCOUNT ON       -- Disable "rows affected display"
      
        DECLARE @firstMatching table
        (
          cLsn varchar(32),
          bTim datetime
        )
        DECLARE @sql nvarchar(4000)
        DECLARE @nl                       char(2)
        DECLARE @tb                       char(2)
        DECLARE @fnameVar                 sysname = 'NULL'
      
        SET @nl  = char(10); -- New line
        SET @tb  = char(9)   -- Tab separator
      
        IF (@filename is not null)
          SET @fnameVar = ''''+@filename +''''
        SET @filename = ''''+@filename +''''
        SET @sql='use ['+@dbname+'];'+@nl+
          'SELECT TOP 1 [Current LSN],[Begin Time]'+@nl+
          'FROM fn_dump_dblog (NULL, NULL, NULL, '+ cast(@seqno as varchar(10))+','+ @filename +','+@nl+
          @tb+'default, default, default, default, default, default, default,'+@nl+
          @tb+'default, default, default, default, default, default, default,'+@nl+
          @tb+'default, default, default, default, default, default, default,'+@nl+
          @tb+'default, default, default, default, default, default, default,'+@nl+
          @tb+'default, default, default, default, default, default, default,'+@nl+
          @tb+'default, default, default, default, default, default, default,'+@nl+
          @tb+'default, default, default, default, default, default, default,'+@nl+
          @tb+'default, default, default, default, default, default, default,'+@nl+
          @tb+'default, default, default, default, default, default, default)'+@nl+
          'WHERE operation=''LOP_BEGIN_XACT''' +@nl+
          'AND [Begin Time]>= cast('+''''+@1stTimeStamp+''''+' as datetime)'+@nl
      
          --print @sql
          DELETE FROM @firstMatching 
          INSERT INTO @firstMatching  exec sp_executesql @sql    -- Get them all
          SELECT TOP 1 cLsn as [matching LSN],convert(varchar,bTim,121) AS[matching Timestamp] FROM @firstMatching;
      
          SET NOCOUNT OFF      -- Re-enable "rows affected display"
      
      END
      GO
      ```

   1. Créez un certificat sur la base de données Master :

      ```
      USE [master]
      GO
      CREATE CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert]
        ENCRYPTION BY PASSWORD = N'@hardpassword1'
        WITH SUBJECT = N'Certificate for FN_POSITION_1st_TIMESTAMP Permissions';
      ```

   1. Créez une connexion à partir du certificat :

      ```
      USE [master]
      GO
      CREATE LOGIN awsdms_rtm_position_1st_timestamp_login FROM CERTIFICATE
        [awsdms_rtm_position_1st_timestamp_cert];
      ```

   1. Ajoutez la connexion au rôle serveur sysadmin :

      ```
      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
      ```

   1. Ajoutez la signature à la procédure `[master].[awsdms].[rtm_position_1st_timestamp]` utilisant le certificat :

      ```
      USE [master]
      GO
      ADD SIGNATURE
        TO [master].[awsdms].[rtm_position_1st_timestamp]
        BY CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert]
        WITH PASSWORD = '@hardpassword1';
      ```
**Note**  
Si vous recréez la procédure stockée, vous devez ajouter à nouveau la signature.

   1. Créez un utilisateur avec les éléments suivants permissions/roles dans chacune des bases de données suivantes :
**Note**  
Vous devez créer le compte d’utilisateur dmsnosysadmin avec le même SID sur chaque réplica. La requête SQL suivante peut aider à vérifier la valeur SID du compte dmsnosysadmin sur chaque réplica. Pour plus d’informations sur la création d’un utilisateur, consultez [CREATE USER (Transact-SQL)](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql) dans la [documentation sur Microsoft SQL Server](https://learn.microsoft.com/en-us/sql/). Pour plus d’informations sur la création de comptes d’utilisateur SQL pour la base de données Azure SQL, consultez [Géoréplication active](https://learn.microsoft.com/en-us/azure/azure-sql/database/active-geo-replication-overview).

      ```
      SELECT @@servername servername, name, sid, create_date, modify_date
        FROM sys.server_principals
        WHERE name = 'dmsnosysadmin';
      ```

   1. Accordez des autorisations sur la base de données Master pour chaque réplica :

      ```
      USE master
      GO 
      
      GRANT select on sys.fn_dblog to dmsnosysadmin;
      GRANT view any definition to dmsnosysadmin;
      GRANT view server state to dmsnosysadmin -- (should be granted to the login).
      GRANT execute on sp_repldone to dmsnosysadmin;
      GRANT execute on sp_replincrementlsn to dmsnosysadmin;
      GRANT execute on sp_addpublication to dmsnosysadmin;
      GRANT execute on sp_addarticle to dmsnosysadmin;
      GRANT execute on sp_articlefilter to dmsnosysadmin;
      GRANT select on [awsdms].[split_partition_list] to dmsnosysadmin;
      GRANT execute on [awsdms].[rtm_dump_dblog] to dmsnosysadmin;
      GRANT execute on [awsdms].[rtm_position_1st_timestamp] to dmsnosysadmin;
      ```

   1. Accordez des autorisations sur la base de données msdb pour chaque réplica :

      ```
      USE msdb
      GO
      GRANT select on msdb.dbo.backupset TO self_managed_user
      GRANT select on msdb.dbo.backupmediafamily TO self_managed_user
      GRANT select on msdb.dbo.backupfile TO self_managed_user
      ```

   1. Ajoutez le rôle `db_owner` à `dmsnosysadmin` sur la base de données source. La base de données étant synchronisée, vous pouvez vous contenter d’ajouter le rôle sur le réplica principal uniquement.

      ```
      use <source DB>
      GO 
      EXEC sp_addrolemember N'db_owner', N'dmsnosysadmin'
      ```

## Configuration de la réplication continue sur une instance de base de données SQL Server cloud
<a name="CHAP_Source.SQLServer.Configuration"></a>

Cette section explique comment configurer la CDC sur une instance de base de données SQL Server hébergée sur le cloud. Une instance SQL Server hébergée sur le cloud est une instance exécutée sur Amazon RDS for SQL Server, une instance gérée par Azure SQL ou toute autre instance SQL Server gérée dans le cloud. Pour en savoir plus sur les limitations relatives à la réplication continue pour chaque type de base de données, consultez [Limitations relatives à l'utilisation de SQL Server comme source pour AWS DMS](CHAP_Source.SQLServer.md#CHAP_Source.SQLServer.Limitations). 

Avant de configurer la réplication continue, consultez [Conditions préalables pour l’utilisation de la réplication continue (CDC) à partir d’une source SQL Server](CHAP_Source.SQLServer.md#CHAP_Source.SQLServer.Prerequisites). 

À la différence des sources Microsoft SQL Server autogérées, Amazon RDS for SQL Server ne prend pas en charge la réplication Microsoft. Par conséquent, AWS DMS vous devez utiliser MS-CDC pour les tables avec ou sans clés primaires.

Amazon RDS n'accorde pas de privilèges d'administrateur système pour configurer les artefacts de réplication AWS DMS utilisés pour les modifications continues dans une instance SQL Server source. Veillez à activer MS-CDC pour l’instance Amazon RDS (en utilisant des privilèges d’utilisateur principal) comme décrit dans la procédure suivante.

**Pour activer MS-CDC pour une instance de base de données SQL Server cloud**

1. Exécutez l’une des requêtes suivantes au niveau de la base de données.

   Pour une instance de base de données RDS for SQL Server, utilisez cette requête.

   ```
   exec msdb.dbo.rds_cdc_enable_db 'DB_name'
   ```

   Pour une instance de base de données gérée par Azure SQL, utilisez cette requête.

   ```
   USE DB_name 
   GO 
   EXEC sys.sp_cdc_enable_db 
   GO
   ```

1. Pour chaque table disposant d’une clé primaire, exécutez la requête suivante afin d’activer MS-CDC.

   ```
   exec sys.sp_cdc_enable_table
   @source_schema = N'schema_name',
   @source_name = N'table_name',
   @role_name = NULL,
   @supports_net_changes = 1
   GO
   ```

   Pour chaque table disposant de clés uniques mais ne disposant pas de clé primaire, exécutez la requête suivante afin d’activer MS-CDC.

   ```
   exec sys.sp_cdc_enable_table
   @source_schema = N'schema_name',
   @source_name = N'table_name',
   @index_name = N'unique_index_name',
   @role_name = NULL,
   @supports_net_changes = 1
   GO
   ```

    Pour chaque table ne disposant pas de clé unique ni de clé primaire, exécutez la requête suivante afin d’activer MS-CDC.

   ```
   exec sys.sp_cdc_enable_table
   @source_schema = N'schema_name',
   @source_name = N'table_name',
   @role_name = NULL
   GO
   ```

1. Définissez la période de conservation :
   + Pour les instances RDS for SQL Server qui se répliquent à l'aide de DMS version 3.5.3 ou ultérieure, assurez-vous que la période de rétention est définie sur la valeur par défaut de 5 secondes. Si vous effectuez une mise à niveau ou passez de DMS 3.5.2 ou d'une version antérieure à DMS 3.5.3 ou version ultérieure, modifiez la valeur de l'intervalle d'interrogation une fois les tâches exécutées sur la nouvelle instance ou sur l'instance mise à niveau. Le script suivant définit la période de rétention à 5 secondes :

     ```
     use dbname
     EXEC sys.sp_cdc_change_job @job_type = 'capture' ,@pollinginterval = 5
     exec sp_cdc_stop_job 'capture'
     exec sp_cdc_start_job 'capture'
     ```
   + Le paramètre `@pollinginterval` est mesuré en secondes avec une valeur recommandée définie sur 86399. Cela signifie que le journal des transactions conserve les modifications pendant 86 399 secondes (un jour) lorsque `@pollinginterval = 86399`. La procédure `exec sp_cdc_start_job 'capture'` lance les paramètres.
**Note**  
Dans certaines versions de SQL Server, si la valeur de `pollinginterval` est définie sur plus de 3 599 secondes, elle est réinitialisée à la valeur par défaut de 5 secondes. Dans ce cas, les entrées du T-Log sont purgées avant de AWS DMS pouvoir les lire. Pour déterminer quelles versions de SQL Server sont concernées par ce problème connu, consultez [cet article de la base de connaissances Microsoft](https://support.microsoft.com/en-us/topic/kb4459220-fix-incorrect-results-occur-when-you-convert-pollinginterval-parameter-from-seconds-to-hours-in-sys-sp-cdc-scan-in-sql-server-dac8aefe-b60b-7745-f987-582dda2cfa78).

     Si vous utilisez Amazon RDS avec le mode multi-AZ, veillez à configurer également votre instance secondaire de sorte qu’elle ait les bonnes valeurs en cas de basculement.

     ```
     exec rdsadmin..rds_set_configuration 'cdc_capture_pollinginterval' , <5 or preferred value>
     ```

**Pour maintenir la période de rétention lorsqu'une tâche de AWS DMS réplication est arrêtée pendant plus d'une heure**
**Note**  
Les étapes suivantes ne sont pas nécessaires pour une réplication de source RDS pour SQL Server à l'aide de DMS 3.5.3 et versions ultérieures.

1. Arrêtez la tâche qui tronque les journaux de transactions à l’aide de la commande suivante. 

   ```
   exec sp_cdc_stop_job 'capture'
   ```

1. Trouvez votre tâche sur la AWS DMS console et reprenez-la.

1. Choisissez l’onglet **Surveillance**, puis vérifiez la métrique `CDCLatencySource`. 

1. Une fois que la métrique `CDCLatencySource` est égale à 0 (zéro) et ne change plus, redémarrez la tâche qui tronque les journaux de transactions à l’aide de la commande suivante.

   ```
   exec sp_cdc_start_job 'capture'
   ```

N’oubliez pas de démarrer la tâche qui tronque les journaux de transactions SQL Server. Dans le cas contraire, l’espace de stockage sur votre instance SQL Server risque de se remplir.

### Paramètres recommandés lors de l'utilisation de RDS pour SQL Server comme source pour AWS DMS
<a name="CHAP_Source.SQLServer.Configuration.Settings"></a>

#### Pour AWS DMS 3.5.3 et versions ultérieures
<a name="CHAP_Source.SQLServer.Configuration.Settings.353"></a>

**Note**  
La version initiale de la fonctionnalité de sauvegarde des journaux de RDS pour SQL Server est activée par défaut pour les points de terminaison que vous avez créés ou modifiés après la publication de la version 3.5.3 de DMS. Pour utiliser cette fonctionnalité pour les points de terminaison existants, modifiez le point de terminaison sans apporter de modifications.

AWS DMS la version 3.5.3 introduit le support pour la lecture à partir des sauvegardes de journaux. Le DMS s'appuie principalement sur la lecture des journaux de transactions actifs pour répliquer les événements. Si une transaction est sauvegardée avant que DMS ne puisse la lire dans le journal actif, la tâche accède aux sauvegardes RDS à la demande et lit les journaux de sauvegarde suivants jusqu'à ce qu'elle rattrape le journal des transactions actif. Pour garantir que DMS a accès aux sauvegardes des journaux, définissez la période de conservation automatique des sauvegardes RDS sur au moins un jour. Pour plus d'informations sur la définition de la période de conservation automatique des sauvegardes, consultez la section [Période de conservation des sauvegardes](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ManagingAutomatedBackups.html#USER_WorkingWithAutomatedBackups.BackupRetention) dans le *guide de l'utilisateur Amazon RDS*.

Une tâche DMS accédant aux sauvegardes de journaux utilise le stockage sur l'instance RDS. Notez que la tâche accède uniquement aux sauvegardes de journaux nécessaires à la réplication. Amazon RDS supprime ces sauvegardes téléchargées en quelques heures. Cette suppression n'affecte pas les sauvegardes Amazon RDS conservées dans Amazon S3, ni les fonctionnalités d'Amazon RDS. `RESTORE DATABASE` Il est conseillé d'allouer du stockage supplémentaire sur votre source RDS pour SQL Server si vous avez l'intention de répliquer à l'aide de DMS. Une façon d'estimer la quantité de stockage nécessaire consiste à identifier la sauvegarde à partir de laquelle DMS va démarrer ou reprendre la réplication, et à additionner les tailles de fichier de toutes les sauvegardes suivantes à l'aide de la fonction de métadonnées RDS`tlog backup`. Pour plus d'informations sur cette `tlog backup` fonction, consultez la [liste des sauvegardes de journaux de transactions disponibles](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER.SQLServer.AddlFeat.TransactionLogAccess.html#USER.SQLServer.AddlFeat.TransactionLogAccess.Listing) dans le *guide de l'utilisateur Amazon RDS*. 

Vous pouvez également choisir d'activer le dimensionnement automatique du stockage et/ou de déclencher le dimensionnement du stockage en fonction de la CloudWatch `FreeStorageSpace` métrique de votre instance Amazon RDS.

Nous vous recommandons vivement de ne pas démarrer ou reprendre trop loin dans les sauvegardes du journal des transactions, car cela pourrait entraîner un remplissage du stockage sur votre instance SQL Server. Dans ce cas, il est conseillé de démarrer un chargement complet. La réplication à partir de la sauvegarde du journal des transactions est plus lente que la lecture des journaux de transactions actifs. Pour de plus amples informations, veuillez consulter [Traitement de sauvegarde du journal des transactions pour RDS pour SQL Server](CHAP_Troubleshooting_Latency_Source_SQLServer.md#CHAP_Troubleshooting_Latency_Source_SQLServer_backup).

Notez que l'accès aux sauvegardes du journal nécessite des privilèges supplémentaires. Pour plus d'informations, voir les informations détaillées dans [Configurer des autorisations pour une réplication continue à partir d'une base de données SQL Server dans le cloud](CHAP_Source.SQLServer.md#CHAP_Source.SQLServer.Permissions.Cloud) Assurez-vous d'accorder ces privilèges avant que la tâche ne commence à se répliquer.

#### Pour AWS DMS 3.5.2 et versions antérieures
<a name="CHAP_Source.SQLServer.Configuration.Settings.352"></a>

Lorsque vous utilisez Amazon RDS for SQL Server en tant que source, la tâche de capture MS-CDC repose sur les `maxscans` paramètres et. `maxtrans` Ces paramètres régissent le nombre maximum d'analyses effectuées par la capture MS-CDC dans le journal des transactions et le nombre de transactions traitées pour chaque analyse.

Pour les bases de données où le nombre de transactions est supérieur à `maxtrans*maxscans`, l’augmentation de la valeur `polling_interval` peut entraîner une accumulation d’enregistrements dans le journal des transactions actif. À son tour, cette accumulation peut entraîner une augmentation de la taille du journal des transactions.

Notez que cela AWS DMS ne repose pas sur la tâche de capture MS-CDC. La tâche de capture MS-CDC marque les entrées du journal des transactions comme ayant été traitées. Cela permet à la tâche de sauvegarde du journal des transactions de supprimer les entrées du journal des transactions.

Nous vous recommandons de surveiller la taille du journal des transactions et la réussite des tâches MS-CDC. Si les tâches MS-CDC échouent, le journal des transactions peut augmenter de manière excessive et provoquer des échecs de AWS DMS réplication. Vous pouvez surveiller les erreurs des tâches de capture MS-CDC à l’aide de la vue de gestion dynamique `sys.dm_cdc_errors` de la base de données source. Vous pouvez surveiller la taille du journal des transactions à l’aide de la commande de gestion `DBCC SQLPERF(LOGSPACE)`.

**Pour remédier à l’augmentation du journal des transactions provoquée par MS-CDC**

1. Vérifiez le `Log Space Used %` pour lequel la base de données AWS DMS est en train de se répliquer et vérifiez qu'il augmente continuellement.

   ```
   DBCC SQLPERF(LOGSPACE)
   ```

1. Identifiez ce qui bloque le processus de sauvegarde du journal des transactions.

   ```
   Select log_reuse_wait, log_reuse_wait_desc, name from sys.databases where name = db_name();
   ```

   Si la valeur `log_reuse_wait_desc` est égale à `REPLICATION`, la conservation de la sauvegarde du journal est due à la latence dans MS-CDC.

1. Augmentez le nombre d’événements traités par la tâche de capture en augmentant les valeurs des paramètres `maxtrans` et `maxscans`.

   ```
   EXEC sys.sp_cdc_change_job @job_type = 'capture' ,@maxtrans = 5000, @maxscans = 20 
   exec sp_cdc_stop_job 'capture'
   exec sp_cdc_start_job 'capture'
   ```

Pour résoudre ce problème, définissez les valeurs de `maxscans` et de `maxtrans` manière à ce `maxtrans*maxscans` qu'elles soient égales au nombre moyen d'événements générés pour les tables AWS DMS répliquées à partir de la base de données source chaque jour.

Si vous définissez ces paramètres sur une valeur supérieure à la valeur recommandée, les tâches de capture traitent tous les événements des journaux de transactions. Si vous définissez ces paramètres sur une valeur inférieure à la valeur recommandée, la latence MS-CDC augmente ainsi que la taille de votre journal des transactions.

L’identification des valeurs appropriées pour `maxscans` et `maxtrans` peut s’avérer difficile, car les modifications de la charge de travail produisent un nombre variable d’événements. Dans ce cas, nous vous recommandons de configurer la surveillance sur la latence MS-CDC. Pour plus d’informations, consultez [Monitor the process](https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/administer-and-monitor-change-data-capture-sql-server?view=sql-server-ver15#Monitor) dans la documentation de SQL Server. Configurez ensuite `maxtrans` et `maxscans` de manière dynamique en fonction des résultats de la surveillance.

Si la AWS DMS tâche ne parvient pas à trouver les numéros de séquence du journal (LSNs) nécessaires pour reprendre ou poursuivre la tâche, celle-ci peut échouer et nécessiter un rechargement complet.

**Note**  
Lors de l'utilisation AWS DMS pour répliquer des données à partir d'une source RDS pour SQL Server, vous pouvez rencontrer des erreurs lorsque vous tentez de reprendre la réplication après un événement stop-start de l'instance Amazon RDS. Cela est dû au fait que le processus SQL Server Agent redémarre le processus de capture lorsqu’il redémarre après l’événement d’arrêt/démarrage. Cela permet de contourner l’intervalle d’interrogation MS-CDC.  
De ce fait, sur les bases de données dont le volume de transactions est inférieur au traitement de la tâche de capture MS-CDC, les données peuvent être traitées ou marquées comme répliquées et sauvegardées avant de AWS DMS pouvoir reprendre là où elles s'étaient arrêtées, ce qui entraîne l'erreur suivante :  

```
[SOURCE_CAPTURE ]E: Failed to access LSN '0000dbd9:0006f9ad:0003' in the backup log sets since BACKUP/LOG-s are not available. [1020465] (sqlserver_endpoint_capture.c:764)
```
Pour atténuer ce problème, définissez les valeurs `maxtrans` et `maxscans` comme recommandé précédemment.