Sql-Server

SQL Server 2014 事務複製分區切換

  • October 24, 2019

我正在使用帶有分區的表的 SQL Server 2014 事務複製。源表在載入時是分區切換的,到目前為止我已經能夠成功複製它。

我正在使用的複制源通過在載入到表期間在分區功能/分區方案上創建分區來執行一些動態分區管理。根據此處找到的文件,事務複製本身不支持此功能:

初始化訂閱伺服器後,數據更改將傳播到訂閱伺服器並應用於適當的分區。但是,不支持更改分區方案。事務複製和合併複製不支持複製以下命令:ALTER PARTITION FUNCTION、ALTER PARTITION SCHEME 或 ALTER INDEX 的 REBUILD WITH PARTITION 語句。與它們相關的更改不會自動複製到訂閱伺服器。使用者有責任在訂閱者處手動進行類似的更改。

這就是我要掛斷電話的地方。我們已經解決了分區載入和切換的大部分問題,現在我們通過使用在複製源(發布者)和複製目標(訂閱者)上動態創建新分區儲存過程作為載入到發布者的一部分。儲存過程存在於發布者和訂閱者上(手動放置在那裡)。

昨晚執行測試時,我們看到在發布者和訂閱者上動態創建了分區,但是在 Log Reader Agent 上出現了新錯誤。在這一點上,我什至不知道從哪裡開始追踪這個。

錯誤消息:程序無法在“RNCAZFAST2”上執行“sp_replcmds”。(來源:MSSQL_REPL,錯誤號:MSSQL_REPL20011)獲取幫助:http://help/MSSQL_REPL20011

在數據庫 27 中找不到分區 ID 72057598976393216 的目錄條目。元數據不一致。執行 DBCC CHECKDB 以檢查元數據損壞。(來源:MSSQLServer,錯誤號:608)

我開始查找錯誤,它看起來像是 2005 年的錯誤,但我們使用的是 Azure VM 上的 SQL Server 2014 Enterprise。任何幫助是極大的讚賞!

我們最終想出了一個解決方案。基本上,當我們進行更改時,我們必須管理髮布者和訂閱者數據庫/表的分區創建。我們使用 SSIS 載入數據,並且內置了一些機制來在發布者上創建新分區,因此我們也實現了相同的邏輯來在訂閱者上完成工作。

當然,如果您擁有多個訂閱者,這可能會很困難。我想一種解決方案是查詢訂閱詳細資訊並對任何訂閱者數據庫動態執行相同的 ALTER PARTITION 語句。

我最近在 SQL 2008R2 和 SQL2014 中看到了這種行為。就我而言,該錯誤是由在已發布表上的各個分區被交換後立即合併分區函式引起的。

執行 sp_replcmds 時,它試圖檢索有關給定 partition_id(切換的分區)的元數據。但是,自從分區函式合併操作後,那個partition_id就不再存在了。

我的解決方法是將分區 SWITCH 和 MERGE 操作分離到不同的儲存過程中,並確保日誌讀取器有時間在每個執行之間正確執行。

注意:解決問題非常痛苦

引用自:https://dba.stackexchange.com/questions/134510