外部レプリカを構成する

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

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

次のようなオブジェクトがサポートされています。

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

このページにもパブリケーション プロセスの例が記載されていますが、詳細については、Microsoft のドキュメントのデータとデータベースのオブジェクトのパブリッシュをご覧ください。パブリケーション プロセスでは SQL Server Management Studio(SSMS)の使用を検討してください。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 は下り(外向き)と上り(内向き)のパスで異なる 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'

指定したパブリケーションにスナップショット エージェントを作成する

パブリッシャー データベースにスナップショット エージェントを作成するには、msdb.dbo.gcloudsql_transrepl_addpublication_snapshot を使用します。これは、sp_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. Aliases ノードを見つけて選択します。

    Aliases ノードが選択された状態

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

    [Alias name] のプルダウン ボックス

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

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

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

    Alias Name: 手順 4 のクエリ結果からサーバー名を指定します。

    Port No:: ポート番号として「1433」を入力します。

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

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

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

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

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

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

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

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

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

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

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

次のステップ