複寫分區資料表及索引

適用於:SQL ServerAzure SQL 受控執行個體

分割大型資料表或索引將更易於管理,因為分割可讓您快速並有效率地管理及存取資料子集,同時又可維護資料收集的完整性。 如需詳細資訊,請參閱< Partitioned Tables and Indexes>。 複寫透過提供一組屬性來支援資料分割,這些屬性可指定如何處理分割資料表和索引。

交易式與合併式複寫的發行項屬性

下表列出用來分割資料的物件。

物件 藉由使用建立
分割區化資料表或索引 CREATE TABLE 或 CREATE INDEX
分割函數 CREATE PARTITION FUNCTION
分割區配置方式 CREATE PARTITION SCHEME

分割屬性是發行項的結構描述選項,用來決定是否應將分割物件複製到訂閱者。 請以以下方式設定這些結構選項:

  • 在新增發行集精靈的 [發行項屬性] 頁面中,或是在 [發行集屬性] 對話方塊中。 若要複製上表所列的物件,請針對 [複製資料表資料分割配置] 和 [複製索引資料分割配置] 屬性指定 true的值。 如需如何存取 [發行項屬性] 頁面的詳細資訊,請參閱檢視和修改發行集屬性。

  • 藉由使用下列其中一個預存程序的 schema_option 參數:

    若要複製上表所列的物件,請指定適當的結構描述選項值。 如需有關如何指定結構描述選項的詳細資訊,請參閱< Specify Schema Options>。

複寫會在初始同步處理期間將物件複製到訂閱者。 如果資料分割配置使用 PRIMARY 以外的檔案群組,這些檔案群組必須在初始同步處理之前存在於訂閱者上。

訂閱者初始化後,資料變更會傳送至訂閱者,並套用至適當的分割區。 不過,分割區方案的變更不被支援。 交易式複寫和合併複寫不支援複寫下列命令:ALTER PARTITION FUNCTION、ALTER PARTITION SCHEME,或 ALTER INDEX 的 REBUILD WITH PARTITION 陳述式。 與這些變更相關的變更不會自動複製給訂閱者。 你也需要在訂閱者頁面手動做類似的更改。

分割區切換的複寫支援

資料表資料分割的其中一個重要優點,就是能夠快速及有效率地在資料分割之間移動資料子集。 使用 SWITCH PARTITION 指令來移動資料。 預設情況下,當你啟用資料表進行複寫時,系統會因 SWITCH PARTITION 以下原因阻擋操作:

  • 如果您將資料移入 Publisher 端存在、但 Subscriber 端不存在的資料表,或從該資料表移出資料,Publisher 和 Subscriber 之間可能會發生不一致。 這個問題通常發生在你將資料移入或移出暫存表時。

  • 如果 Subscriber 對分割資料表的定義與 Publisher 不同,散發代理程式 嘗試對 Subscriber 套用變更時會失敗。

儘管有這些潛在問題,你可以啟用分割區切換來做交易複製。 啟用分割區切換前,請確保所有涉及分割區切換的資料表都存在於 Publisher 與 Subscriber,且資料表與分割區定義相同。

當發行者和訂閱者上的分割區具有完全相同的分割配置時,您可以同時啟用 allow_partition_switch 和 replication_partition_switch,這樣只會將分割區切換陳述式複寫到訂閱者。 您也可以在不複寫 DDL 指令的情況下,啟用 allow_partition_switch。 當您想要將舊月份自資料分割中移出,但又希望在訂閱者端將複寫的資料分割原封不動地再保留一年作為備份用途時,這會非常實用。

如果你在 SQL Server 2008 R2 的最新版本啟用分割區切換,未來可能還需要分割與合併操作。 在對已複製或啟用 CDC 的資料表執行分割或合併操作前,請確保該分割區沒有任何待處理的複製指令。 此外也必須確定未在分割及合併作業期間,對分割區執行任何 DML 作業。 若日誌讀取器或 CDC 擷取工作未處理交易,或在執行分割或合併操作時對複製或啟用 CDC 資料表的分割區執行 DML 操作(涉及同一分割區),可能導致處理錯誤(錯誤 608 - 未找到分割區 ID 目錄條目),使用日誌讀取代理或 CDC 擷取工作。 要修正這個錯誤,你可能需要重新初始化訂閱或在該資料表或資料庫上停用 CDC。

不支援的案例

下列情況在使用含分割區切換的複寫功能時不受支援:

點對點複寫
分割交換不支援點對點複寫。

使用變數進行資料分割切換

在以交易複製或變更資料擷取(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 PARTITION DDL 陳述式複寫到訂閱者。 只有當 @allow_partition_switch 設定為 true 時,這個選項才有效。

在建立出版品時使用 sp_addpublication ,或在建立出版品後使用 sp_changepublication 來設定這些屬性。 如前所述,合併複製不支援分割區切換。 若要在啟用合併複製的資料表上執行 SWITCH PARTITION ,請從發佈中移除該資料表。