Scripts d'assistance au diagnostic SQL Server - AWS Service de Migration de Base de Données

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.

Scripts d'assistance au diagnostic SQL Server

Vous trouverez ci-dessous une description des scripts d'assistance au diagnostic disponibles pour analyser une base de données sur site ou Amazon RDS for SQL Server dans votre configuration de migration AWS DMS. Ces scripts fonctionnent avec un point de terminaison source ou cible. Pour une base de données sur site, exécutez ces scripts dans l'utilitaire de ligne de commande sqlcmd. Pour plus d'informations sur l'utilisation de cet utilitaire, consultez sqlcmd : utiliser l'utilitaire dans la documentation Microsoft.

Pour une base de données Amazon RDS, vous ne pouvez pas vous connecter à l'aide de l'utilitaire de ligne de commande sqlcmd. Exécutez plutôt ces scripts à l'aide d'un outil client quelconque connecté à Amazon RDS SQL Server.

Avant d'exécuter le script, veillez à ce que le compte d'utilisateur que vous utilisez dispose des autorisations nécessaires pour accéder à la base de données SQL Server. Pour une base de données sur site et une base de données Amazon RDS, vous pouvez utiliser les mêmes autorisations que celles que vous utilisez pour accéder à la base de données SQL Server sans le rôle SysAdmin.

Configuration des autorisations minimales pour une base de données SQL Server sur site

Pour configurer les autorisations minimales d'exécution pour une base de données SQL Server sur site
  1. Créez un nouveau compte SQL Server avec une authentification par mot de passe utilisant SQL Server Management Studio (SSMS), par exemple on-prem-user.

  2. Dans la section Mappages d'utilisateurs de SSMS, choisissez les bases de données MSDB et MASTER (ce qui confère une autorisation publique) et affectez le rôle DB_OWNER à la base de données dans laquelle vous voulez exécuter le script.

  3. Ouvrez le menu contextuel (clic droit) pour le nouveau compte et choisissez Sécurité pour accorder explicitement le privilège Connect SQL.

  4. Exécutez les commandes d'octroi suivantes.

    GRANT VIEW SERVER STATE TO on-prem-user; USE MSDB; GRANT SELECT ON MSDB.DBO.BACKUPSET TO on-prem-user; GRANT SELECT ON MSDB.DBO.BACKUPMEDIAFAMILY TO on-prem-user; GRANT SELECT ON MSDB.DBO.BACKUPFILE TO on-prem-user;

Configuration des autorisations minimales pour une base de données Amazon RDS SQL Server

Pour exécuter une base de données Amazon RDS SQL Server avec les autorisations minimales
  1. Créez un nouveau compte SQL Server avec une authentification par mot de passe utilisant SQL Server Management Studio (SSMS), par exemple rds-user.

  2. Dans la section Mappages d'utilisateurs de SSMS, choisissez la base de données MSDB (ce qui confère une autorisation publique) et affectez le rôle DB_OWNER à la base de données dans laquelle vous voulez exécuter le script.

  3. Ouvrez le menu contextuel (clic droit) pour le nouveau compte et choisissez Sécurité pour accorder explicitement le privilège Connect SQL.

  4. Exécutez les commandes d'octroi suivantes.

    GRANT VIEW SERVER STATE TO rds-user; USE MSDB; GRANT SELECT ON MSDB.DBO.BACKUPSET TO rds-user; GRANT SELECT ON MSDB.DBO.BACKUPMEDIAFAMILY TO rds-user; GRANT SELECT ON MSDB.DBO.BACKUPFILE TO rds-user;

Configuration de la réplication continue sur une instance SQL Server autonome : sans le rôle sysadmin

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 SQL Server autogéré sur site ou sur Amazon EC2.

  2. 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.

  3. 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
  4. 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
  5. 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';
  6. 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];
  7. Ajoutez la connexion au rôle serveur sysadmin à l'aide du script suivant :

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
  8. Ajoutez la signature à [master].[awsdms].[rtm_dump_dblog] 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.

  9. Créez [awsdms]. [rtm_position_1st_timestamp] 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
  10. 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';
  11. 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];
  12. Ajoutez la connexion au rôle sysadmin à l’aide du script suivant :

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
  13. Ajoutez la signature à [master].[awsdms].[rtm_position_1st_timestamp] 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';
  14. 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;
  15. 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) dans la documentation sur Microsoft SQL Server. 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.

    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 [DMS_user] grant select on msdb.dbo.backupmediafamily to [DMS_user] grant select on msdb.dbo.backupfile to [DMS_user]

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

    EXEC sp_addrolemember N'db_owner', N'DMS_user' use Source_DB go
  16. 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

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 SQL Server autogéré sur site ou sur Amazon EC2.

  2. 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é.

  3. Si l'option de point de terminaison Utiliser exclusivement sp_repldone au sein d'une seule tâche est activée, arrêtez la tâche Log Reader de réplication Microsoft.

  4. 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]
    2. 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
    3. 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
    4. 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'
    5. Créez une connexion à partir du certificat :

      USE [master] GO CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
    6. Ajoutez la connexion au rôle serveur sysadmin :

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
    7. Ajoutez la signature à la procédure [master].[awsdms].[rtm_dump_dblog] 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.

    8. 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
    9. 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';
    10. 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];
    11. Ajoutez la connexion au rôle serveur sysadmin :

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
    12. 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.

    13. Créez un utilisateur avec les autorisations/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) dans la documentation sur Microsoft SQL Server. 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.

      SELECT @@servername servername, name, sid, create_date, modify_date FROM sys.server_principals WHERE name = 'dmsnosysadmin';
    14. 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;
    15. Accordez des autorisations sur la base de données msdb pour chaque réplica :

      USE msdb GO GRANT select on msdb.dbo.backupset to dmsnosysadmin GRANT select on msdb.dbo.backupmediafamily to dmsnosysadmin GRANT select on msdb.dbo.backupfile to dmsnosysadmin
    16. 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'

Scripts d'assistance SQL Server

Les rubriques suivantes décrivent comment télécharger, passer en revue et exécuter chaque script d'assistance disponible pour SQL Server. Elles décrivent également comment passer en revue et charger le résultat du script dans votre dossier AWS Support.

Script awsdms_support_collector_sql_server.sql

Téléchargez le script awsdms_support_collector_sql_server.sql.

Note

Exécutez ce script d'assistance au diagnostic SQL Server sur SQL Server 2014 et versions ultérieures uniquement.

Ce script collecte des informations sur la configuration de la base de données SQL Server. N'oubliez pas de vérifier la somme de contrôle sur le script et, si cette somme de contrôle est correcte, passez en revue le code SQL du script pour mettre en commentaires toute partie du code que vous n'envisagez pas sereinement d'exécuter. Une fois que vous êtes satisfait de l'intégrité et du contenu du script, vous pouvez exécuter ce dernier.

Pour exécuter le script pour une base de données SQL Server sur site
  1. Exécutez le script à l'aide de la ligne de commande sqlcmd suivante.

    sqlcmd -Uon-prem-user -Ppassword -SDMS-SQL17AG-N1 -y 0 -iC:\Users\admin\awsdms_support_collector_sql_server.sql -oC:\Users\admin\DMS_Support_Report_SQLServer.html -dsqlserverdb01

    Les paramètres spécifiés de la commande sqlcmd incluent les suivants :

    • -U : nom d'utilisateur de la base de données.

    • -P : mot de passe d'utilisateur de la base de données.

    • -S : nom du serveur de base de données SQL Server.

    • -y : largeur maximale des colonnes de sortie de l'utilitaire sqlcmd. La valeur 0 indique que les colonnes ont une largeur illimitée.

    • -i : chemin du script d'assistance à exécuter, dans ce cas, awsdms_support_collector_sql_server.sql.

    • -o : chemin du fichier HTML de sortie, avec un nom de fichier que vous spécifiez, contenant les informations de configuration de base de données collectées.

    • -d : nom de la base de données SQL Server.

  2. Une fois le script terminé, passez en revue le fichier HTML de sortie et supprimez toutes les informations que vous ne souhaitez pas partager. Lorsque le fichier HTML vous semble approprié à partager, chargez-le dans votre dossier AWS Support. Pour plus d'informations sur le chargement de ce fichier, consultez Utilisation de scripts d'assistance au diagnostic dans AWS DMS.

Avec Amazon RDS for SQL Server, vous ne pouvez pas vous connecter à l'aide de l'utilitaire de ligne de commande sqlcmd. Procédez donc comme suit.

Pour exécuter le script pour une base de données RDS SQL Server
  1. Exécutez le script à l'aide d'un outil client quelconque vous permettant de vous connecter à RDS SQL Server en tant qu'utilisateur Master et d'enregistrer la sortie en tant que fichier HTML.

  2. Passez en revue le fichier HTML de sortie et supprimez toutes les informations que vous ne souhaitez pas partager. Lorsque le fichier HTML vous semble approprié à partager, chargez-le dans votre dossier AWS Support. Pour plus d'informations sur le chargement de ce fichier, consultez Utilisation de scripts d'assistance au diagnostic dans AWS DMS.