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
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.
Themen
- Einrichtung von Mindestberechtigungen für eine On-Premises-SQL-Server-Datenbank
- Einrichtung von Mindestberechtigungen für eine Amazon-RDS-SQL-Server-Datenbank
- Einrichtung der fortlaufenden Replikation auf einem eigenständigen SQL Server: Ohne Sysadmin-Rolle
- Einrichtung einer laufenden Replikation auf einem SQL-Server in einer Availability-Group-Umgebung: Ohne Sysadmin-Rolle
- SQL-Server-Unterstützungsskripts
Einrichtung von Mindestberechtigungen für eine On-Premises-SQL-Server-Datenbank
So richten Sie Mindestberechtigungen für eine On-Premises-SQL-Server-Datenbank ein
-
Erstellen Sie unter Verwendung von SQL Server Management Studio (SSMS) ein neues SQL-Server-Konto mit Passwort-Authentifizierung, zum Beispiel
.on-prem-user
-
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. -
Ö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. -
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 TOon-prem-user
; GRANT SELECT ON MSDB.DBO.BACKUPMEDIAFAMILY TOon-prem-user
; GRANT SELECT ON MSDB.DBO.BACKUPFILE TOon-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
-
Erstellen Sie unter Verwendung von SQL Server Management Studio (SSMS) ein neues SQL-Server-Konto mit Passwort-Authentifizierung, zum Beispiel
.rds-user
-
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. -
Ö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. -
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 TOrds-user
; GRANT SELECT ON MSDB.DBO.BACKUPMEDIAFAMILY TOrds-user
; GRANT SELECT ON MSDB.DBO.BACKUPFILE TOrds-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
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.
Aktivieren Sie MS-REPLICATION in der Quelldatenbank. Dies kann entweder manuell oder durch einmaliges Ausführen der Aufgabe als Sysadmin-Benutzer erfolgen.
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
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
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';
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];
Fügen Sie die Anmeldung mithilfe des folgenden Skripts zur Sysadmin-Serverrolle hinzu:
ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
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.
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
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';
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];
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];
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';
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;
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
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
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.
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.
Wenn die Option Nur sp_repldone innerhalb eines einzelnen Aufgaben-Endpunkts verwenden aktiviert ist, beenden Sie den MS-REPLICATION-Protokollleseauftrag.
Führen Sie auf jedem Replikat die folgenden Schritte aus:
Erstellen Sie das
[awsdms]
[awsdms]-Schema in der Master-Datenbank:CREATE SCHEMA [awsdms]
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
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
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'
Erstellen Sie eine Anmeldung aus dem Zertifikat:
USE [master] GO CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
Fügen Sie den Anmeldenamen zur Sysadmin-Serverrolle hinzu:
ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
-
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.
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
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';
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];
Fügen Sie den Anmeldenamen zur Sysadmin-Serverrolle hinzu:
ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
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.
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';
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;
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
Fügen Sie die
db_owner
-Rolle zudmsnosysadmin
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
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
-
Führen Sie das Skript mit der folgenden sqlcmd-Befehlszeile aus.
sqlcmd -U
on-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 -dsqlserverdb01Zu 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 Fallawsdms_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.
-
-
Ü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
-
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. -
Ü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.