Sql-Server

CDC 擷取實例或狀態以確保引用完整性

  • April 27, 2018

我正在實施一個基於 SSIS/CDC 的數據倉庫解決方案,並且有一個與目標數據庫上的參照完整性有關的問題。

例如,我INVENTORY_TRANSACTION在一個表和PART另一個表中都有自己的 SSIS 包用於增量載入。我不希望出現INVENTORY_TRANSACTIONS在數據倉庫中沒有關聯父PART記錄的情況。

我已經閱讀了很多關於這個主題的內容,但我仍然不清楚。

我是否應該在具有相關數據的表上使用相同的 capture_instance 以便它們都針對相同的 LSN 鏈?我應該使用相同的州名嗎?或者,我完全錯過了什麼?

來自微軟文件。猜猜我只需要找到合適的文件… https://docs.microsoft.com/en-us/sql/integration-services/data-flow/cdc-flow-components#grouping-tables-for-cdc-加工

CDC 處理的分組表

數據庫項目的規模從幾個表到數千個表不等。在設計初始載入和 CDC 包時,將表分組為更小的組是有益的,以便於管理和提高效率。本節列出了影響將表排序為小組的各種注意事項,其中每個小組中的表格最初被載入,然後作為一個組進行更新。

CDC 組件支持的 CDC 模式假定該分組已經確定。每個組定義一個單獨的 CDC 上下文,該上下文與其他組分開維護。對於每個組,都會創建初始載入和涓流更新包。涓流式更新根據變化處理約束的速率(例如,CPU 和 IO 消耗、對其他系統的影響)和所需的延遲安排定期執行。

基於以下考慮對錶進行分組:

根據目標數據庫。所有寫入不同目標數據庫或經過不同處理的表都應分配給不同的 CDC 組。

應將與參照完整性約束相關的表分配給同一組,以避免目標出現參照完整性問題。

可以對可以容忍較高延遲的表進行分組,以便降低處理頻率並降低整體系統負載。

變化率較高的表應分在較小的組中,而變化率較低的表可以分在較大的組中。

為每個 CDC 組創建以下兩個包:

一個初始載入包,它從源表中讀取整個數據范圍並將其應用於目標表。

一個涓流式更新包,它讀取對源表所做的更改並將更改應用到目標表。該軟體包應定期執行。

疾病預防控制中心狀態

每個 CDC 組都有一個與之關聯的狀態,該狀態由具有特定格式的字元串表示。有關詳細資訊,請參閱 CDC 控制任務。下表顯示了可能的 CDC 狀態值。

StateDescription0-(INITIAL)在目前 CDC 組上執行任何程序包之前存在的狀態。這也是CDC狀態為空時的狀態。

關於CDC Control任務操作的更多資訊,請參見CDC Control Task.1-ILSTART(Initial-Load-Started)這是初始載入包啟動時存在的狀態。這發生在對 CDC 控制任務的 MarkInitialLoadStartoperation 呼叫之後。

關於CDC Control任務操作的更多資訊,請參見CDC Control Task.2-ILEND(Initial-Load-Ended)這是初始載入包成功結束時存在的狀態。這發生在對 CDC 控制任務的 MarkInitialLoadEnd 操作呼叫之後。

更多關於CDC Control任務操作的資訊,請參見CDC Control Task.3-ILUPDATE(初始載入更新),這是初始載入後第一次執行Update包後存在的狀態,同時仍在處理初始處理範圍。這發生在對 CDC 控制任務的 GetProcessingRangeoperation 呼叫之後。

如果使用 _$reprocessing 列,則將其設置為 1 以指示包可能正在重新處理目標處已經存在的行。

有關 CDC 控制任務操作的詳細資訊,請參閱 CDC 控制任務。4-TFEND(涓流-饋送-更新-結束)這是正常 CDC 執行的預期狀態。表示上一次執行成功完成,可以開始新的處理範圍的新執行。 5-TFSTART (Trickle-Feed-Update-Started) 這是GetProcessingRange操作後Update包後續執行時存在的狀態呼叫 CDC 控制任務。

這表明正常 CDC 執行已啟動,但尚未完成或尚未乾淨地完成 (MarkProcessedRange)。

有關 CDC 控制任務操作的詳細資訊,請參閱 CDC 控制任務。6-TFREDO(重新處理-涓流-饋送-更新)這是在 TFSTART 之後發生的 GetProcessingRange 上的狀態。這表明之前的執行沒有成功完成。

如果使用 __$reprocessing 列,它設置為 1 表示包可能正在重新處理目標中已經存在的行。7-ERROR CDC 組處於 ERROR 狀態。

這是 CDC 組件的狀態圖。當達到不期望的狀態時,就會達到 ERROR 狀態。下圖說明了預期的狀態。但是,該圖未顯示 ERROR 狀態。

例如,在初始載入包結束時,嘗試將狀態設置為 ILEND 時,如果狀態為 TFSTART,則 CDC 組處於錯誤狀態,並且 Trickle-Feed 更新包不執行(初始載入包確實執行)。

一旦 Initial Load 包成功執行,Trickle-Feed Update 包就會按照預定的計劃重複執行,以處理對源表的更改。每次執行 Trickle-Feed 更新包都是一次 CDC 執行。

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