パーティション分割されたテーブルとインデックスの複製

適用対象:SQL ServerAzure SQL Managed Instance

大きなテーブルやインデックスをパーティション分割すると、データのサブセットに対するアクセスや管理を迅速かつ効率的に行うと同時に、データ コレクションの整合性を維持することができるので、大きなテーブルやインデックスを管理しやすくなります。 詳細については、「 Partitioned Tables and Indexes」を参照してください。 レプリケーションでは、パーティション テーブルとパーティション インデックスを扱う方法を指定するプロパティ セットによって、パーティション分割をサポートします。

トランザクション レプリケーションおよびマージ レプリケーションのアーティクル プロパティ

次の表に、データのパーティション分割に使用されるオブジェクトを示します。

オブジェクト 作成に使用するステートメント
パーティション テーブルまたはパーティション インデックス CREATE TABLE または CREATE INDEX
パーティション関数 CREATE PARTITION FUNCTION
パーティション方式 CREATE PARTITION SCHEME

パーティション分割のプロパティは、パーティション分割するオブジェクトをサブスクライバーにコピーするかどうかを指定するアーティクルのスキーマ オプションです。 これらのスキーマオプションは以下の方法で設定します:

  • パブリケーションの新規作成ウィザードの [アーティクルのプロパティ] ページ、または [パブリケーションのプロパティ] ダイアログ ボックス。 上記の表に示したオブジェクトをコピーするには、 [テーブル分割構成のコピー] プロパティと [インデックス分割構成のコピー] プロパティに、値 trueを指定します。 [アーティクルのプロパティ] ページへのアクセス方法については、「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更) を参照してください。

  • 次のいずれかのストアド プロシージャの schema_option パラメーターの使用。

    上記の表に示したオブジェクトをコピーするには、適切なスキーマ オプション値を指定します。 スキーマ オプションを指定する方法については、「 Specify Schema Options」を参照してください。

レプリケーションでは、初期同期中にオブジェクトがサブスクライバーにコピーされます。 パーティション構成で PRIMARY 以外のファイル グループを使用する場合、そのファイル グループは初期同期の前にサブスクライバーに存在している必要があります。

サブスクライバーが初期化された後、データ変更がサブスクライバーに反映され、適切なパーティションに適用されます。 ただし、パーティション方式の変更はサポートされていません。 トランザクションレプリケーションおよびマージレプリケーションは、 ALTER PARTITION FUNCTION、 ALTER PARTITION SCHEME、または ALTER INDEXのREBUILD WITH PARTITION文のレプリケートをサポートしません。 それらに関連する変更は自動的に加入者に複製されるわけではありません。 同様の変更はサブスクライバーで手動で行う必要があります。

パーティションスイッチングのレプリケーションサポート

テーブル分割の主な利点の 1 つは、パーティション間でデータのサブセットをすばやく効率的に移動できることです。 SWITCH PARTITIONコマンドを使ってデータを移動してください。 デフォルトでは、レプリケーション用にテーブルを有効にすると、システムは以下の理由で SWITCH PARTITION 操作をブロックします。

  • Publisherには存在するがSubscriberには存在しないテーブルにデータを移動したり外したりすると、PublisherとSubscriberが互いに矛盾することがあります。 この問題は通常、データをステージングテーブルに移動する際、またはステージングテーブルから移動する際に発生します。

  • Subscriberがパーティションテーブルに対してPublisherと異なる定義を持っている場合、ディストリビューション エージェントはSubscriberに変更を適用しようとした際に失敗します。

これらの潜在的な問題にもかかわらず、トランザクションレプリケーションのためにパーティションスイッチングを有効にすることは可能です。 パーティションスイッチングを有効にする前に、パーティションスイッチングに関わるすべてのテーブルがPublisherとSubscriberに存在し、テーブルとパーティションの定義が同一であることを確認しましょう。

パブリッシャーとサブスクライバーでパーティションにまったく同じパーティション構成が使用されている場合は、パブリッシャーへのパーティション切り替えステートメントのレプリケートのみを行う allow_partition_switch と共に、replication_partition_switch を有効にすることができます。 DDL をレプリケートしないで、 allow_partition_switch を有効にすることもできます。 これは、過去の月をパーティションからロール アウトする一方、バックアップの目的で、レプリケートしたパーティションをサブスクライバーにもう 1 年保持する場合に便利です。

現在のバージョンで 2008 R2 SQL Serverパーティション切り替えを有効にした場合、近い将来に分割操作とマージ操作が必要になる場合もあります。 複製またはCDC対応テーブルに対して分割またはマージ操作を実行する前に、該当パーティションに保留中の複製コマンドがないか確認してください。 分割操作とマージ操作中にパーティションで DML 操作が実行されないようにする必要もあります。 ログリーダーやCDCキャプチャジョブが処理しなかったトランザクションがある場合や、複製済みまたはCDC対応テーブルのパーティションに対して分割またはマージ操作が実行中(同じパーティション内で)を行う場合、ログリーダーエージェントやCDCキャプチャジョブで処理エラー(エラー608 - パーティションIDのカタログエントリが検出されない)が発生する可能性があります。 このエラーを修正するには、サブスクリプションの初期化やそのテーブルやデータベースのCDCを無効にする必要があるかもしれません。

サポートされていないシナリオ

パーティションスイッチングを伴うレプリケーションを使用する場合、以下のシナリオはサポートされません:

ピア ツー ピア レプリケーション
パーティションスイッチングではピアツーピアレプリケーションはサポートされていません。

パーティション切り替えでの変数の使用

トランザクションレプリケーションやChange Data Capture(CDC)で公開されたテーブルでパーティションスイッチング付きの変数を使用することは、 ALTER TABLE ... SWITCH TO ... PARTITION ... 文ではサポートされていません。

例えば、以下のパーティションスイッチングコードは、データベースでCDCが有効になっている場合や、TableAがトランザクション公開に参加している場合には動作しません。

DECLARE @SomeVariable INT = $PARTITION.pf_test(10);
ALTER TABLE dbo.TableA
SWITCH TO dbo.TableB 
PARTITION @SomeVariable;

代わりに、パーティション関数を直接使い、次の例のようにパーティションを切り替えてください。

ALTER TABLE NonPartitionedTable 
SWITCH TO PartitionedTable PARTITION $PARTITION.pf_test(10);

パーティションスイッチングの有効化

トランザクション出版物の以下のプロパティにより、レプリケーション環境におけるパーティションスイッチングの挙動を制御できます:

  • @allow_partition_switch: trueに設定すると、 SWITCH PARTITION を出版物データベースに対して実行できます。

  • @replicate_partition_switch SWITCH PARTITIONDDL文をサブスクライバーに複製するかどうかを決定します。 このオプションは、@allow_partition_switch が true に設定されている場合にのみ有効です。

これらのプロパティは、出版を作成する際に sp_addpublication を使うか、出版物を作成後に使う sp_changepublication で設定してください。 前述の通り、マージレプリケーションはパーティションスイッチングをサポートしていません。 マージレプリケーションが有効なテーブルで SWITCH PARTITION を実行するには、そのテーブルをパブリケーションから削除してください。