Skrip dukungan diagnostik SQL Server - AWS Layanan Migrasi Database

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Skrip dukungan diagnostik SQL Server

Berikut ini, Anda dapat menemukan deskripsi skrip dukungan diagnostik yang tersedia untuk menganalisis basis data on premise atau Amazon RDS for SQL Server di konfigurasi migrasi AWS DMS. Skrip ini bekerja dengan titik akhir sumber atau target. Untuk basis data on premise, jalankan skrip ini di utilitas baris perintah sqlcmd. Untuk informasi lebih lanjut tentang penggunaan utilitas ini, lihat sqlcmd - Gunakan utilitas dalam dokumentasi Microsoft.

Untuk basis data Amazon RDS, Anda tidak dapat terhubung menggunakan utilitas baris perintah sqlcmd. Sebaliknya, jalankan skrip ini menggunakan alat klien yang terhubung ke Amazon RDS SQL Server.

Sebelum menjalankan skrip, pastikan bahwa akun pengguna yang Anda gunakan memiliki izin yang diperlukan untuk mengakses basis data SQL Server. Untuk basis data on premise dan Amazon RDS, Anda dapat menggunakan izin yang sama dengan yang Anda gunakan untuk mengakses database SQL Server tanpa peran SysAdmin.

Menyiapkan izin minimum untuk database SQL Server lokal

Untuk mengatur izin minimum untuk menjalankan basis data SQL Server on premise
  1. Buat akun SQL Server baru dengan autentikasi kata sandi menggunakan SQL Server Management Studio (SSMS), misalnya on-prem-user.

  2. Di bagian Pemetaan pengguna dari SSMS, pilih basis data MSDB dan MASTER (yang memberikan izin publik), dan tetapkan peran DB_OWNER untuk basis data tempat Anda ingin menjalankan skrip.

  3. Buka menu konteks (klik kanan) untuk akun baru, lalu pilih Keamanan untuk secara eksplisit memberikan hak istimewa Connect SQL.

  4. Jalankan perintah pemberian berikut.

    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;

Menyiapkan izin minimum untuk database Amazon RDS SQL Server

Untuk menjalankan dengan izin minimum untuk basis data Amazon RDS SQL Server
  1. Buat akun SQL Server baru dengan autentikasi kata sandi menggunakan SQL Server Management Studio (SSMS), misalnya rds-user.

  2. Di bagian Pemetaan Pengguna dari SSMS, pilih basis data MSDB (yang memberikan izin publik), dan tetapkan peran DB_OWNER untuk basis data tempat Anda ingin menjalankan skrip.

  3. Buka menu konteks (klik kanan) untuk akun baru, lalu pilih Keamanan untuk secara eksplisit memberikan hak istimewa Connect SQL.

  4. Jalankan perintah pemberian berikut.

    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;

Menyiapkan replikasi yang sedang berlangsung pada SQL Server mandiri: Tanpa peran sysadmin

Bagian ini menjelaskan cara mengatur replikasi berkelanjutan untuk sumber database SQL Server mandiri yang tidak memerlukan akun pengguna untuk memiliki hak istimewa sysadmin.

catatan

Setelah menjalankan langkah-langkah di bagian ini, pengguna DMS non-sysadmin akan memiliki izin untuk melakukan hal berikut:

  • Baca perubahan dari file log transaksi online

  • Akses disk untuk membaca perubahan dari file cadangan log transaksional

  • Menambahkan atau mengubah publikasi yang digunakan DMS

  • Tambahkan artikel ke publikasi

  1. Siapkan Microsoft SQL Server untuk Replikasi seperti yang dijelaskan dalam. Menangkap perubahan data untuk SQL Server yang dikelola sendiri di tempat atau di Amazon EC2

  2. Aktifkan MS-REPLIKASI pada database sumber. Ini dapat dilakukan secara manual atau dengan menjalankan tugas sekali sebagai pengguna sysadmin.

  3. Buat awsdms skema pada database sumber menggunakan skrip berikut:

    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. Buat [awsdms].[rtm_dump_dblog] prosedur pada database Master menggunakan skrip berikut:

    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. Buat sertifikat pada database Master menggunakan skrip berikut:

    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. Buat login dari sertifikat menggunakan skrip berikut:

    Use [master] Go CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
  7. Tambahkan login ke peran server sysadmin menggunakan skrip berikut:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
  8. Tambahkan tanda tangan ke [master]. [awsdms]. [rtm_dump_dblog] menggunakan sertifikat, menggunakan skrip berikut:

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

    Jika Anda membuat ulang prosedur yang disimpan, Anda perlu menambahkan tanda tangan lagi.

  9. Buat [awsdms]. [rtm_position_1st_timestamp] pada database Master menggunakan skrip berikut:

    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. Buat sertifikat pada database Master menggunakan skrip berikut:

    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. Buat login dari sertifikat menggunakan skrip berikut:

    Use [master] Go CREATE LOGIN awsdms_rtm_position_1st_timestamp_login FROM CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert];
  12. Tambahkan login ke peran sysadmin menggunakan skrip berikut:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
  13. Tambahkan tanda tangan ke [master]. [awsdms]. [rtm_position_1st_timestamp] menggunakan sertifikat, menggunakan skrip berikut:

    Use [master] GO ADD SIGNATURE TO [master].[awsdms].[rtm_position_1st_timestamp] BY CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert] WITH PASSWORD = '@5trongpassword';
  14. Berikan pengguna DMS mengeksekusi akses ke prosedur tersimpan baru menggunakan skrip berikut:

    use master go GRANT execute on [awsdms].[rtm_position_1st_timestamp] to dms_user;
  15. Buat pengguna dengan izin dan peran berikut di masing-masing database berikut:

    catatan

    Anda harus membuat akun pengguna dmsnosysadmin dengan SID yang sama pada setiap replika. Kueri SQL berikut dapat membantu memverifikasi nilai SID akun dmsnosysadmin pada setiap replika. Untuk informasi selengkapnya tentang membuat pengguna, lihat MEMBUAT PENGGUNA (Transact-SQL) di dokumentasi server Microsoft SQL. Untuk informasi selengkapnya tentang membuat akun pengguna SQL untuk database Azure SQL, lihat Replikasi geo aktif.

    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]

    Jalankan skrip berikut pada database sumber:

    EXEC sp_addrolemember N'db_owner', N'DMS_user' use Source_DB go
  16. Terakhir, tambahkan Extra Connection Attribute (ECA) ke titik akhir SQL Server sumber:

    enableNonSysadminWrapper=true;

Menyiapkan replikasi yang sedang berlangsung di SQL Server di lingkungan grup ketersediaan: Tanpa peran sysadmin

Bagian ini menjelaskan cara mengatur replikasi berkelanjutan untuk sumber database SQL Server di lingkungan grup ketersediaan yang tidak memerlukan akun pengguna untuk memiliki hak istimewa sysadmin.

catatan

Setelah menjalankan langkah-langkah di bagian ini, pengguna DMS non-sysadmin akan memiliki izin untuk melakukan hal berikut:

  • Baca perubahan dari file log transaksi online

  • Akses disk untuk membaca perubahan dari file cadangan log transaksional

  • Menambahkan atau mengubah publikasi yang digunakan DMS

  • Tambahkan artikel ke publikasi

Untuk mengatur replikasi yang sedang berlangsung tanpa menggunakan pengguna sysadmin di lingkungan Grup Ketersediaan
  1. Siapkan Microsoft SQL Server untuk Replikasi seperti yang dijelaskan dalam. Menangkap perubahan data untuk SQL Server yang dikelola sendiri di tempat atau di Amazon EC2

  2. Aktifkan MS-REPLIKASI pada database sumber. Ini dapat dilakukan secara manual atau dengan menjalankan tugas sekali menggunakan pengguna sysadmin.

    catatan

    Anda harus mengkonfigurasi distributor MS-REPLICATION sebagai lokal atau dengan cara yang memungkinkan akses ke pengguna non-sysadmin melalui server tertaut terkait.

  3. Jika opsi Exclusive use sp_repldone dalam satu titik akhir tugas diaktifkan, hentikan pekerjaan MS-REPLICATION Log Reader.

  4. Lakukan langkah-langkah berikut pada setiap replika:

    1. Buat skema [awsdms] [awsdms] di database master:

      CREATE SCHEMA [awsdms]
    2. Buat fungsi [awsdms].[split_partition_list] tabel bernilai pada database Master:

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

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

      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. Buat login dari sertifikat:

      USE [master] GO CREATE LOGIN awsdms_rtm_dump_dblog_login FROM CERTIFICATE [awsdms_rtm_dump_dblog_cert];
    6. Tambahkan login ke peran server sysadmin:

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_dump_dblog_login];
    7. Tambahkan tanda tangan ke [master]. [awsdms]. Prosedur [rtm_dump_dblog] menggunakan sertifikat:

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

      Jika Anda membuat ulang prosedur yang disimpan, Anda perlu menambahkan tanda tangan lagi.

    8. Buat [awsdms].[rtm_position_1st_timestamp] prosedur pada database Master:

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

      USE [master] GO CREATE CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert] ENCRYPTION BY PASSWORD = N'@hardpassword1' WITH SUBJECT = N'Certificate for FN_POSITION_1st_TIMESTAMP Permissions';
    10. Buat login dari sertifikat:

      USE [master] GO CREATE LOGIN awsdms_rtm_position_1st_timestamp_login FROM CERTIFICATE [awsdms_rtm_position_1st_timestamp_cert];
    11. Tambahkan login ke peran server sysadmin:

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [awsdms_rtm_position_1st_timestamp_login];
    12. Tambahkan tanda tangan ke [master].[awsdms].[rtm_position_1st_timestamp] prosedur menggunakan sertifikat:

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

      Jika Anda membuat ulang prosedur yang disimpan, Anda perlu menambahkan tanda tangan lagi.

    13. Buat pengguna dengan izin/peran berikut di setiap database berikut:

      catatan

      Anda harus membuat akun pengguna dmsnosysadmin dengan SID yang sama pada setiap replika. Kueri SQL berikut dapat membantu memverifikasi nilai SID akun dmsnosysadmin pada setiap replika. Untuk informasi selengkapnya tentang membuat pengguna, lihat MEMBUAT PENGGUNA (Transact-SQL) di dokumentasi server Microsoft SQL. Untuk informasi selengkapnya tentang membuat akun pengguna SQL untuk database Azure SQL, lihat Replikasi geo aktif.

      SELECT @@servername servername, name, sid, create_date, modify_date FROM sys.server_principals WHERE name = 'dmsnosysadmin';
    14. Berikan izin pada database master pada setiap replika:

      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. Berikan izin pada database msdb pada setiap replika:

      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. Tambahkan db_owner peran dmsnosysadmin ke database sumber. Karena database disinkronkan, Anda dapat menambahkan peran pada replika utama saja.

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

Skrip Dukungan SQL Server

Topik berikut menjelaskan cara mengunduh, meninjau, dan menjalankan setiap skrip dukungan yang tersedia untuk SQL Server. Topik berikut juga menjelaskan cara meninjau dan mengunggah output skrip ke kasus AWS Support Anda.

skrip awsdms_support_collector_sql_server.sql

Unduh skrip awsdms_support_collector_sql_server.sql.

catatan

Jalankan skrip dukungan diagnostik SQL Server ini pada SQL Server 2014 dan versi yang lebih tinggi saja.

Skrip ini mengumpulkan informasi tentang konfigurasi basis data SQL Server Anda. Ingatlah untuk memverifikasi checksum pada skrip, dan jika checksum memverifikasi, tinjau kode SQL di dalam skrip untuk mengomentari salah satu kode yang tidak nyaman Anda jalankan. Setelah Anda puas dengan integritas dan isi skrip, Anda bisa menjalankannya.

Untuk menjalankan skrip untuk basis data SQL Server on premise
  1. Jalankan skrip menggunakan baris perintah sqlcmd berikut.

    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

    Parameter perintah sqlcmd yang ditentukan mencakup hal-hal berikut:

    • -U – Nama pengguna basis data.

    • -P – Kata sandi pengguna basis data.

    • -S – Nama server basis data SQL Server.

    • -y – Lebar maksimum output kolom dari utilitas sqlcmd. Nilai 0 menentukan kolom dengan lebar tak terbatas.

    • -i – Jalur skrip dukungan dijalankan, dalam hal ini awsdms_support_collector_sql_server.sql.

    • -o – Jalur file HTML output, dengan nama file yang Anda tentukan, berisi informasi konfigurasi basis data yang dikumpulkan.

    • -d – Nama basis data SQL Server.

  2. Setelah skrip selesai, tinjau file HTML output dan hapus informasi yang membuat Anda tidak nyaman jika dibagikan. Ketika Anda merasa HTML dapat dibagikan, unggah file ke kasus AWS Support. Untuk informasi lebih lanjut tentang mengunggah file ini, lihat Bekerja dengan skrip dukungan diagnostik di AWS DMS.

Dengan Amazon RDS for SQL Server, Anda tidak dapat terhubung menggunakan utilitas baris perintah sqlcmd, jadi gunakan prosedur berikut.

Untuk menjalankan skrip untuk basis data RDS SQL Server
  1. Jalankan skrip menggunakan alat klien yang memungkinkan Anda untuk terhubung ke RDS SQL Server sebagai pengguna Master dan simpan output sebagai file HTML.

  2. Tinjau file HTML output dan hapus informasi yang membuat Anda tidak nyaman jika dibagikan. Ketika Anda merasa HTML dapat dibagikan, unggah file ke kasus AWS Support. Untuk informasi lebih lanjut tentang mengunggah file ini, lihat Bekerja dengan skrip dukungan diagnostik di AWS DMS.