CDC介紹
為了滿足數據遷移和數據抽取的業(yè)務需要货抄,使得有機會在數據庫層面上直接實現增量抽取功能漆改,ORACLE綜合性能和場景需要,在數據庫引擎層面直接集成了CDC功能满着,由于提供了類似API的功能接口谦炒,變更數據捕獲和更改跟蹤均不要求在源中進行任何架構更改或使用觸發(fā)器,所以比第三方工具具有一定的優(yōu)勢风喇。利用CDC捕獲變更有以下特點:
① 性能影響小宁改。使用異步進程捕獲,通過進程讀取事務日志魂莫,對系統(tǒng)造成的影響很小还蹲,不對業(yè)務系統(tǒng)造成太大的壓力,影響現有業(yè)務耙考。
② 監(jiān)控范圍大谜喊。對該表的所有DML和DDL操作都會被記錄,有助于跟蹤表的變化琳骡,實現表操作的追根溯源锅论。
③ 操作簡單 。CDC是在數據庫引擎中添加的功能楣号,封裝在數據庫中,類似于API接口調用怒坯,不需要復雜的業(yè)務處理邏輯就可以實現DML和DDL的操作監(jiān)控炫狱。
④ 有一定時延性。由于捕獲進程從事務日志中提取更改數據剔猿,因此视译,向源表提交更改的時間與更改出現在其關聯更改表中的時間之間存在內在的延遲。 雖然這種延遲通常很小归敬,但務必記住酷含,在捕獲進程處理相關日志項之前無法使用更改數據。
CDC注意事項
1. SQL Server的版本必須是2008或以上汪茧;
2. 不能同時使用內存優(yōu)化表(SQL Server2014或以上版本才有的功能)椅亚。否則會出現以下錯誤:
- @@SERVERNAME、serverproperty('servername')兩者(本地服務器名和服務器實例的屬性必須一致)必須一致舱污。下面腳本可將兩者調整成一致呀舔。如果執(zhí)行后兩者仍不一致,需要重啟SQL Server服務扩灯。
if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver@server =@server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver@server = @server , @local = 'LOCAL'
PRINT 'ok'
end
select @@SERVERNAME,serverproperty('servername')
必須開啟SQL Sever代理服務媚赖。CDC功能必須通過作業(yè)來實現霜瘪。
開啟CDC功能的表,無法使用 TRUNCATE TABLE 惧磺∮倍裕可以先禁用,執(zhí)行完truncate再啟用cdc磨隘。
6.如果表結構發(fā)生變化缤底,則捕獲實例表中:新增列無法捕獲到、刪除列保持NULL琳拭、修改列類型會發(fā)生強制轉換训堆。為保險起見,應禁用捕獲實例白嘁,然后再啟用坑鱼。
7.在查詢CDC相關表時,建議加上With(NOLOCK)絮缅,否則易產生阻塞或死鎖鲁沥。
- 一個表最多只能有兩個捕獲實例。