メイン コンテンツをスキップする 補完的コンテンツへスキップ

Microsoft SQL Server AlwaysOn 可用性グループの処理

Microsoft SQL Server AlwaysOn 可用性グループ機能は、データベースのミラーリングに代わるエンタープライズレベルの高可用性、ディザスター リカバリ ソリューションです。

前提条件

  • 個別レプリカに対する接続に使用される資格情報は、AlwaysOn Listener への接続に使用されるものと同一である必要があります。
  • レプリカは、接続を許可するよう構成する必要があります。

    これを構成するには、DBA が次のスクリプトを実行する必要があります。

    ALTER AVAILABILITY GROUP [{ag_name}]
    MODIFY REPLICA ON '{replica_name}'
    WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = 
    'TCP://{replica_name}:{Port}'))

AlwaysOn Listener にアクセスするために Data Movement gateway を構成する

接続プロパティ の AlwaysOn 可用性グループを操作する場合は、IP アドレス/ホスト名と、AlwaysOn リスナーのアクセス資格情報を指定する必要があります。。

制限事項

DAG (分散可用性グループ) はサポートされていません。

AlwaysOn 可用性グループでバックアップ ログにアクセスする

AlwaysOn 可用性グループ全体で同期されるアクティブ トランザクション ログとは対照的に、バックアップ トランザク ション ログは個別のレプリカごとに異なります。そのため、Data Movement gateway がバックアップ トランザクション ログにアクセスする必要がある場合、バックアップ ログが見つかるまで、必要なログがあるかどうか各レプリカに対して順に「尋ねます」。Data Movement gateway が通信しようとしているレプリカの 1 つがオフラインの場合、Data Movement gateway はレプリカがオンラインに戻るまで待機し、バックアップ トランザクション ログについて尋ねます。

次のシナリオでは (または必要なログが見つかるまで)、Data Movement gateway は、各レプリカのバックアップ トランザクション ログにアクセスする必要があります。

  • バックアップ専用モードで作業している。

    このモードの詳細については、「 オンプレミス Microsoft SQL Server (ログ ベース)Connecting to an on-premises Microsoft SQL Server (log based) source」を参照してください。

  • Data Movement gateway がアクティブ ログのみでは処理できない大量のイベント (変更) があることによる待機時間のため。
情報メモ

AlwaysOn 可用性グループからバックアップ ログを読み込むには、すべてのレプリカに対して開かれた接続が必要となります。これを希望しない場合は、] の [接続プロパティ] の [処理モードの変更] を [オンライン ログのみ] に設定します。

AlwaysOn 可用性グループを処理する際、non-sysadmin ユーザーを設定する

このセクションでは、AlwaysOn 可用性グループを処理する際に non-sysadmin ユーザーをサポートする方法を説明します。標準環境で non-sysadmin を設定する方法については、「スタンドアロン環境における non-sysadmin のユーザーの設定」を参照してください。

AlwaysOn 可用性グループを処理する際に non-sysadmin ユーザーをサポートするには:

  1. 複製のための Microsoft SQL Server の設定 の説明に従って、Microsoft SQL Server for Replication を設定します。
  2. ソース データベースで MS-REPLICATION を有効化します。これは、手動で、または sysadmin ユーザーを使ってタスクを一回実行することにより可能です。

    情報メモ

    MS-REPLICATION ディストリビューターは、ローカルとして、または関連付けられたリンク済みサーバー経由で non-sysadmin ユーザーにアクセスできる方法で構成できます。

  1. 各レプリカで、次のステップ (a-l) を実行します:
    1. マスター DB にスキーマ [attrep] を作成します。
    2. 次のように、マスター データベースにテーブル値関数 [attrep].[split_partition_list] を作成します。

      USE [master]
      GO
      
      set ansi_nulls on
      go
      
      set quoted_identifier on
      go
      
      if (object_id('[attrep].[split_partition_list]','TF')) is not null
      drop  function [attrep].[split_partition_list];
      go
      
      create function [attrep].[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. 次のように、マスター データベースにプロシージャ [attrep].[rtm_dump_dblog] を作成します。

      USE [master]
      GO
      
      use [MASTER] 
      go 
      
      if (object_id('[attrep].[rtm_dump_dblog]','P')) is not null
      drop procedure [attrep].[rtm_dump_dblog]; 
      go
      
      set ansi_nulls on
      go 
      
      set quoted_identifier on 
      go
      							
      create procedure [attrep].[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
                      --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.attrep.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. マスター DB で証明書を作成します。

      Use [master]
      Go
      CREATE CERTIFICATE [attrep_rtm_dump_dblog_cert]
      ENCRYPTION BY PASSWORD = N'choose_your_own_pwd'
      WITH SUBJECT = N'Certificate for FN_DUMP_DBLOG Permissions';
    5. 次のように、証明書からログインを作成します。

      Use [master]
      Go
      CREATE LOGIN attrep_rtm_dump_dblog_login FROM CERTIFICATE
      [attrep_rtm_dump_dblog_cert];
    6. 次のように、sysadmin サーバーにログインを追加します。

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [attrep_rtm_dump_dblog_login];
    7. 次のように、証明書の署名を [master].[attrep].[rtm_dump_dblog] に追加します。

      Use [master]
      GO
      ADD SIGNATURE
      TO [master].[attrep].[rtm_dump_dblog]
      BY CERTIFICATE [attrep_rtm_dump_dblog_cert]
      					WITH PASSWORD = 'choose_your_own_pwd';
      情報メモ

      保管された手順が再作成された場合、署名をもう一度追加する必要があります。

    8. 次のように、マスター データベースにプロシージャ [attrep].[rtm_position_1st_timestamp] を作成します。

      use [master]
      if object_id('[attrep].[rtm_position_1st_timestamp]','P') is not null
      DROP PROCEDURE [attrep].[rtm_position_1st_timestamp];
      go
      create procedure [attrep].[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
      
    9. マスター DB で証明書を作成します。

      Use [master]
      Go
      CREATE CERTIFICATE [attrep_rtm_position_1st_timestamp_cert]
      ENCRYPTION BY PASSWORD = N'choose_your_own_pwd'
      WITH SUBJECT = N'Certificate for FN_POSITION_1st_TIMESTAMP Permissions';
    10. 次のように、証明書からログインを作成します。

      Use [master]
      Go
      CREATE LOGIN attrep_rtm_position_1st_timestamp_login FROM CERTIFICATE
      [attrep_rtm_position_1st_timestamp_cert];
    11. 次のように、sysadmin サーバーにログインを追加します。

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [attrep_rtm_position_1st_timestamp_login];
    12. 次のように、証明書の署名を [master].[attrep].[rtm_position_1st_timestamp] に追加します。

      Use [master]
      GO
      ADD SIGNATURE
      TO [master].[attrep].[rtm_position_1st_timestamp]
      BY CERTIFICATE [attrep_rtm_position_1st_timestamp_cert]
      WITH PASSWORD = 'choose_your_own_pwd';
      情報メモ

      保管された手順が再作成された場合、署名をもう一度追加する必要があります。

  2. 次の権限/役割を持つユーザーを作成します (次の各データベースで):

    情報メモ

    ログインは、各レプリカで同じ SID で作成する必要があります。

    • マスター DB (各レプリカで):
      • sys.fn_dblog で選択する
      • 定義を表示する
      • サーバー状態を表示する (ログインに付与される)。
      • sp_repldone を実行する
      • sp_replincrementlsn を実行する
      • sp_addpublication を実行する
      • sp_addarticle を実行する
      • sp_articlefilter を実行する
      • [attrep].[split_partition_list] で選択する
      • [attrep].[rtm_dump_dblog] で実行する
      • [attrep].[rtm_position_1st_timestamp] で実行する
    • MSDB DB (各レプリカで):
      • msdb.dbo.backupset で選択する
      • msdb.dbo.backupmediafamily で選択する
      • msdb.dbo.backupfile で選択する
    • ソース データベースの場合 (データベースが同期されると、プライマリ レプリカのみで実行できます):
      • db_owner 役割

このページは役に立ちましたか?

このページまたはコンテンツに、タイポ、ステップの省略、技術的エラーなどの問題が見つかった場合は、お知らせください。改善に役立たせていただきます。