Loading...

We've detected that your browser language is Chinese. Would you like to visit our Chinese website? [ Dismiss ]
著者: Dylan

Microsoft SQL Server 常時ON可用性グループ(AG)は基幹業務データベースに対し、高可用性と災害復旧機能を提供します。同時にSQL Serverレプリケーションは、データ配信、レポート処理の負荷分散、差分同期、複数サーバー間のデータ統合に対応します。

多くの企業環境ではこの2つの技術を組み合わせて利用し、レプリカのフェイルオーバーが発生した場合でも下流のサブスクライバーに影響を与えず稼働を継続する、耐障害性の高いデータパイプラインを構築しています。

しかし、可用性グループとレプリケーションの仕組みには標準で制限事項が存在するため、データベース管理者は多くの課題に直面します。既定の設定ではAG上のデータベースをレプリケーションのパブリッシャーとして直接構成することはできません。適切な設定を行わない場合、自動または手動フェイルオーバー後にレプリケーションが完全に停止する恐れがあります。

本ガイドでは常時ON可用性グループと連携したレプリケーションの構成手順を解説します。事前要件、詳細な設定手順、運用時に発生する一般的なトラブルを記載しています。

常時ON AGの対応シナリオと制限事項

作業を開始する前に、常時ON AGとSQL Serverレプリケーションの対応シナリオおよび制限事項を確認してください。

対応しているレプリケーション種別

  • トランザクションレプリケーション(完全対応、本番環境での標準利用ケース)
  • スナップショットレプリケーション(完全対応)

非対応・互換性のないレプリケーション構成

MicrosoftはAG上でホストされたデータベースでは以下のレプリケーショントポロジを明示的に制限しています。

  • ピアツーピアレプリケーション
  • 即時更新サブスクライバー、キュー更新サブスクライバー
  • AGデータベースからのOracleパブリッシュ
  • マージレプリケーション(機能に制限があり、本番環境での利用は推奨されません)

アーキテクチャ上の重要ルール

  1. セカンダリレプリカはアクティブなパブリッシャーとして動作できません。現在のAGプライマリレプリカのみがレプリケーションのサブスクライバーにデータを配信可能です。セカンダリレプリカはパブリッシャー役割のフェイルオーバー先として待機状態となります。
  2. レプリケーションエージェントは各レプリカのホスト名ではなく、AGリスナーのエンドポイントに接続します。
  3. システムストアドプロシージャ sp_redirect_publisher は元のパブリッシャーインスタンスを固定のAGリスナーに紐付けます。これがフェイルオーバー後もレプリケーションを維持する核心的な仕組みです。
  4. フェイルオーバーによるプライマリ昇格に対応するため、すべてのAGレプリカをリモートディストリビューターに登録する必要があります。

常時ON AGで要件を満たせる場合、本記事ではより簡単で高性能な代替レプリケーションソリューションも紹介します。

常時ON AGと連携したレプリケーション構成の事前要件

設定作業を開始する前に、インフラ、エディション、設定に関するすべての事前要件を満たしていることを確認してください。

1. 可用性グループのすべてのレプリカノードにSQL Server Enterpriseエディションが必要です。 AGとレプリケーションの基本的な連携機能はSQL Server 2016以降で完全サポートされています。可用性グループによるディストリビューションデータベースの高可用性は、SQL Server 2016 SP2 CU3、SQL Server 2017 CU6、およびそれ以降のすべてのバージョンで対応しています。

2. AGが完全に構成済みで、プライマリ・セカンダリレプリカの状態が正常、ユーザーデータベースの同期が完了し、未解消のAG健全性警告が存在しないこと。

3. 可用性グループクラスターのすべてのノードにSQL Serverレプリケーション機能をインストールする必要があります。プライマリレプリカだけでは不十分です。フェイルオーバーでパブリッシャーとなる可能性のあるすべてのノードで、レプリケーションエージェントとメタデータの実行ファイルを統一する必要があります。

4. 本番環境ではスタンドアロン型のリモートSQL Serverディストリビューターを強く推奨します。ローカルディストリビューターも利用可能ですが、高可用性の分離設計ができず、運用の複雑度が上昇します。ディストリビューターはすべてのレプリケーションメタデータ、エージェントジョブ、トランザクションログ配信を管理します。

5. 本連携機能にはDNS名の可用性グループリスナーが必須です。リスナーはAGフェイルオーバー時に変更されない固定のネットワークエンドポイントを提供し、透過的なパブリッシャーリダイレクトを実現します。

6. セキュリティとネットワーク権限を正しく設定する必要があります。

  • すべてのAGレプリカ、ディストリビューター、サブスクライバーサーバーにsysadminサーバーロールの権限
  • すべてのレプリカノードで統一されたWindowsログイン、サービスアカウント、権限
  • レプリケーションスナップショット作業フォルダへの制限のないネットワーク共有アクセス
  • 接続認証エラーを回避するための正常に動作するKerberos認証

7. AG配下のユーザーデータベースは完全復旧モデル(FULL)に設定し、トランザクションレプリケーションのログ読み取りに対応するためトランザクションログバックアップを構成する必要があります。

常時ON可用性グループと連携したレプリケーションの構成手順

ご利用のSQL Server環境で以下の手順を実施してください。

手順1:ディストリビューターとディストリビューションデータベースの設定

ディストリビューターはレプリケーションの基盤となるコンポーネントで、メタデータとトランザクションコマンドを保管するディストリビューションデータベースを保持します。以下にディストリビューターとディストリビューションDBの設定方法を記載します。

►オプションA:スタンドアロンディストリビューター(全対応バージョン)

1. SQL Server管理ツール(SSMS)からディストリビューターインスタンスに接続します。

2. レプリケーションを右クリックし、「ディストリビューションの構成」を選択します。

SQL Server管理ツールでのディストリビューション設定画面

3. ウィザードに従い、当該インスタンスを自身のディストリビューターとして設定、スナップショットフォルダを指定し、ディストリビューションデータベースを作成します。

4. T-SQLを使用する場合は以下のコードを実行します。

USE master;
GO
EXEC sp_adddistributor @distributor = @@SERVERNAME, @password = N'StrongPassword!';
GO
EXEC sp_adddistributiondb @database = N'distribution';
GO

►オプションB:可用性グループ上のディストリビューションDB(SQL Server 2016 SP2-CU3以降 / 2017 CU6以降)

ディストリビューター側に高可用性が必要な場合は、ディストリビューションデータベースを専用のAGに配置できます。本構成は慎重な設定が必要ですが、最重要要件としてパブリッシャーとディストリビューターを別々のSQL Serverインスタンスに分ける必要があります。また、ディストリビューションDB用AGに専用のリスナーを作成する必要があります。

手順2:プライマリレプリカ上でパブリッシャーを設定

ディストリビューターの準備が完了したら、現在のプライマリレプリカ上でデータベースをパブリケーション対象として設定します。

1. プライマリレプリカインスタンスに接続します。

2. データベースをトランザクションレプリケーション有効化します。

USE [YourDatabaseName];
GO
EXEC sp_replicationdboption
@dbname = N'YourDatabaseName',
@optname = N'publish',
@value = N'true';
GO

3. パブリケーションを作成します。重要:この段階ではAGリスナーではなく、プライマリレプリカの物理サーバー名を使用します。リスナーへのリダイレクトは後の手順で実施します。

USE [YourDatabaseName];
GO
EXEC sp_addpublication
@publication = N'YourPublicationName',
@description = N'Transactional publication of database.',
@sync_method = N'concurrent',
@retention = 336,
@allow_push = N'true',
@allow_pull = N'true',
@allow_anonymous = N'false',
@enabled_for_internet = N'false',
@snapshot_in_defaultfolder = N'true',
@compress_snapshot = N'false',
@ftp_port = 21,
@allow_subscription_copy = N'false',
@add_to_active_directory = N'false',
@repl_freq = N'continuous',
@status = N'active',
@independent_agent = N'true',
@immediate_sync = N'true',
@allow_sync_tran = N'false',
@autogen_sync_procs = N'false',
@allow_queued_tran = N'false',
@allow_dts = N'false',
@replicate_ddl = 1,
@allow_initialize_from_backup = N'true',
@enabled_for_p2p = N'false',
@enabled_for_het_sub = N'false';
GO

4. パブリケーションにアーティクル(テーブル、ビューなど)を追加します。

USE [YourDatabaseName];
GO
EXEC sp_addarticle
@publication = N'YourPublicationName',
@article = N'YourTableName',
@source_owner = N'dbo',
@source_object = N'YourTableName',
@type = N'logbased',
@description = NULL,
@creation_script = NULL,
@pre_creation_cmd = N'drop',
@schema_option = 0x000000000803509F,
@identityrangemanagementoption = N'none',
@destination_table = N'YourTableName',
@destination_owner = N'dbo',
@status = 24;
GO

— レプリケーション対象のテーブルごとに上記コマンドを実行してください

手順3:すべてのセカンダリレプリカホストにレプリケーション設定を適用

フェイルオーバー後にプライマリとなる可能性のあるすべてのセカンダリレプリカは、パブリケーションをホストできるよう適切に設定する必要があります。

各セカンダリレプリカホストで以下の作業を実施します。

1. ディストリビューターを追加(未登録の場合):

USE master;
GO
EXEC sp_adddistributor
@distributor = N'YourDistributorServerName',
@password = N'StrongPassword!';
GO

2. 各セカンダリレプリカをディストリビューターに登録します。ディストリビューターインスタンス上で実行します。

USE distribution;
GO
EXEC sp_adddistpublisher
@publisher = N'SecondaryReplicaHostName', -- セカンダリレプリカの物理サーバー名
@distribution_db = N'distribution',
@working_directory = N'\\NetworkShare\ReplData',
@security_mode = 1, -- 1 = Windows認証
@trusted = N'false',
@thirdparty_flag = 0,
@publisher_type = N'MSSQLSERVER';
GO

— パブリッシャー候補となるすべてのセカンダリレプリカごとに実行

3. プッシュサブスクリプションに必要なため、各セカンダリレプリカ上でサブスクライバーをリンクサーバーとして登録します。

— 各セカンダリレプリカで実行

EXEC sp_addlinkedserver
@server = N'SubscriberServerName',
@srvproduct = N'SQL Server';
GO

手順4:セカンダリレプリカホストをレプリケーションパブリッシャーとして設定

本手順でセカンダリレプリカ側の設定を完了させ、フェイルオーバー時に完全にパブリッシャーとして動作できる状態にします。

各セカンダリレプリカホストで以下を実行します。

-- 本手順でセカンダリ側にパブリケーション情報を登録します
USE [YourDatabaseName];
GO
EXEC sp_replicationdboption
@dbname = N'YourDatabaseName',
@optname = N'publish',
@value = N'true';
GO

注記:セカンダリ側でパブリケーションを再作成しないでください。パブリケーションはデータベース内に既に存在しており、当該DBがプライマリに昇格した際に自動的に認識されます。

手順5:元のパブリッシャーをAGリスナー名にリダイレクト

シームレスなフェイルオーバーを実現するための最重要手順です。ディストリビューターに対し、元のパブリッシャーに接続できない場合はAGリスナーに接続するよう通知します。

ディストリビューターインスタンスのdistributionデータベース上で実行します。

USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = N'PhysicalPrimaryServerName', -- 元のプライマリホスト名
@publisher_db = N'YourDatabaseName',
@redirected_publisher = N'YourAGListenerName'; -- 既定以外のポートを使用する場合は「リスナー名,2233」の形式で記載可
GO
-- リダイレクト設定の検証
USE distribution;
GO
SELECT * FROM MSredirected_publishers;
GO

手順6:設定の検証

サブスクリプションを作成する前に、Microsoftはすべてのレプリカがパブリッシャーとして正常に設定されているか検証することを推奨しています。

ディストリビューター上で以下の検証コマンドを実行します。

USE distribution;
GO
DECLARE @redirected_publisher sysname;
EXEC sys.sp_validate_replica_hosts_as_publishers
@original_publisher = N'PhysicalPrimaryServerName',
@publisher_db = N'YourDatabaseName',
@redirected_publisher = @redirected_publisher OUTPUT;
GO

検証でエラーが返される場合は、前工程を再確認し、すべてのセカンダリレプリカがディストリビューターに正しく登録され、パブリッシュ対象DBとして設定されているか確認してください。

手順7:サブスクリプションの作成

ここでサブスクリプションを作成します。AGリスナーの構成にSSMSのウィザードは正しく対応できないため、T-SQLスクリプトを使用する必要があります。

►オプションA:プッシュサブスクリプション(AG配下サブスクライバーに推奨)

パブリッシャー側でプッシュサブスクリプションを作成します。サブスクライバーDBがAG配下の場合はサブスクライバーのAGリスナー名、そうでない場合は物理サーバー名を指定します。

-- パブリッシャー(プライマリレプリカ)上で実行
GO

-- サブスクリプションの追加
EXEC sp_addsubscription
@publication = N'YourPublicationName',
@subscriber = N'SubscriberAGListenerName', -- サブスクライバーがAG配下の場合はリスナー名を使用
@destination_db = N'SubscriberDatabaseName',
@subscription_type = N'Push',
@sync_type = N'automatic',
@article = N'all',
@update_mode = N'read only',
@subscriber_type = 0;
GO

-- ディストリビューションエージェントジョブの追加
EXEC sp_addpushsubscription_agent
@publication = N'YourPublicationName',
@subscriber = N'SubscriberAGListenerName',
@subscriber_db = N'SubscriberDatabaseName',
@job_login = N'DOMAIN\ReplAgentAccount',
@publication = N'YourPublicationName',
@job_password = N'StrongPassword!',
@subscriber_security_mode = 1, -- 1 = Windows認証
@frequency_type = 64, -- 64 = 常時実行
@frequency_interval = 0,
@frequency_relative_interval = 0,
@frequency_recurrence_factor = 0,
@frequency_subday = 0,
@frequency_subday_interval = 0,
@active_start_time_of_day = 0,
@active_end_time_of_day = 235959,
@active_start_date = 20240101,
@active_end_date = 99991231,
@dts_package_location = N'Distributor';
GO

►オプションB:プルサブスクリプション

プルサブスクリプションはサブスクライバー側で作成します。パブリッシャー側にはAGリスナー名を指定します。

-- サブスクライバー上で実行
USE [SubscriberDatabaseName];
GO

-- プルサブスクリプションの追加
EXEC sp_addpullsubscription
@publisher = N'YourAGListenerName', -- パブリッシャー側AGリスナー
@publication = N'YourPublicationName',
@publisher_db = N'YourDatabaseName',
@independent_agent = N'True';
GO

-- サブスクライバー側にディストリビューションエージェントジョブを追加
EXEC sp_addpullsubscription_agent
@publisher = N'YourAGListenerName',
@publisher_db = N'YourDatabaseName',
@publication = N'YourPublicationName',
@distributor = N'YourDistributorServerName',
@distributor_security_mode = 1,
@distributor_login = N'',
@distributor_password = N'',
@enabled_for_syncmgr = N'False',
@frequency_type = 64,
@frequency_interval = 0,
@frequency_relative_interval = 0,
@frequency_recurrence_factor = 0,
@frequency_subday = 0,
@frequency_subday_interval = 0,
@active_start_time_of_day = 0,
@active_end_time_of_day = 235959,
@active_start_date = 20240101,
@active_end_date = 99991231,
@alt_snapshot_folder = N'',
@working_directory = N'';
GO

サブスクライバーDBがAG配下の状態でプルサブスクリプションを作成すると、ディストリビューションエージェントジョブはサブスクライバーAGの現在のプライマリレプリカにのみ作成されます。元のサーバーが稼働し続けている場合、サブスクライバーAGのフェイルオーバー後もレプリケーションは自動的に継続されます(ジョブは旧プライマリ上で実行され続けます)。

ただし長期的な安定運用のため、旧プライマリのジョブを無効化し、新しいプライマリにジョブを作成・有効化する必要があります。詳細は「フェイルオーバー後の運用管理」の項目を参照してください。

手順8:スナップショットエージェントを起動し、サブスクライバーを初期化

サブスクライバーの初期同期用スナップショットを生成します。

-- パブリッシャー(プライマリレプリカ)上で実行
USE [YourDatabaseName];
GO
EXEC sp_startpublication_snapshot @publication = N'YourPublicationName';
GO

スナップショットの生成・配信状況はレプリケーションモニター、またはdistributionデータベースのMSsnapshot_historyテーブルを照会して監視できます。

手順9:レプリケーションモニターに元のパブリッシャーを追加(任意、推奨)

監視を容易にするため、レプリケーションモニターに元のパブリッシャーを追加します。

1. SSMSからディストリビューターインスタンスに接続します。

2. レプリケーションを展開し、レプリケーションモニターを右クリック、「パブリッシャーの追加」を選択します。

3. パブリッシャーの元の物理サーバー名を追加します。レプリケーションモニターは自動的にリダイレクト先のパブリッシャーを検知し、正しい情報を表示します。

注記:フェイルオーバー後もレプリケーションモニターには元のプライマリ名が表示され続ける場合がありますが、レプリケーション機能に影響はありません。

データベースフェイルオーバー向け簡易で高機能なレプリケーションソリューション

常時ON可用性グループは高可用性を実現できますが、可用性グループとレプリケーションを連携させる設定作業は複雑です。読み書き分離、可視化レポート、データ配信による異種DB統合などの要件がある場合は、専用のデータベースレプリケーションソリューションをご検討ください。

i2Streamは企業向けの代替ソリューションで、純粋な高可用性以外の用途に常時ON AGを拡張する際の制限事項を解消します。SQL Server Enterpriseエディションは不要で、Windowsクラスターにも依存しません。

i2Streamの主な特長・メリット

  • 非侵入型CDC:ログベースの変更データキャプチャにマルチスレッド並列処理を採用し、サブ秒単位の低遅延を保ちながら高いレプリケーションパフォーマンスを実現します。i2StreamはソースDBのコミット処理と分離されているため、複数の配信先にレプリケーションを実施しても本番業務の処理をブロック・遅延させません。
  • エージェントレスで簡素なアーキテクチャ:本番DBサーバーにエージェントやソフトウェアをインストールする必要がなく、パフォーマンス影響とセキュリティリスクを排除します。統合ダッシュボードで処理量、遅延、エラーをリアルタイム監視し、事前アラートによりトラブルの拡大を防止します。
  • 手動作業不要な完全DDLレプリケーション:i2StreamはDDLとDMLの同期を一体で提供します。テーブル変更、インデックス作成などのスキーマ変更は手動スクリプト作成や業務停止なしで自動的に全配信先に複製されます。
  • 完全なデータ検証機能:MD5チェックサム比較による自動データ検証、データ不整合の可視化分析、ワンクリック復旧機能を搭載しています。
  • 異種データベース対応:Oracle、SQL Server、DB2、MySQL、PostgreSQL、MongoDB、Kafka、Hive、HBase、各種クラウドDBを含む40種類以上のDB環境で同種・異種間レプリケーションに対応します。異なるプラットフォーム間でデータベースを複製可能です。

下部の無料トライアルボタンをクリックしてください。弊社より速やかにご連絡し、お客様の環境への導入手順と使用方法をご案内いたします。

60日間無料トライアル

よくある障害とトラブルシューティング

障害1:フェイルオーバー後にレプリケーションエージェントの接続が失敗する

症状:AGフェイルオーバー後、ログリーダーエージェントまたはディストリビューションエージェントが接続エラーで異常終了する。

主な原因

  • sp_redirect_publisher が実行されていない、またはパラメータが不正
  • AGリスナー名のDNS名前解決に異常がある
  • 新しいプライマリレプリカ上にログイン権限が付与されていない

解決策

  1. リダイレクト設定を検証:EXEC sys.sp_validate_redirected_publisher
  2. AGリスナーがオンラインで接続可能な状態か確認
  3. SQL Serverエージェントのサービスアカウントにすべてのレプリカへのアクセス権限が付与されているか確認

障害2:「現在のトランザクションはコミットできません…」エラーが発生する

症状:トランザクションのレプリケーションが失敗し、未コミットトランザクションに関するエラーが出力される。

主な原因:ディストリビューションDBの同期状態が異常、またはAG同期時に競合が発生している。

解決策

  • すべてのAGデータベースの同期状態を確認
  • SQL ServerエラーログからAG関連エラーを確認
  • ディストリビューションDBがAG配下の場合は監視ジョブが正常に動作しているか確認

障害3:可用性DB上でスナップショットエージェントが失敗する

症状:DBがAG配下の状態でスナップショットエージェントが「エージェントの状態を取得できません」などのエラーを出力する。

主な原因:レプリケーション設定完了前にDBをAGに追加した、またはSQL Server 2022のコンテインド可用性グループを使用している。

解決策

  • DBをAGに追加する前にレプリケーション設定を完了させる
  • SQL Server 2022を使用する場合は、レプリケーション用途でコンテインド可用性グループを使用しない
  • すべてのレプリカノードにレプリケーション機能がインストールされているか確認

障害4:フェイルオーバー後もログリーダーエージェントが旧プライマリに接続しようとする

症状:フェイルオーバー後、ログリーダーエージェントが旧プライマリインスタンスへの接続を試行し続ける。

主な原因:sp_redirect_publisher を実行するDBが間違っている、またはパラメータが不正。

解決策

1. ディストリビューターのdistributionDB上でリダイレクト設定を確認:

SELECT * FROM MSredirected_publishers;

2. 設定が不正な場合はリダイレクトを再作成:

EXEC sys.sp_redirect_publisher
@original_publisher = N'PhysicalServerName',
@publisher_db = N'YourDatabase',
@redirected_publisher = N'AGListenerName';

3. ログリーダーエージェントジョブを再起動

障害5:レプリケーションモニターに誤ったパブリッシャー名が表示される

現象:フェイルオーバー後、レプリケーションモニターに元のプライマリインスタンス名でレプリケーション情報が表示され続けます。

解説:この挙動は既知の仕様です。フェイルオーバー後、レプリケーションモニターはパブリッシュインスタンス名を更新できず、元のプライマリ名のまま表示します。

対応策:画面表示上の不具合のみで、レプリケーション機能に影響はありません。T-SQLにより新しいパブリッシャーに登録したトレーサートークンはレプリケーションモニター上で確認可能です。

まとめ

Always On可用性グループとレプリケーションを組み合わせて構成することで、SQL Server基盤を単なる高可用性ソリューションから、内蔵レジリエンスを備えた総合的なデータ配信プラットフォームへと変換できます。

より簡単でエンタープライズ水準のデータベースレプリケーションソリューションをご希望の場合はi2Streamが適切です。非侵入型CDCとエージェントレスアーキテクチャにより、異なるデータベース基盤間でデータを継続的に複製できます。

概要は準備中です

関連記事

SQL Serverアクティブ・アクティブクラスターの段階的構築手順
SQL Serverアクティブ・アクティブクラスターは事業継続性を確保するための高可用性戦略です。本ガイドでは、SQL Serverアクティブ・アクティブクラスターの段階的な構築手順を解説し、SQL Server向けのより優れたアクティブ・アクティブフェイルオーバーソリューションを紹介します。
記事を読む
総合ガイド:SQL データベースのバックアップ手法
本記事では堅牢なSQL Serverデータベースバックアップソリューションを紹介し、SSMSを利用した詳細な操作手順、SQL Serverデータのバックアップスクリプトを解説します。
記事を読む
How to Achieve SQL Server to Oracle Database Migration [FREE]
このガイドはSQL ServerからOracleデータベースへの移行について詳述し、移行前準備、2種類の信頼できる手法(中小企業向け無料ツールOracle SQL Developer、無停止運用を実現するエンタープライズ向けi2Stream)、ツール比較を解説しています。あらゆる規模の企業に向け、シームレスで安全なデータ転送のロードマップを提供します。
記事を読む
PostgreSQLデータベースをコピーする方法:同一サーバーおよびサーバー間での手法
PostgreSQLデータベースのコピーは、テスト環境の迅速な作成や新サーバーへの移行に役立ちます。本記事では、PostgreSQLデータベースをコピーする手順をステップバイステップで解説します。
記事を読む
ビジネスデータのセキュリティ強化を始めませんか?

· 世界中のエンタープライズおよびミッドマーケットのお客様

· トライアル期間中、サポートチームが対応します

· 60日間の無料トライアルまたはデモで、Info2Softが企業データをどのように保護するかをご確認ください。

フォームにご記入の上、送信してください。担当者より追ってご連絡いたします。
このフォームを送信することにより、 プライバシー通知を読み、同意したことを確認します。
{{ isSubmitting ? '送信中...' : '送信する' }}