SQL Server 變更資料捕獲(CDC)
阿新 • • 發佈:2018-12-31
---查詢當前作業配置 SELECT * FROM MSDB.dbo.cdc_jobs --或者使用 USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_help_jobs; GO 1.sys.sp_cdc_add_job 在當前資料庫中建立變更資料捕獲清理或捕獲作業 1.建立捕獲作業 USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_add_job @job_type = N'capture'; GO 2.建立清理作業---建立清理作業,作業連續執行,更改資料行將在更改表中保留2880分鐘,清除時使用一條語句最多刪除4000條記錄 USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_add_job @job_type = N'cleanup' ,@start_job=1 ,@retention=2880 ,@threshold =4000 2.sys.sp_cdc_change_job 修改當前資料庫中變更資料捕獲清除或捕獲作業的配置 --僅在使用 sp_cdc_stop_job 停止作業並使用 sp_cdc_start_job 重新啟動該作業後,對該作業所做的更改才會生效1.更改捕獲作業 --將每個迴圈掃描最多處理的事務數更改為200,為了從日誌中提取所有行而要執行的最大掃描迴圈50次 USE AdventureWorks2008R2; GO EXECUTE sys.sp_cdc_change_job @job_type = N'capture', @maxtrans = 200, @maxscans = 50; GO 2.更改清除作業,將記錄保留時間更改為3440分鐘 USE AdventureWorks2008R2;GO EXECUTE sys.sp_cdc_change_job @job_type = N'cleanup', @retention = 3440; GO 3.sys.sp_cdc_cleanup_change_table 根據指定的 low_water_mark 值從當前資料庫的更改表中刪除行,重置更改表中的最小 __$start_lsn,並刪除小於該值的資料. 將同時清除cdc.HR_Department_CT,cdc.lsn_time_mapping表的記錄 USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_cleanup_change_table @capture_instance =N'HR_Department', @low_water_mark=0x0000037D000000D30008, @threshold=2000; SELECT sys.fn_cdc_increment_lsn(sys.fn_cdc_get_max_lsn()) 4.sys.sp_cdc_drop_job 從 msdb 中刪除當前資料庫的變更資料捕獲清除或捕獲作業。 --下例刪除 AdventureWorks2008R2 資料庫的清除作業和捕獲作業 USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_drop_job @job_type = N'cleanup'; USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_drop_job @job_type = N'capture'; 5.sys.sp_cdc_disable_db 對當前資料庫禁用變更資料捕獲 禁用當前對資料庫中的所有表啟用的變更資料捕獲。與變更資料捕獲相關的所有系統物件(如更改表、作業、儲存過程和函式)都將被刪除。sys.databases 目錄檢視中的資料庫條目的 is_cdc_enabled 列設定為 0。 如果在禁用變更資料捕獲時為資料庫定義了很多捕獲例項,則長時間執行事務可能導致 sys.sp_cdc_disable_db 的執行失敗。通過在執行 sys.sp_cdc_disable_db 之前使用 sys.sp_cdc_disable_table 禁用單個捕獲例項,可以避免此問題。 USE AdventureWorks2008R2; GO EXECUTE sys.sp_cdc_disable_db; GO 6.sys.sp_cdc_disable_table 對當前資料庫中指定的源表和捕獲例項禁用變更資料捕獲 刪除與指定的源表和捕獲例項相關聯的變更資料捕獲更改表和系統函式。它會刪除任何與來自變更資料捕獲系統表的指定捕獲例項相關聯的行,並將 sys.tables 目錄檢視中的表項的 is_tracked_by_cdc 列設定為 0。 ---下例對 HumanResources.Department 表禁用了變更資料捕獲 USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_disable_table @source_schema = N'HumanResources' , @source_name = N'Department' , @capture_instance = N'HR_Department' ---這裡是定義的例項名稱,在一開始建立捕獲的時候建立的,這裡也可以制定ALL(禁用表HumanResources.Department的所有捕獲), 7.sys.sp_cdc_enable_db 對當前資料庫啟用變更資料捕獲。必須先對資料庫執行此過程,然後才能對該資料庫中的任何表啟用變更資料捕獲。變更資料捕獲可記錄應用到所啟用的表中的插入、更新和刪除活動,同時採用易於使用的關係格式提供變更詳細資訊。此操作將為已修改的行捕獲反映了所跟蹤源表列結構的列資訊,同時還捕獲將更改應用到目標環境所需的元資料。 將建立以全資料庫為作用域的變更資料捕獲物件,包括元資料表和 DDL 觸發器。它還會建立 cdc 架構和 cdc 資料庫使用者,並將 sys.databases 目錄檢視中的資料庫條目的 is_cdc_enabled 列設定為 1。 USE AdventureWorks2008R2; GO EXECUTE sys.sp_cdc_enable_db; GO 8.sys.sp_cdc_enable_table --對需要進行跟蹤的表啟動CDC,sys.sp_cdc_enable_table /* 為當前資料庫中指定的源表啟用變更資料捕獲。對錶啟用變更資料捕獲時,應用於此表的每個資料操縱語言 (DML) 操作的記錄都將寫入事務日誌中。 變更資料捕獲程序將從日誌中檢索此資訊,並將其寫入可通過使用一組函式訪問的更改表中。 */ sys.sp_cdc_enable_table [ @source_schema = ] 'source_schema', ---表所屬的架構名 [ @source_name = ] 'source_name' ,----表名 [ @role_name = ] 'role_name'---是用於控制更改資料訪問的資料庫角色的名稱。 [,[ @capture_instance = ] 'capture_instance' ]--是用於命名特定於例項的變更資料捕獲物件的捕獲例項的名稱 [,[ @supports_net_changes = ] supports_net_changes ]---指示是否對此捕獲例項啟用淨更改查詢支援 [,[ @index_name = ] 'index_name' ]--用於唯一標識源表中的行的唯一索引的名稱。index_name 為 sysname,並且可以為 NULL。如果指定,則 index_name 必須是源表的唯一有效索引。如果指定 index_name,則標識的索引列優先於任何定義的主鍵列,就像表的唯一行識別符號一樣。 [,[ @captured_column_list = ] 'captured_column_list' ]--需要對哪些列進行捕獲。captured_column_list 的資料型別為 nvarchar(max),並且可以為 NULL。如果為 NULL,則所有列都將包括在更改表中。 [,[ @filegroup_name = ] 'filegroup_name' ]--是要用於為捕獲例項建立的更改表的檔案組。 [,[ @partition_switch = ] 'partition_switch' ]--指示是否可以對啟用了變更資料捕獲的表執行 ALTER TABLE 的 SWITCH PARTITION 命令。allow_partition_switch 為 bit,預設值為 1。 9.sp_cdc_generate_wrapper_function 生成用於為 SQL Server 中可用的變更資料捕獲查詢函式建立包裝函式的指令碼 EXEC sys.sp_cdc_generate_wrapper_function 10. sys.sp_cdc_help_change_data_capture 返回當前資料庫中為變更資料捕獲啟用的每個表的變更資料捕獲配置。最多可為每個源表返回兩行,為每個捕獲例項返回一行。 ---返回制定表的捕獲資訊 USE AdventureWorks2008R2; GO EXECUTE sys.sp_cdc_help_change_data_capture @source_schema = N'HumanResources', --架構名 @source_name = N'Department';--表名 GO --返回所有表的捕獲資訊 USE AdventureWorks2008R2; GO EXECUTE sys.sp_cdc_help_change_data_capture 11.sys.sp_cdc_get_captured_columns 返回指定捕獲例項所跟蹤的捕獲源列的變更資料捕獲元資料資訊。 USE AdventureWorks2008R2; GO EXECUTE sys.sp_cdc_get_captured_columns @capture_instance = N'HR_Department'; GO 12.sys.sp_cdc_get_ddl_history 返回自對指定的捕獲例項啟用變更資料捕獲後與該捕獲例項關聯的資料定義語言 (DDL) 更改歷史記錄。 與查詢表是一樣的結果 SELECT * FROM cdc.ddl_history USE AdventureWorks2008R2; GO EXECUTE sys.sp_cdc_get_ddl_history @capture_instance = N'HR_Department'; 13.sp_cdc_help_jobs 報告關於當前資料庫中所有變更資料捕獲清除或捕獲作業的資訊。因為一個數據庫只會在第一個表建立捕獲的時候建立作業 所以這裡只需要在當前庫執行就可以。 sys.sp_cdc_help_jobs USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_help_jobs; GO 14.sp_cdc_scan 執行變更資料捕獲日誌掃描操作,需要進行捕獲的時候使用,預設情況下5會自動進行捕獲。 如果變更資料捕獲正在使用 SQL Server 代理捕獲作業,則 sys.sp_MScdc_capture_job 將內部呼叫 sys.sp_cdc_scan。如果變更資料捕獲日誌掃描操作已經處於活動狀態,或資料庫啟用了事務複製,則無法顯式執行此過程。此儲存過程應當由需要自定義自動配置的捕獲作業的行為的管理員使用。 USE AdventureWorks2008R2; GO EXEC sp_cdc_scan 15.sys.sp_cdc_start_job, 啟動和停止當前資料庫的變更資料捕獲清除或捕獲作業。 ---啟動清除作業 USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_start_job @job_type = N'cleanup'; ---停止捕獲作業 USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_stop_job @job_type = N'capture'; GO USE AdventureWorks2008R2; GO EXEC sys.sp_cdc_stop_job @job_type = N'cleanup'; GO