SQL-Server-Diagnoseunterstützungsskripts - AWS Database Migration Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

SQL-Server-Diagnoseunterstützungsskripts

Im Folgenden finden Sie die Diagnoseunterstützungsskripts, die für die Analyse einer On-Premises-Datenbank oder einer Amazon-RDS-für-SQL-Server-Datenbank in Ihrer AWS DMS-Migrationskonfiguration verfügbar sind. Diese Skripts funktionieren entweder mit einem Quell- oder Zielendpunkt. Führen Sie diese Skript für eine On-Premises-Datenbank im Befehlszeilen-Dienstprogramm sqlcmd aus. Weitere Informationen zur Verwendung dieses Dienstprogramms finden Sie unter sqlcmd – Verwendung des Hilfsprogramms in der Microsoft-Dokumentation.

Bei einer Amazon-RDS-Datenbank können Sie mit dem Befehlszeilen-Dienstprogramm sqlcmd keine Verbindung herstellen. Führen Sie diese Skripts stattdessen mit einem beliebigen Client-Tool aus, das eine Verbindung zu Amazon RDS SQL Server herstellt.

Bevor Sie das Skript ausführen, stellen Sie sicher, dass das von Ihnen verwendete Benutzerkonto über die erforderlichen Berechtigungen für den Zugriff auf Ihre SQL-Server-Datenbank verfügt. Sowohl für eine On-Premises- als auch für eine Amazon-RDS-Datenbank können Sie dieselben Berechtigungen verwenden, die Sie für den Zugriff auf Ihre SQL-Server-Datenbank ohne die SysAdmin-Rolle verwenden.

Einrichtung von Mindestberechtigungen für eine On-Premises-SQL-Server-Datenbank

So richten Sie Mindestberechtigungen für eine On-Premises-SQL-Server-Datenbank ein
  1. Erstellen Sie unter Verwendung von SQL Server Management Studio (SSMS) ein neues SQL-Server-Konto mit Passwort-Authentifizierung, zum Beispiel on-prem-user.

  2. Wählen Sie im Abschnitt Benutzerzuweisungen von SSMS die Datenbanken MSDB und MASTER aus (wodurch öffentliche Berechtigungen erteilt werden) und weisen Sie der Datenbank, die Sie für die fortlaufende Replikation verwenden möchten, die Rolle DB_OWNER zu.

  3. Öffnen Sie das Kontextmenü (rechte Maustaste) für das neue Konto, wählen Sie Sicherheit aus, um ausdrücklich die Connect SQL-Berechtigung zu erteilen.

  4. Führen Sie die folgenden Befehle zum Erteilen der Berechtigung aus.

    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;

Einrichtung von Mindestberechtigungen für eine Amazon-RDS-SQL-Server-Datenbank

So richten Sie Mindestberechtigungen für eine Amazon-RDS-SQL-Server-Datenbank ein
  1. Erstellen Sie unter Verwendung von SQL Server Management Studio (SSMS) ein neues SQL-Server-Konto mit Passwort-Authentifizierung, zum Beispiel rds-user.

  2. Wählen Sie im Abschnitt Benutzerzuweisungen von SSMS die Datenbank MSDB aus (die öffentliche Zugriffsrechte gewährt) und weisen Sie die DB_OWNER-Rolle der Datenbank zu, in der Sie das Skript ausführen möchten.

  3. Öffnen Sie das Kontextmenü (rechte Maustaste) für das neue Konto, wählen Sie Sicherheit aus, um ausdrücklich die Connect SQL-Berechtigung zu erteilen.

  4. Führen Sie die folgenden Befehle zum Erteilen der Berechtigung aus.

    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;

Einrichtung der fortlaufenden Replikation auf einem eigenständigen SQL Server: Ohne Sysadmin-Rolle

Dieser Abschnitt beschreibt die Einrichtung der fortlaufenden Replikation für eine eigenständige SQL-Server-Datenbankquelle, für die das Benutzerkonto keine Sysadmin-Berechtigungen benötigt.

Anmerkung

Nachdem Sie die Schritte in diesem Abschnitt ausgeführt haben, hat der DMS-Benutzer, der kein Systemadministrator ist, die Berechtigung, um Folgendes zu tun:

  • Lesen der Änderungen aus der Protokolldatei für Online-Transaktionen

  • Festplattenzugriff zum Lesen von Änderungen aus Transaktionsprotokoll-Backup-Dateien

  • Hinzufügen oder Ändern der von DMS verwendeten Publikation

  • Hinzufügen von Artikeln zu der Publikation

  1. Richten Sie Microsoft SQL Server für die Replikation ein, wie unter Erfassen von Datenänderungen für selbstverwaltete SQL-Server-Quellen (On-Premises oder in Amazon EC2) beschrieben.

  2. Aktivieren Sie MS-REPLICATION in der Quelldatenbank. Dies kann entweder manuell oder durch einmaliges Ausführen der Aufgabe als Sysadmin-Benutzer erfolgen.

  3. Erstellen Sie das awsdms-Schema in der Quelldatenbank mit dem folgenden Skript:

    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. Erstellen Sie die [awsdms].[rtm_dump_dblog]-Prozedur in der Master-Datenbank mit dem folgenden Skript:

    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. Erstellen Sie das Zertifikat in der Master-Datenbank mit dem folgenden Skript:

    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. Erstellen Sie die Anmeldung von dem Zertifikat mit dem folgenden Skript:

    Use [master] Go CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
  7. Fügen Sie die Anmeldung mithilfe des folgenden Skripts zur Sysadmin-Serverrolle hinzu:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
  8. Fügen Sie die Signatur zu [Master]. [awsdms]. [rtm_dump_dblog] unter Verwendung des Zertifikats mit dem folgenden Skript hinzu:

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

    Wenn Sie die gespeicherte Prozedur neu erstellen, müssen Sie die Signatur erneut hinzufügen.

  9. Erstellen Sie [awsdms].[rtm_position_1st_timestamp] in der Master-Datenbank mithilfe des folgenden Skripts:

    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. Erstellen Sie das Zertifikat in der Master-Datenbank mit dem folgenden Skript:

    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. Erstellen Sie die Anmeldung von dem Zertifikat mit dem folgenden Skript:

    Use [master] Go CREATE LOGIN awsdms_rtm_position_1st_timestamp_login FROM CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert];
  12. Fügen Sie die Anmeldedaten mithilfe des folgenden Skripts zur sysadmin-Rolle hinzu:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
  13. Fügen Sie die Signatur zu [master].[awsdms].[rtm_position_1st_timestamp] unter Verwendung des Zertifikats mit dem folgenden Skript hinzu:

    Use [master] GO ADD SIGNATURE TO [master].[awsdms].[rtm_position_1st_timestamp] BY CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert] WITH PASSWORD = '@5trongpassword';
  14. Gewähren Sie dem DMS-Benutzer mithilfe des folgenden Skripts Ausführungszugriff auf die neue gespeicherte Prozedur:

    use master go GRANT execute on [awsdms].[rtm_position_1st_timestamp] to dms_user;
  15. Erstellen Sie in jeder der folgenden Datenbanken einen Benutzer mit den folgenden Berechtigungen und Rollen:

    Anmerkung

    Sie sollten das Benutzerkonto dmsnosysadmin mit derselben SID für jedes Replikat erstellen. Die folgende SQL-Abfrage kann dabei helfen, den SID-Wert des dmsnosysadmin-Kontos auf jedem Replikat zu überprüfen. Weitere Informationen zum Erstellen eines Benutzers finden Sie unter BENUTZER ERSTELLEN (Transact-SQL) in der Microsoft-SQL-Server-Dokumentation. Weitere Informationen zum Erstellen von SQL-Benutzerkonten für die Azure-SQL-Datenbank finden Sie unter Aktive Georeplikation.

    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]

    Führen Sie den folgenden Befehl für die Quelldatenbank aus:

    EXEC sp_addrolemember N'db_owner', N'DMS_user' use Source_DB go
  16. Fügen Sie abschließend dem SQL-Server-Endpunkt ein zusätzliches Verbindungsattribut (ECA) hinzu:

    enableNonSysadminWrapper=true;

Einrichtung einer laufenden Replikation auf einem SQL-Server in einer Availability-Group-Umgebung: Ohne Sysadmin-Rolle

Dieser Abschnitt beschreibt die Einrichtung der fortlaufenden Replikation für eine eigenständige SQL-Server-Datenbankquelle, für die das Benutzerkonto keine sysadmin-Berechtigungen benötigt.

Anmerkung

Nachdem Sie die Schritte in diesem Abschnitt ausgeführt haben, hat der DMS-Benutzer, der kein Systemadministrator ist, die Berechtigung, um Folgendes zu tun:

  • Lesen der Änderungen aus der Protokolldatei für Online-Transaktionen

  • Festplattenzugriff zum Lesen von Änderungen aus Transaktionsprotokoll-Backup-Dateien

  • Hinzufügen oder Ändern der von DMS verwendeten Publikation

  • Hinzufügen von Artikeln zu der Publikation

So richten Sie die fortlaufende Replikation in einer Availability-Group-Umgebung ein, ohne den Sysadmin-Benutzer zu verwenden
  1. Richten Sie Microsoft SQL Server für die Replikation ein, wie unter Erfassen von Datenänderungen für selbstverwaltete SQL-Server-Quellen (On-Premises oder in Amazon EC2) beschrieben.

  2. Aktivieren Sie MS-REPLICATION in der Quelldatenbank. Dies kann entweder manuell oder durch einmaliges Ausführen der Aufgabe als Sysadmin-Benutzer erfolgen.

    Anmerkung

    Sie sollten den MS-REPLICATION-Verteiler entweder lokal oder so konfigurieren, dass Benutzer, die keine Systemadministratoren sind, über den zugehörigen Verbindungsserver darauf zugreifen können.

  3. Wenn die Option Nur sp_repldone innerhalb eines einzelnen Aufgaben-Endpunkts verwenden aktiviert ist, beenden Sie den MS-REPLICATION-Protokollleseauftrag.

  4. Führen Sie auf jedem Replikat die folgenden Schritte aus:

    1. Erstellen Sie das [awsdms][awsdms]-Schema in der Master-Datenbank:

      CREATE SCHEMA [awsdms]
    2. Erstellen Sie die [awsdms].[split_partition_list]-Tabellenwertfunktion in der Master-Datenbank:

      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. Erstellen Sie die [awsdms].[rtm_dump_dblog]-Prozedur in der Master-Datenbank:

      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. Erstellen Sie ein Zertifikat in der Master-Datenbank:

      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. Erstellen Sie eine Anmeldung aus dem Zertifikat:

      USE [master] GO CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
    6. Fügen Sie den Anmeldenamen zur Sysadmin-Serverrolle hinzu:

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
    7. Fügen Sie die Signatur zur Prozedur [master].[awsdms].[rtm_dump_dblog] unter Verwendung des Zertifikats hinzu:

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

      Wenn Sie die gespeicherte Prozedur neu erstellen, müssen Sie die Signatur erneut hinzufügen.

    8. Erstellen Sie die [awsdms].[rtm_position_1st_timestamp]-Prozedur in der Master-Datenbank:

      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. Erstellen Sie ein Zertifikat in der Master-Datenbank:

      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. Erstellen Sie eine Anmeldung aus dem Zertifikat:

      USE [master] GO CREATE LOGIN awsdms_rtm_position_1st_timestamp_login FROM CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert];
    11. Fügen Sie den Anmeldenamen zur Sysadmin-Serverrolle hinzu:

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
    12. Fügen Sie der [master].[awsdms].[rtm_position_1st_timestamp]-Prozedur mithilfe des Zertifikats die Signatur hinzu:

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

      Wenn Sie die gespeicherte Prozedur neu erstellen, müssen Sie die Signatur erneut hinzufügen.

    13. Erstellen Sie in jeder der folgenden Datenbanken einen Benutzer mit den folgenden Berechtigungen/Rollen:

      Anmerkung

      Sie sollten das Benutzerkonto dmsnosysadmin mit derselben SID für jedes Replikat erstellen. Die folgende SQL-Abfrage kann dabei helfen, den SID-Wert des dmsnosysadmin-Kontos auf jedem Replikat zu überprüfen. Weitere Informationen zum Erstellen eines Benutzers finden Sie unter BENUTZER ERSTELLEN (Transact-SQL) in der Microsoft-SQL-Server-Dokumentation. Weitere Informationen zum Erstellen von SQL-Benutzerkonten für die Azure-SQL-Datenbank finden Sie unter Aktive Georeplikation.

      SELECT @@servername servername, name, sid, create_date, modify_date FROM sys.server_principals WHERE name = 'dmsnosysadmin';
    14. Erteilen Sie für jedes Replikat Berechtigungen für die Master-Datenbank:

      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. Erteilen Sie für jedes Replikat Berechtigungen für die msdb-Datenbank:

      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. Fügen Sie die db_owner-Rolle zu dmsnosysadmin in der Quelldatenbank hinzu. Da die Datenbank synchronisiert ist, können Sie die Rolle nur dem primären Replikat hinzufügen.

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

SQL-Server-Unterstützungsskripts

In den folgenden Themen wird beschrieben, wie jedes für SQL Server verfügbare Unterstützungsskript heruntergeladen, überprüft und ausgeführt wird. Dort erfahren Sie auch, wie Sie die Skriptausgabe überprüfen und in Ihren AWS-Support-Fall hochladen können.

Das Skript awsdms_support_collector_sql_server.sql

Laden Sie das awsdms_support_collector_sql_server.sql-Skript herunter.

Anmerkung

Führen Sie dieses Skript zur Unterstützung der SQL-Server-Diagnose nur auf SQL Server 2014 und höheren Versionen aus.

Dieses Skript erfasst Informationen über Ihre SQL-Server-Datenbankkonfiguration. Denken Sie daran, die Prüfsumme des Skripts zu überprüfen. Wenn die Prüfsumme verifiziert wurde, überprüfen Sie den SQL-Code in dem Skript, um den Code auszukommentieren, dessen Ausführung Sie nicht wünschen. Wenn Sie mit der Integrität und dem Inhalt des Skripts zufrieden sind, können Sie es ausführen.

So führen Sie das Skript für eine On-Premises-SQL-Server-Datenbank aus
  1. Führen Sie das Skript mit der folgenden sqlcmd-Befehlszeile aus.

    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

    Zu den angegebenen sqlcmd-Befehlsparametern gehören unter anderem:

    • -U – Name des Datenbankbenutzers.

    • -P – Passwort des Datenbankbenutzers.

    • -S – Name des SQL-Server-Datenbankservers.

    • -y – Maximale Breite der vom Hilfsprogramm sqlcmd ausgegebenen Spalten. Ein Wert von 0 gibt Spalten mit unbegrenzter Breite an.

    • -i – Pfad des auszuführenden Unterstützungsskripts, in diesem Fall awsdms_support_collector_sql_server.sql.

    • -o – Pfad der HTML-Ausgabedatei mit einem von Ihnen angegebenen Dateinamen, der die erfassten Datenbankkonfigurationsinformationen enthält.

    • -d – Name der SQL-Server-Datenbank.

  2. Überprüfen Sie nach Abschluss des Skripts die HTML-Ausgabedatei und entfernen Sie alle Informationen, die Sie nicht weitergeben möchten. Wenn Sie den HTML-Code weitergeben können, laden Sie die Datei in Ihren AWS-Support-Fall hoch. Weitere Informationen zum Hochladen dieser Datei finden Sie unter Arbeiten mit Diagnoseunterstützungsskripts in AWS DMS.

Mit Amazon RDS für SQL Server können Sie keine Verbindung mit dem Befehlszeilen-Dienstprogramm sqlcmd herstellen. Gehen Sie daher wie folgt vor.

So führen Sie das Skript für eine RDS-SQL-Server-Datenbank aus
  1. Führen Sie das Skript mit einem beliebigen Client-Tool aus, mit dem Sie als Master-Benutzer eine Verbindung zu RDS SQL Server herstellen und die Ausgabe als HTML-Datei speichern können.

  2. Überprüfen Sie die Ausgabe-HTML-Datei und entfernen Sie alle Informationen, die Sie nicht weitergeben möchten. Wenn Sie den HTML-Code weitergeben können, laden Sie die Datei in Ihren AWS-Support-Fall hoch. Weitere Informationen zum Hochladen dieser Datei finden Sie unter Arbeiten mit Diagnoseunterstützungsskripts in AWS DMS.