Scripts de soporte de diagnóstico de SQL Server - AWS Database Migration Service

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Scripts de soporte de diagnóstico de SQL Server

A continuación, puede encontrar una descripción de los scripts de soporte de diagnóstico disponibles para analizar una base de datos en las instalaciones o de Amazon RDS para SQL Server en la configuración de migración de AWS DMS. Estos scripts funcionan con un punto de conexión de origen o destino. Para una base de datos en las instalaciones, ejecute estos scripts en la utilidad de línea de comandos sqlcmd. Para obtener más información sobre el uso de esta utilidad, consulte sqlcmd - Use la utilidad en la documentación de Microsoft.

En el caso de una base de datos de Amazon RDS, no puede conectarse mediante la utilidad de línea de comandos sqlcmd. En su lugar, ejecute estos scripts con cualquier herramienta de cliente que se conecte a Amazon RDS SQL Server.

Antes de ejecutar el script, asegúrese de que la cuenta de usuario que utiliza tiene los permisos necesarios para acceder a la base de datos de SQL Server. Para una base de datos en las instalaciones y para una de Amazon RDS, puede utilizar los mismos permisos que utiliza para acceder a la base de datos de SQL Server sin el rol SysAdmin.

Configuración de los permisos mínimos para una base de datos de SQL Server en las instalaciones

Para configurar los permisos mínimos para ejecutar para una base de datos de SQL Server en las instalaciones
  1. Cree una nueva cuenta de SQL Server con autenticación mediante contraseña utilizando SQL Server Management Studio (SSMS), por ejemplo on-prem-user.

  2. En la sección Asignaciones de usuarios de SSMS, elija las bases de datos MSDB y MASTER (que otorga permisos públicos) y asigne el rol de DB_OWNER a la base de datos en la que desee ejecutar el script.

  3. Abra el menú contextual (haga clic con el botón derecho) de la cuenta nueva y elija Seguridad para conceder de forma específica el privilegio Connect SQL.

  4. Ejecute los comandos de concesión siguientes.

    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;

Configuración de los permisos mínimos para una base de datos de Amazon RDS SQL Server

Para ejecutar los permisos mínimos para una base de datos de Amazon RDS SQL Server
  1. Cree una nueva cuenta de SQL Server con autenticación mediante contraseña utilizando SQL Server Management Studio (SSMS), por ejemplo rds-user.

  2. En la sección Asignaciones de usuarios de SSMS, elija la base de datos MSDB (que otorga permisos públicos) y asigne el rol DB_OWNER a la base de datos en la que desee ejecutar el script.

  3. Abra el menú contextual (haga clic con el botón derecho) de la cuenta nueva y elija Seguridad para conceder de forma específica el privilegio Connect SQL.

  4. Ejecute los comandos de concesión siguientes.

    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;

Configuración de la replicación continua en un SQL Server independiente: sin el rol de sysadmin

Esta sección describe cómo configurar la replicación continua para un origen de base de datos de SQL Server independiente que no requiera que la cuenta de usuario tenga privilegios de sysadmin.

nota

Tras ejecutar los pasos de esta sección, el usuario de DMS que no sea administrador de sistemas tendrá permisos para hacer lo siguiente:

  • Lea los cambios del archivo de registro de transacciones en línea

  • Acceso al disco para leer los cambios de los archivos de copia de seguridad del registro transaccional

  • Añadir o modificar la publicación que utiliza DMS

  • Añadir artículos a la publicación

  1. Configure Microsoft SQL Server para la replicación como se describe en Captura de cambios de datos para SQL Server autoadministrado en las instalaciones o en Amazon EC2.

  2. Habilite MS-REPLICATION en la base de datos de origen. Esto se puede hacer manualmente o ejecutando la tarea una vez como usuario sysadmin.

  3. Cree el esquema de awsdms en la base de datos de origen mediante el siguiente script:

    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. Cree el procedimiento [awsdms].[rtm_dump_dblog] en la base de datos maestra mediante el siguiente script:

    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. Cree el certificado en la base de datos maestra mediante el siguiente script:

    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. Cree el inicio de sesión del certificado mediante el siguiente script:

    Use [master] Go CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
  7. Agregue el inicio de sesión al rol del servidor de sysadmin mediante el siguiente script:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
  8. Agregue la firma a [master].[awsdms].[rtm_dump_dblog] con el certificado, mediante el siguiente script:

    Use [master] GO ADD SIGNATURE TO [master].[awsdms].[rtm_dump_dblog] BY CERTIFICATE [awsdms_rtm_dump_dblog_cert] WITH PASSWORD = '@5trongpassword';
    nota

    Si vuelve a crear el procedimiento almacenado, tendrá que volver a agregar la firma.

  9. Cree [awsdms]. [rtm_position_1st_timestamp] en la base de datos maestra mediante el siguiente script:

    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. Cree el certificado en la base de datos maestra mediante el siguiente script:

    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. Cree el inicio de sesión del certificado mediante el siguiente script:

    Use [master] Go CREATE LOGIN awsdms_rtm_position_1st_timestamp_login FROM CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert];
  12. Agregue el inicio de sesión al rol de sysadmin mediante el siguiente script:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
  13. Agregue la firma a [master].[awsdms].[rtm_position_1st_timestamp] con el certificado, mediante el siguiente script:

    Use [master] GO ADD SIGNATURE TO [master].[awsdms].[rtm_position_1st_timestamp] BY CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert] WITH PASSWORD = '@5trongpassword';
  14. Conceda al usuario de DMS acceso de ejecución al nuevo procedimiento almacenado mediante el siguiente script:

    use master go GRANT execute on [awsdms].[rtm_position_1st_timestamp] to dms_user;
  15. Cree un usuario con los siguientes permisos y roles en cada una de las siguientes bases de datos:

    nota

    Debe crear la cuenta de usuario dmsnosysadmin con el mismo SID en cada réplica. La siguiente consulta SQL puede ayudar a comprobar el valor del SID de la cuenta dmsnosysadmin en cada réplica. Para obtener más información sobre la creación de un usuario, consulte CREATE USER (Transact-SQL) en la documentación de Microsoft SQL Server. Para obtener más información sobre la creación de cuentas de usuario de SQL para la base de datos de Azure SQL, consulte Replicación geográfica activa.

    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]

    Ejecute el siguiente script en la base de datos de origen:

    EXEC sp_addrolemember N'db_owner', N'DMS_user' use Source_DB go
  16. Por último, agregue un atributo de conexión adicional (ECA) al punto de conexión de SQL Server de origen:

    enableNonSysadminWrapper=true;

Configuración de la replicación continua en un SQL Server en un entorno de grupos de disponibilidad: sin el rol de sysadmin

En esta sección se describe cómo configurar la replicación continua para un origen de base de datos de SQL Server en un entorno de grupo de disponibilidad que no requiera que la cuenta de usuario tenga privilegios de sysadmin.

nota

Tras ejecutar los pasos de esta sección, el usuario de DMS que no sea administrador de sistemas tendrá permisos para hacer lo siguiente:

  • Lea los cambios del archivo de registro de transacciones en línea

  • Acceso al disco para leer los cambios de los archivos de copia de seguridad del registro transaccional

  • Añadir o modificar la publicación que utiliza DMS

  • Añadir artículos a la publicación

Para configurar la replicación continua sin usar el usuario sysadmin en un entorno de grupos de disponibilidad
  1. Configure Microsoft SQL Server para la replicación como se describe en Captura de cambios de datos para SQL Server autoadministrado en las instalaciones o en Amazon EC2.

  2. Habilite MS-REPLICATION en la base de datos de origen. Esto se puede hacer manualmente o ejecutando la tarea una vez mediante un usuario sysadmin.

    nota

    Debe configurar el distribuidor de MS-REPLICATION como local o de forma que permita el acceso a los usuarios que no sean sysadmin a través del servidor vinculado asociado.

  3. Si la opción de punto de conexión Usar exclusivamente sp_repldone en una tarea única está habilitada, detenga el trabajo del lector de registros de MS-REPLICATION.

  4. Realice los siguientes pasos en cada réplica:

    1. Cree el esquema [awsdms][awsdms] en la base de datos maestra:

      CREATE SCHEMA [awsdms]
    2. Cree la función con valor de tabla [awsdms].[split_partition_list] en la base de datos maestra:

      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. Cree el procedimiento [awsdms].[rtm_dump_dblog] en la base de datos maestra:

      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. Cree un certificado en la base de datos maestra:

      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. Cree un inicio de sesión desde el certificado:

      USE [master] GO CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
    6. Agregue el inicio de sesión al rol del servidor sysadmin:

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
    7. Agregue la firma al procedimiento [master].[awsdms].[rtm_dump_dblog] con el certificado:

      USE [master] GO ADD SIGNATURE TO [master].[awsdms].[rtm_dump_dblog] BY CERTIFICATE [awsdms_rtm_dump_dblog_cert] WITH PASSWORD = '@hardpassword1';
      nota

      Si vuelve a crear el procedimiento almacenado, tendrá que volver a agregar la firma.

    8. Cree el procedimiento [awsdms].[rtm_position_1st_timestamp] en la base de datos maestra:

      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. Cree un certificado en la base de datos maestra:

      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. Cree un inicio de sesión desde el certificado:

      USE [master] GO CREATE LOGIN awsdms_rtm_position_1st_timestamp_login FROM CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert];
    11. Agregue el inicio de sesión al rol del servidor sysadmin:

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
    12. Agregue la firma al procedimiento [master].[awsdms].[rtm_position_1st_timestamp] mediante el certificado:

      USE [master] GO ADD SIGNATURE TO [master].[awsdms].[rtm_position_1st_timestamp] BY CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert] WITH PASSWORD = '@hardpassword1';
      nota

      Si vuelve a crear el procedimiento almacenado, tendrá que volver a agregar la firma.

    13. Cree un usuario con los siguientes permisos o roles en cada una de las siguientes bases de datos:

      nota

      Debe crear la cuenta de usuario dmsnosysadmin con el mismo SID en cada réplica. La siguiente consulta SQL puede ayudar a comprobar el valor del SID de la cuenta dmsnosysadmin en cada réplica. Para obtener más información sobre la creación de un usuario, consulte CREATE USER (Transact-SQL) en la documentación de Microsoft SQL Server. Para obtener más información sobre la creación de cuentas de usuario de SQL para la base de datos de Azure SQL, consulte Replicación geográfica activa.

      SELECT @@servername servername, name, sid, create_date, modify_date FROM sys.server_principals WHERE name = 'dmsnosysadmin';
    14. Conceda permisos en la base de datos maestra en cada 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. Conceda permisos en la base de datos msdb en cada 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. Agregue el rol db_owner a dmsnosysadmin en la base de datos de origen. Como la base de datos está sincronizada, solo puede agregar el rol en la réplica principal.

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

Scripts de soporte de SQL Server

En los temas siguientes se describe cómo descargar, revisar y ejecutar cada script de soporte disponible para SQL Server. También describen cómo revisar y cargar el resultado de script en el caso de AWS Support.

script awsdms_support_collector_sql_server.sql

Descargue el script awsdms_support_collector_sql_server.sql.

nota

Ejecute este script de soporte de diagnóstico de SQL Server solo en SQL Server 2014 y versiones superiores.

Este script recopila información sobre la configuración de la base de datos de SQL Server. Recuerde comprobar la suma de comprobación en el script y, si la suma de comprobación es válida, revise el código SQL en el script para comentar cualquier parte del código que no le resulte cómodo ejecutar. Cuando esté satisfecho con la integridad y el contenido del script, puede ejecutarlo.

Para ejecutar el script para una base de datos de SQL Server en las instalaciones
  1. Ejecute el script mediante la siguiente línea de comandos sqlcmd.

    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

    Los parámetros de comando sqlcmd especificados son los siguientes:

    • -U: nombre de usuario de base de datos.

    • -P: contraseña de usuario de base de datos.

    • -S: nombre del servidor de base de datos de SQL Server.

    • -y: ancho máximo de las columnas generadas por la utilidad sqlcmd. El valor 0 especifica columnas de ancho ilimitado.

    • -i: ruta del script de soporte que se va a ejecutar, en este caso awsdms_support_collector_sql_server.sql.

    • -o: ruta del archivo HTML de salida, con el nombre de archivo que especifique, que contiene la información de configuración de la base de datos recopilada.

    • -d: nombre de la base de datos de SQL Server.

  2. Una vez completo el script, revise el archivo HTML de salida y elimine cualquier información que no le resulte cómodo compartir. Cuando acepte compartir HTML, cargue el archivo en el caso de AWS Support. Para obtener más información sobre cómo cargar este archivo, consulte Trabajar con scripts de soporte de diagnóstico en AWS DMS.

Con Amazon RDS para SQL Server, no puede conectarse mediante la utilidad de línea de comandos sqlcmd, por lo que debe seguir el procedimiento siguiente.

Para ejecutar el script para una base de datos de SQL Server de RDS
  1. Ejecute el script con cualquier herramienta de cliente que le permita conectarse a SQL Server de RDS como usuario Master y guardar el resultado como un archivo HTML.

  2. Revise el archivo HTML de salida y elimine cualquier información que no le resulte cómodo compartir. Cuando acepte compartir HTML, cargue el archivo en el caso de AWS Support. Para obtener más información sobre cómo cargar este archivo, consulte Trabajar con scripts de soporte de diagnóstico en AWS DMS.