從08開始,sql server 提供了一種叫做 變更數據捕獲 cdc(Change Data Capture) 的功能,可以通過啟用這個功能,來實現查看資料庫中的表對象的數據的變化情況。(我感覺就是有點像sql server 自己提供的用戶能直接看懂的數據變化功能)。 根據官方的說法。使用cdc
從08開始,sql server 提供了一種叫做 變更數據捕獲 cdc(Change Data Capture) 的功能,可以通過啟用這個功能,來實現查看資料庫中的表對象的數據的變化情況。(我感覺就是有點像sql server 自己提供的用戶能直接看懂的數據變化功能)。
根據官方的說法。使用cdc 功能有以下好處
1、這是資料庫自帶的功能,無需額外的開發成本。
2、不需要改動表的結構,不需要動用到觸發器,存儲過程等手段去記錄
3、性能開銷最小化。(這個我也沒有證實過╮(╯_╰)╭)
動用cdc 其實很簡單
1、將資料庫顯示開啟cdc 跟蹤
EXEC sys.sp_cdc_enable_db
2、然後我創建一個表,並對其開啟cdc。這裡列出的是最簡單的參數,跟蹤還可以設置到具體捕獲哪些列產生變化的。具體參照
sys.sp_cdc_enable_table : https://msdn.microsoft.com/zh-cn/library/bb522475(v=sql.120).aspx
CREATE TABLE AAA2 ( ID INT PRIMARY KEY, Col1 NVARCHAR(50), Col2 INT ) EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'AAA2'
3、啟動代理伺服器。(不啟動也可以使跟蹤創建成功,但是就不工作而已)
4、然後我們能在系統表裡面看到多了一個cdc 的架構然後框住的那個就是開啟了AAA2的跟蹤了。
5、然後就可以往AAA2 裡面搞些操作,看下是否有效了~
INSERT INTO dbo.AAA2 ( ID, Col1,Col2 ) VALUES ( 1, 'pp',34 ),( 2, 'bb',234 ),( 3, 'cc',12 ) UPDATE dbo.AAA2 SET Col1 = 'dd' WHERE ID = 3 DELETE FROM dbo.AAA2 WHERE ID = 2 SELECT * FROM cdc.dbo_AAA2_CT __$start_lsn __$end_lsn __$seqval __$operation __$update_mask ID Col1 Col2 ---------------------- ------------- ---------------------- ------------ -------------------- ---- ------ ----------- 0x0000015B0001378F0019 NULL 0x0000015B0001378F0016 2 0x07 1 pp 34 0x0000015B0001378F0019 NULL 0x0000015B0001378F0017 2 0x07 2 bb 234 0x0000015B0001378F0019 NULL 0x0000015B0001378F0018 2 0x07 3 cc 12 0x0000015B000137A50003 NULL 0x0000015B000137A50002 3 0x02 3 cc 12 0x0000015B000137A50003 NULL 0x0000015B000137A50002 4 0x02 3 dd 12 0x0000015B000137AB0005 NULL 0x0000015B000137AB0002 1 0x07 2 bb 234
有一個東東,啟用的cdc ,意味著不能用truncate 了~會提示不能使用的喲~,至於查出來的結果基本都看懂吧?
有幾個說明一下,
__$operation : 1 刪除 2 新增 3 修改(修改前的值) 4 修改(修改後的值)
__$update_mask : 表示那個列做了操作,02 就是0010 表示第二列 ,那07就是 0111 表示123列都做了修改羅~就醬~
6 看到這裡都還是覺得這個功能好好是不是啊~但是我覺得還是有一點不方便的。比方說當你需要修改表結構的時候~
慄子1 ,刪除了一列Col2 然後再插入2條數據,然後還是會存在Col2的列(因為不需要改結構嘛╮(╯_╰)╭),然後跟蹤的時候把值設置成空
ALTER TABLE dbo.AAA2 DROP COLUMN Col2 INSERT INTO dbo.AAA2 ( ID, Col1 ) VALUES ( 4, N'DD'),( 5, N'EE') __$start_lsn __$seqval __$operation __$update_mask ID Col1 Col2 0x0000015B000138F40004 0x0000015B000138F40002 2 0x07 4 DD NULL 0x0000015B000138F40004 0x0000015B000138F40003 2 0x07 5 EE NULL
慄子2 ,然後我腦抽的重新把Col2 加進去~然而我改成了字元串類型,然後從新插入數據 ,Col2 沒值啊!!!那也正常,因為這是就結構,雖然名字一樣,但是ColumnID已經不一樣了啊!所以追蹤不到是很正常的。
ALTER TABLE dbo.AAA2 ADD Col2 NVARCHAR(50) INSERT INTO dbo.AAA2 ( ID, Col1, Col2 ) VALUES ( 6, -- ID - int N'jj', -- Col1 - nvarchar(50) 'jjj' -- Col2 - int ) __$start_lsn __$seqval __$operation __$update_mask ID Col1 Col2 0x0000015B000138F40004 0x0000015B000138F40002 2 0x07 4 DD NULL 0x0000015B000138F40004 0x0000015B000138F40003 2 0x07 5 EE NULL 0x0000015B000139640003 0x0000015B000139640002 2 0x07 6 jj NULL
慄子3 ,那我更新總可以了吧!當更新的是元結構有的列,是可以更新成功的,但是如果是新列做了改動,則捕獲不了,正常嘛(想想既然可以給你配置可跟蹤的列,那麼不存在這個列表裡面的列發生變化不捕捉,就是這個道理羅~)
UPDATE dbo.AAA2 SET Col2 = 'ee' WHERE ID = 4 UPDATE dbo.AAA2 SET Col1 = 'III' WHERE ID = 6 __$start_lsn __$seqval __$operation __$update_mask ID Col1 Col2 0x0000015B000139C00003 0x0000015B000139C00002 4 0x02 6 III NULL
那該如何處理這個問題呢~
從心做一個捕獲實例~從心做一個捕獲實例~從心做一個捕獲實例 重要的事情說3便 ╮(╯_╰)╭。也只有這樣羅
綜上所述,cdc 我就描述到這裡~有什麼發現的話我會補充噠~
還是祝大家新年快樂~