SQLServer開啟CDC功能(2)
SQLServer利用CDC功能實時同步表資料。
一、適用環境
僅在SQLServer2008企業版、開發版和評估版以後可用。
確保SQLServer資料庫已經開啟SQL Server代理。
二、CDC功能介紹
CDC(change data capture)功能主要捕獲SQLServer指定表的增刪改操作,由於任何操作都會寫日誌(哪怕truncate),所以CDC的捕獲來源於日誌檔案。日誌檔案會把更改應用到資料檔案中,同時也會標記符合要求的資料標記為需要新增跟蹤的項。然後透過一些配套函式,最後寫入到資料倉儲中。
三、具體同步步驟
1、確定哪些表進行CDC同步
2、對資料庫開啟CDC功能
USE [Finance]
GO
EXEC sys . sp_cdc_enable_db
GO
檢視CDC是否開啟:
SELECT is_cdc_enabled ,
CASE WHEN is_cdc_enabled = 0 THEN 'CDC 功能禁用 '
ELSE 'CDC 功能啟用 '
END 描述
FROM sys . databases
WHERE NAME = 'finance'
1表示開啟。
發現資料庫安全性多了cdc,架構多了cdc
出現6個系統表:
cdc.captured_columns
cdc.change_tables
cdc.ddl_history
cdc.index_columns
cdc.lsn_time_mapping
dbo.systranschemas
對某些表開啟捕獲:
USE [Finance] ;
GO
EXECUTE sys.sp_cdc_enable_table
@source_schema = N'dbo'
, @source_name = N'DO'
, @role_name = N'cdc_Admin'--可以自動建立
, @capture_instance=DEFAULT
GO
檢查是否開啟成功:
SELECT name ,
is_tracked_by_cdc ,
CASE WHEN is_tracked_by_cdc = 0 THEN 'CDC功能禁用'
ELSE 'CDC功能啟用'
END 描述
FROM sys.tables
WHERE OBJECT_ID IN( OBJECT_ID('dbo.DO'))
系統表會增加開啟CDC功能的表。
SQLServer代理出現作業:
相關儲存過程:
Sys.sp_cdc_disable_db: 建議先禁用表,再禁用庫
函式:
對於__$operation列:1 = 刪除、2= 插入、3= 更新(舊值)、4= 更新(新值)
對於__$start_lsn列:由於更改是來源與資料庫的事務日誌,所以這裡會儲存其事務日誌的開始序列號(LSN)
EXECUTE sys.sp_cdc_help_change_data_capture;
GO
USE Finance;
GO
cdc.fn_cdc_get_all_changes_<捕獲例項>用法:
DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn =
sys.fn_cdc_get_min_lsn('dbo_DO')
SET @to_lsn = sys.fn_cdc_get_max_lsn()
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_dept
(@from_lsn, @to_lsn, N'all');
GO
--返回所有表的變更捕獲配置資訊
EXECUTE sys.sp_cdc_help_change_data_capture;
GO
檢視對某個例項(即表)的哪些列做了捕獲監控:
EXEC sys.sp_cdc_get_captured_columns
@capture_instance = 'HumanResources_Department' -- sysname
也可以從下面中查詢配置資訊:
SELECT * FROM msdb.dbo.cdc_jobs
啟用cdc之後會自動建立了兩個作業,可以先使用以下語句來檢視:
sp_cdc_help_jobs
--顯示原有配置:
EXEC sp_cdc_help_jobs
GO
--更改資料保留時間為分鐘
EXECUTE sys.sp_cdc_change_job
@job_type = N'cleanup',
@retention=100
GO
--停用作業
EXEC sys.sp_cdc_stop_jobN'cleanup'
GO
--啟用作業
EXEC sys.sp_cdc_start_jobN'cleanup'
GO
--再次檢視
EXEC sp_cdc_help_jobs
GO
停止/開始作業,可以使用以下語句:
--停用作業
EXEC sys.sp_cdc_stop_jobN'cleanup'
GO
--啟用作業
EXEC sys.sp_cdc_start_jobN'cleanup'
GO
刪除作業:
EXEC sys.sp_cdc_drop_job@job_type = N'cleanup' -- nvarchar(20)
GO
--檢視作業
EXEC sys.sp_cdc_help_jobs
GO
建立作業:
EXEC sys.sp_cdc_add_job
@job_type = N'cleanup',
@start_job = 0,
@retention = 5760
--檢視作業
EXEC sys.sp_cdc_help_jobs
GO
DDL變更捕獲:
CDC除了捕獲資料變更之外,還能捕獲DDL操作的變化。前提是先要確保SQLServer 代理的啟用,其實CDC功能都需要確保sql 代理正常執行,因為所有操作都透過代理中的兩個作業來實現的。
現在先來對HumanResources.Department 表修改一下,把name的長度加長:
ALTER TABLE HumanResources.Department ALTER COLUMN Name NVARCHAR(120) ;
GO
然後查詢ddl記錄表:
SELECT * FROM cdc.ddl_history
使用CDC的函式來獲取更改:
A、使用cdc.fn_cdc_get_all_changes_HumanResources_Department 函式報告捕獲例項HumanResources_Department 的當前所有可用更改:
DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn =
sys.fn_cdc_get_min_lsn('HumanResources_Department')
SET @to_lsn = sys.fn_cdc_get_max_lsn()
SELECT * FROM cdc.fn_cdc_get_all_changes_HumanResources_Department
(@from_lsn, @to_lsn, N'all update old');
GO
B、獲取某個時間段的更改資訊:
先根據日誌序列號(logsequence number ,LSN)來獲取跟蹤變更資料:
Sys.fn_cdc_map_time_to_lsn獲取變更範圍內的最大、最小LSN值。可以使用:
Smallest greater than;smallest greater than orequal;largest less than;largest less than or equal.
如查詢某個時間段插入的資料:
--插入資料
INSERT INTO HumanResources.Department(name,GroupName,ModifiedDate)
VALUES('test','abc',GETDATE())
INSERT INTO HumanResources.Department(name,GroupName,ModifiedDate)
VALUES('test1','abc1',GETDATE())
go
--檢查資料
DECLARE @bglsn VARBINARY(10)=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal','2012-10-12 12:00:00.997')
DECLARE @edlsn VARBINARY(10)=sys.fn_cdc_map_time_to_lsn('largest less than or equal',GETDATE())
SELECT DepartmentID,GroupName,Name
FROM cdc.HumanResources_Department_CT
WHERE [__$operation]=2 AND [__$start_lsn] BETWEEN @bglsn AND @edlsn
C、sys.fn_cdc_map_lsn_to_time 查詢變更時間:
SELECT [__$operation] ,
CASE [__$operation] WHEN 1 THEN '刪除' WHEN 2 THEN '插入' WHEN 3 THEN '更新(捕獲的列值是執行更新操作前的值)'
WHEN 4 THEN '更新(捕獲的列值是執行更新操作後的值)' END [型別],
sys.fn_cdc_map_lsn_to_time([__$start_lsn]) [更改時間] ,
name ,
DepartmentID ,
GroupName ,
ModifiedDate
FROM cdc.HumanResources_Department_CT
注意,由於該表剛好有一個modfieddate欄位,所以和更改時間相同.
D、獲取LSN邊界:
SELECT sys.fn_cdc_get_max_lsn()[資料庫級別的最大LSN],
sys.fn_cdc_get_min_lsn('cdc.HumanResources_Department_CT')[捕獲例項的lsn]
增加刪除欄位時候開啟關閉表級CDC:
查詢capture_instance:
EXECUTE sys.sp_cdc_help_change_data_capture;
GO
關閉:
USE [Sales] ;
GO
EXECUTE sys.sp_cdc_disable_table
@source_schema = N'dbo'
, @source_name = N'SO'
-- , @role_name = N'cdc_Admin'--可以自動建立
, @capture_instance=N'dbo_SO'
GO
開啟:
USE [Sales] ;
GO
EXECUTE sys.sp_cdc_enable_table
@source_schema = N'dbo'
, @source_name = N'SO'
, @role_name = N'cdc_Admin'--可以自動建立
, @capture_instance=N'dbo_SO'
GO
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22996654/viewspace-2730984/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQLServer開啟CDC功能SQLServer
- SQLServer開啟CDC功能(3)SQLServer
- SQLServer CDC清理規則SQLServer
- 開啟sqlserver2014匯入EXCEL功能SQLServerExcel
- 使用SQLServer 2008的CDC功能實現資料變更捕獲SQLServer
- SQLServer對錶進行CDC捕捉時報錯SQLServer
- SQLServer對錶進行CDC捕捉報錯SQLServer
- ogg 12.3 for sqlserver 2016 CDC模式配置SQLServer模式
- Oracle_CDC整理2-部署Oracle
- iPhone開啟CarPlay功能方法 iPhone如何開啟CarPlay功能?iPhone
- windows開啟ping功能Windows
- ogg 12.3 for sqlserver 2016/2014 CDC模式配置SQLServer模式
- sqlserver筆記2SQLServer筆記
- Apache DolphinScheduler如何開啟開機自啟動功能?Apache
- 【Mysql】mysql開啟審計功能MySql
- 開啟Oracle的審計功能Oracle
- ZBlog開啟固定域名功能
- SqlServer中字串拆分仿造split功能SQLServer字串
- CDC+PL/SQL或者CDC+kettle。SQL
- win10怎麼開啟wifi功能_win10開啟無線wifi功能的方法Win10WiFi
- Apache開啟GZIP壓縮功能方法Apache
- 開啟oracle的flashback閃回功能Oracle
- 開啟apache的mod_rewrite功能Apache
- SQLServer裡統計維護功能(autostats)SQLServer
- 為HttpClient開啟HTTP/2HTTPclient
- oracle和sqlserver互訪(2)OracleSQLServer
- Sqlserver重啟alwayson監聽埠SQLServer
- Win10反色功能如何開啟 Win10電腦中開啟反色功能的方法Win10
- SQLServer資料庫MMC不能開啟檔案的解決方法SQLServer資料庫
- 在macOS 如何開啟NTFS讀寫功能Mac
- 開啟mysql 資料庫審計功能。MySql資料庫
- 開啟轉發IP功能(IP forwarding)Forward
- ORACLE開啟自動跟蹤SQL 功能。OracleSQL
- 開啟資料庫的閃回功能:資料庫
- 開啟職場高效時代,科大訊飛智慧辦公本X2功能強大
- win10系統怎麼開啟語音控制功能_win10開啟語音控制功能教程Win10
- Win10網路喚醒功能如何開啟 win10網路喚醒功能怎麼開啟Win10
- Oracle中flashback table功能為什麼需要開啟row movement功能Oracle