外部レプリカを構成する

このページでは、Cloud SQL の外部または Cloud SQL 内にあるサブスクライバーにパブリッシュするように、Cloud SQL インスタンスを設定する方法について説明します。Cloud SQL for SQL Server の外部レプリケーションでは、Cloud SQL がサブスクライバーのパブリッシャーとして機能するトランザクション レプリケーションを使用します。

トランザクション レプリケーションでは、Microsoft によって文書化されているように、複数のタイプのオブジェクトのパブリッシュがサポートされています。さらに、Cloud SQL では、この機能の制限は Microsoft によって文書化されている制限に似ています。

サポートされているオブジェクトには、次のオブジェクトがあります。

  • テーブル
  • ストアド プロシージャ
  • ビュー
  • インデックス ビュー
  • ユーザー定義の関数

パブリケーション プロセスの例はこのページに記載されていますが、詳細については、Microsoft のドキュメントのデータとデータベースのオブジェクトのパブリッシュをご覧ください。SSMS で使用可能なオプションがより明らかになる可能性があるため、パブリケーション プロセスで SQL Server Management Studio(SSMS)の使用を検討してください。

また、Cloud SQL でのレプリケーションについてもご覧ください。

トランザクション レプリケーションの実装

Cloud SQL インスタンスは、トランザクションのレプリケーションを行い、外部サブスクライバーのパブリッシャーまたはディストリビュータとして機能できます。

次のようにして、トランザクション レプリケーションを設定できます。

  • Cloud SQL 提供のストアド プロシージャを使用する。接頭辞 gcloudsql_transrepl_ が付いています。
  • Microsoft が提供するストアド プロシージャを使用してレプリケーションを絞り込む

制限事項と前提条件

トランザクション レプリケーションを計画している場合は、このセクションを確認してください。

制限事項

高可用性(HA)を使用するインスタンスの場合、常に同じ送信 IP アドレスが使用されるわけではありません。パブリック IP 接続を利用する場合、このようなインスタンスはパブリッシャーにできません。インスタンスで HA を使用する場合は、プライベート IP 接続を使用する必要があります。

制限事項を含む記事の定義については、Microsoft ドキュメントの記事を定義するをご覧ください。

Cloud SQL 提供のストアド プロシージャは、push サブスクリプションのみをサポートしています。

前提条件

Cloud SQL インスタンスとサブスクライバー インスタンスの間に双方向ネットワーク接続を設定する必要があります。サブスクライバーは、オンプレミス サブスクライバーなどの外部サブスクライバーでも、Cloud SQL 内部のサブスクライバーでもかまいません。

パブリック IP を使用する Cloud SQL インスタンスの場合、Cloud SQL は Egress(外向き)と Ingress(内向き)のパスで異なる IP アドレスを使用します。レプリカは、gcloud コマンドを使用して取得できるプライマリ インスタンスの送信 IP アドレスを許可リストに入れる必要があります。

gcloud sql instances describe [PRIMARY_NAME] --format="default(ipAddresses)"

オンプレミス インスタンスで Cloud SQL プライベート IP を使用するには、限定公開サービス アクセスを設定する必要があります。アドバタイズが必要なカスタム IP 範囲を使用して、Cloud SQL VPC とユーザーの VPC をピアリングする必要があります。

オンプレミスから接続する場合、オンプレミス ファイアウォールでインバウンド接続とアウトバウンド接続を許可する必要があります。オンプレミス ファイアウォールで、特定の Google Cloud サービス(この場合は Cloud SQL)に使用される限定公開サービス アクセス サブネット範囲に対して、ポート 1433 でのこのような接続を許可する必要があります。作成されたインスタンスごとに、特定の IP ではなく、サブネット範囲を許可することを検討してください。

関連情報については、以下をご覧ください。

権限と役割

パッケージ化された権限

Cloud SQL 提供のストアド プロシージャには、トランザクション レプリケーションに必要な権限が含まれています。これらはラッパー ストアド プロシージャで、1 つ以上の Microsoft ストアド プロシージャを呼び出す場合があります。Microsoft ストアド プロシージャの詳細については、Microsoft のドキュメントをご覧ください。

必要な役割

使用されるアカウント(ログリーダー エージェントなど)には、sqlserver ユーザーの場合と同様に db_owner ロールが必要です。詳しくは、レプリケーション エージェントのセキュリティ モデルをご覧ください。

ストアド プロシージャを使用したパブリッシュ、配信、サブスクライブ

このセクションは、トランザクションのレプリケーションの設定に推奨される手順を含みます。

sqlserver ユーザーは、パブリッシャーとして機能するように Cloud SQL インスタンスを設定できるストアド プロシージャを使用できます。リファレンス情報については、Cloud SQL ストアド プロシージャをご覧ください。

テスト データベースを使用したトランザクション レプリケーションの準備

本番環境データベースのトランザクション レプリケーションを設定する前に、テスト データベース オブジェクトのパブリッシャーとしてインスタンスを設定できます。このページでは、pub_demo という名前のデータベースを使用します。

sqlserver ユーザーを使用して Cloud SQL インスタンスに接続し、テストのためのデータベースを作成します。例:

Create Database pub_demo;
GO
USE pub_demo;
CREATE TABLE Employee(employeeId INT primary key);
INSERT INTO Employee([employeeId]) VALUES (1);
INSERT INTO Employee([employeeId]) VALUES (2);

-- Add procedure
CREATE OR ALTER PROCEDURE dbo.p_GetDate
AS
SELECT getdate()

-- Add view
CREATE OR ALTER VIEW dbo.v_GetDbs
AS
SELECT name from sys.databases

-- Function
CREATE OR ALTER FUNCTION dbo.fn_ListDbFiles(@id int)
RETURNS TABLE
AS
RETURN
(
select * from sys.master_files where database_id = @id
)

分散データベースを設定する

ディストリビューション データベースには、msdb.dbo.gcloudsql_transrepl_setup_distribution を使用できます。これは、以下の Microsoft ストアド プロシージャのラッパー ストアド プロシージャです。

例:

EXEC msdb.dbo.gcloudsql_transrepl_setup_distribution @login='sqlserver', @password='<password>'

データベースをパブリケーション用に有効にする

データベースのパブリッシュ オプションを有効または無効にするには、msdb.dbo.gcloudsql_transrepl_replicationdboption を使用します。このストアド プロシージャは、sp_replicationdboption を使用するパブリッシャー用のパブリッシュ オプションに適用されます。

例:

EXEC msdb.dbo.gcloudsql_transrepl_replicationdboption @db='pub_demo', @value='true'

ログ読み取りエージェントを追加する

sp_addlogreader_agent を使用するデータベースにログ読み取りエージェントを設定できます。

例:

EXEC msdb.dbo.gcloudsql_transrepl_addlogreader_agent @db='pub_demo', @login='sqlserver', @password='<password>'

データベースのパブリケーションを作成する

msdb.dbo.gcloudsql_transrepl_addpublication を使用すると、指定したデータベースにトランザクション パブリケーションを作成できます。このストアド プロシージャは、sp_addpublication をラップします。

例:

EXEC msdb.dbo.gcloudsql_transrepl_addpublication @db='pub_demo', @publication='pub1'

指定した公開のスナップショット エージェントを作成する

パブリッシャー データベース用のスナップショット エージェントを作成するには、sp_addpublication_snapshot をラップする msdb.dbo.gcloudsql_transrepl_addpublication_snapshot を使用します。

例:

EXEC msdb.dbo.gcloudsql_transrepl_addpublication_snapshot @db='pub_demo',  @publication='pub1', @login='sqlserver', @password='<password>'

記事を作成してパブリケーションに追加する

パブリッシャー データベース内からアーティクルを作成し、パブリケーションに追加できます。sqlserver ユーザーとして、sp_addarticle を使用します。

SSMS を使用してアーティクルを追加することもできます。詳細については、パブリケーションでのアーティクルの追加および削除をご覧ください。

例:

USE pub_demo;
GO

EXEC sp_addarticle @publication = 'pub1',
                   @article = 'csql_dbo.employee',
                   @source_owner = 'dbo',
                   @source_object = 'Employee',
                   @description = N'cloudsql_article_table',
                   @schema_option = 0x000000000903409D,
                   @identityrangemanagementoption = N'manual',
                   @destination_table = 'Employee',
                   @destination_owner = 'dbo';

-- add function
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'fn_ListDbFiles',
                   @source_owner = N'dbo',
                   @source_object = N'fn_ListDbFiles',
                   @type = N'func schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'fn_ListDbFiles',
                   @destination_owner = N'dbo',
                   @status = 16

-- add procedure
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'p_GetDate',
                   @source_owner = N'dbo',
                   @source_object = N'p_GetDate',
                   @type = N'proc schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'p_GetDate',
                   @destination_owner = N'dbo',
                   @status = 16

-- add view
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'v_GetDbs',
                   @source_owner = N'dbo',
                   @source_object = N'v_GetDbs',
                   @type = N'view schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'v_GetDbs',
                   @destination_owner = N'dbo',
                   @status = 16

サブスクリプションをパブリケーションに追加する

データベース内からパブリケーションにサブスクリプションを追加できます。sqlserver ユーザーとして sp_addsubscription を使用して、サブスクライバーのステータスを設定します。

例:

Use pub_demo;
GO
EXEC sp_addsubscription @publication ='pub1',
                        @subscriber = N'10.10.100.1,1433',
                        @destination_db = pub_demo,
                        @subscription_type = N'Push',
                        @sync_type = N'automatic',
                        @article = N'all',
                        @update_mode = N'read only',
                        @subscriber_type = 0

サブスクライバーに接続してサブスクリプション データベースを作成する

サブスクライバーに接続して、複製されたデータを入力するためのサブスクリプション データベースを作成できます。

例:

 Create Database pub_demo

push サブスクリプションを同期する新しいスケジュール設定されたエージェント ジョブを追加する

スケジュールされた新しいエージェント ジョブを追加して、push サブスクリプションをパブリケーションと同期できます。たとえば、パブリッシャー データベースで次のようなコマンドを実行します。このコマンドは、sp_addpushsubscription_agent のラッパー ストアド プロシージャである msdb.dbo.gcloudsql_transrepl_addpushsubscription_agent を使用します。

EXEC msdb.dbo.gcloudsql_transrepl_addpushsubscription_agent
@db='pub_demo',
@publication = 'pub1',
@subscriber_db= 'pub_demo',
@subscriber_login='sqlserver',
@subscriber_password='<password>',
@subscriber='11.11.111.1,1433'

パブリケーション スナップショットのエージェント ジョブを開始する

次のようにして、パブリケーション スナップショットのエージェント ジョブを開始できます。

USE pub_demo;
EXEC sp_startpublication_snapshot
@publication = 'pub1'

レプリケーション モニターを使用するためのアカウントにアクセス権を付与する

次の場合に msdb.dbo.gcloudsql_transrepl_addmonitoraccess を使用します。

  • SSMS のレプリケーション モニターにアクセスできるようにする
  • ディストリビューション データベースでテーブルをクエリする

このストアド プロシージャを使用すると、ディストリビューション データベースのレプリケーション関連テーブル(MSrepl_errors など)で SELECT ステートメントを使用できます。

EXEC msdb.dbo.gcloudsql_transrepl_addmonitoraccess
@login = 'sqlserver'

分散データベースのプロパティを変更する

heartbeat_interval を変更します。sp_changedistributor_property をラップする msdb.dbo.gcloudsql_transrepl_changedistributor_property プロシージャを使用します。

詳細については、sp_changedistributor_property についてのドキュメントをご覧ください。heartbeat_interval 値の詳細については、そのドキュメントもご覧ください。

例:

EXEC msdb.dbo.gcloudsql_transrepl_changedistributor_property
@property = N'heartbeat_interval',
@value = 90

レプリケーション モニターを使用する

SSMS でレプリケーション ノードを右クリックして、[Launch Replication Monitor] を選択します。

[Agents] タブをクリックすると、次のビューが表示されます。

[Agents] タブのフォルダ

レプリケーションの削除のためのストアド プロシージャの使用

このセクションは、トランザクション レプリケーションの削除に推奨される手順を含みます。

サブスクリプションを削除する

サブスクリプションを削除するには、sp_dropsubscription ストアド プロシージャを使用します。

これは、サブスクリプションを削除するコマンドの例です。

USE  pub_demo;
GO
EXEC sp_dropsubscription
          @publication = 'csql_pub_pub_demo',
          @article     = N'all',
          @subscriber  = N'11.11.111.1,1433'

サブスクライバーを削除する

サブスクライバーを削除するには、msdb.dbo.gcloudsql_transrepl_dropsubscriber ストアド プロシージャを使用します。

EXEC msdb.dbo.gcloudsql_transrepl_dropsubscriber
 @subscriber  = N'11.11.111.1,1433'

パブリケーションを削除する

パブリケーションを削除するには、msdb.dbo.gcloudsql_transrepl_droppublication ストアド プロシージャを使用します。

EXEC msdb.dbo.gcloudsql_transrepl_droppublication
  @db = 'pub_demo', @publication='pub1'

パブリケーション データベースを無効にする

パブリケーション データベースを無効にするには、msdb.dbo.gcloudsql_transrepl_replicationdboption ストアド プロシージャを使用します。

EXEC msdb.dbo.gcloudsql_transrepl_replicationdboption
@db='pub_demo',
@value=N'false'

分散データベースを削除する

分散データベースを削除するには、msdb.dbo.gcloudsql_transrepl_remove_distribution ストアド プロシージャを使用します。

EXEC msdb.dbo.gcloudsql_transrepl_remove_distribution

問題をトラブルシューティングするためのヒントと手順

適切なデータベースからのストアド プロシージャの実行

sp_addarticlesp_addsubscriptionsp_startpublication_snapshot の実行時に、次のエラーが発生する場合があります。

Only members of the sysadmin fixed server role or db_owner fixed database role can perform this operation.

また、sp_dropsubscription を実行すると次のエラーが発生する場合があります。

This database is not enabled for publication.

これらのエラーが発生した場合は、適用するデータベース内でストアド プロシージャを実行する必要があります。それらが正しいデータベースから実行されていることを確認するには、次のコマンドを実行します。

USE <database_name>;
GO
<Run stored proc>

レプリケーション

レプリケーション エラーは、SQL エラーログなどに示されます。分散データベース内の一部のテーブルに対して、レプリケーション エラーを直接照会できます。次に例を示します。

select * from [cloudsql_distribution]..msrepl_errors
select * from [cloudsql_distribution]..MSreplication_monitordata

レプリケーション モニターを使用したエラー検索に関する Microsoft のその他の例については、こちらをご覧ください。たとえば、sqlserver ユーザーがコマンドにアクセスできない場合があります。

レプリケーション エージェント ジョブ

レプリケーションの設定後、SSMS では、sqlserver ユーザーに新しい SQL エージェント ジョブが表示されなくなります。ただし、次の方法で表示できます。

USE msdb
select * from dbo.sysjobs

レプリケーション モニターにないパブリッシャー

レプリケーション モニターを使用して、レプリケーションのステータスを表示し、レプリケーションのトラブルシューティングを行うことができます。

たとえば、レプリケーションを設定し、パブリッシャーの Cloud SQL インスタンスで IP アドレスを使用している場合は、SSMS がパブリッシャーを検出できない可能性があります。これは、ホスト名と IP アドレスのマッピングを認識していないためです。

レプリケーション モニターには、空の [Publications] タブが含まれています。

行のない [Publications] タブ

回避策として、SQL Server 構成マネージャーで、パブリッシャーの SQL Server ホスト名と SSMS からの接続に使用される IP アドレス間にエイリアスを作成します。

  1. SQL Server 構成マネージャーを起動します。

    SQL Server 構成マネージャー

  2. [エイリアス] ノードを見つけて選択します。

    エイリアス ノードが選択されています

  3. [Alias name] の下にあるボックスを右クリックして、新しいエイリアスを作成します。32 ビットと 64 ビットの両方のエイリアスに同じ手順を行います。

    エイリアス名のプルダウン ボックス

  4. 次のクエリを使用して、パブリッシャー インスタンスの実際のホスト名を取得します。

    パブリッシャー インスタンスの実際のホスト名をクエリする

  5. エイリアス ウィンドウで、以下のフィールドに入力してから [OK] を選択します。

    エイリアス名: ステップ 4 のクエリからサーバー名を指定します。

    ポート番号: ポート 1433 を入力します。

    Protocol: デフォルト値(TCP / IP)のままにします。

    Server: パブリッシャー インスタンスの IP アドレスを指定します。

    エイリアス名、サーバーなどの値

  6. 新しいエイリアスを使用して接続し、レプリケーション モニターを立ち上げます。

    [Connect to Server] ダイアログ ボックス

パブリッシュの情報は次のようになります。

レプリケーション モニターで [Publications] タブに行が表示される

レプリケーションのトラブルシューティングの詳細については、トラブルシューティング: SQL Server のトランザクション レプリケーションに関するエラーを検索するをご覧ください。

レプリケーションに必要なアーティクル サイズの推定

Cloud SQL インスタンスをパブリッシャーとして使用する場合、レプリケーションを開始するには、生成されるアーティクルの初期スナップショットが必要です。このスナップショットはローカルに保存されます。アーティクルの数、サイズ、データの種類によっては、ストレージ要件が増加する可能性があります。sp_spaceused ストアド プロシージャが提供するのは、アーティクルに必要なディスク容量の概算値です。

スナップショットは、スキーマとデータを保存するファイルを含みます。

次のステップ