關於CDC的研究

2022-09-11 10:36:11 字數 2772 閱讀 5261

為了實現資料庫的實時監控,表資料的改變難以捕獲,是我們目前所遇到的問題,而這幾天我注意到乙個可參考的方案,可以解決這一問題,cdc。

概念原理:

cdc又稱變更資料捕獲(change data capture),開啟cdc的源表在插入insert、更新update和刪除delete活動時會插入資料到日誌表中。cdc通過

捕獲程序將變更資料捕獲到變更表中,通過cdc提供的查詢函式,我們可以捕獲這部分資料。

1.sql server 2008版本以上的企業版、開發版和評估版中可用;

2.需要開啟**服務(作業)。

3.cdc需要業務庫之外的額外的磁碟空間。

4.cdc的表需要主鍵或者唯一主鍵。

正式設定:   

一, 開啟**服務:

windows環境下,可以直接在服務中找到sql server**,設為自動開啟即可。

linux環境下:

sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true

sudo docker restart

二,建立測試環境:

1.

/******* step1:建立示例資料庫*******/

use master go

if exists(select name from sys.databases where name = 'cdc_db') drop database cdc_db go

create database cdc_db go

2.

/******* step2:開啟資料庫cdc *******/

--檢視資料庫是否啟用cdc

select name,is_cdc_enabled from sys.databases where name = 'cdc_db'

--啟用資料庫cdc

use cdc_db go

execute sys.sp_cdc_enable_db; go

--檢查啟用是否成功

select is_cdc_enabled,case when is_cdc_enabled=0 then 'cdc功能禁用' else 'cdc功能啟用' end 描述 from sys.databases where name = 'cdc_db'

3.
/******* step3:對錶啟用變更捕獲*******/

--建立測試表

use cdc_db go

create table [dbo].[department]( [departmentid] [smallint] identity(1,1) not null, [name] [nvarchar](200) null, [groupname] [nvarchar](50) not null,

[modifieddate] [datetime] not null, [addname] [nvarchar](120) null, constraint [pk_department_departmentid] primary key clustered ( [departmentid] asc ) on [primary] ) on [primary]

go

--對錶啟用捕獲

exec sys.sp_cdc_enable_table @source_schema= 'dbo', @source_name = 'department', @role_name = n'cdc_admin', @capture_instance = default,

@supports_net_changes = 1, @index_name = null, @captured_column_list = null, @filegroup_name = default
--檢查是否成功

select name, is_tracked_by_cdc , case when is_tracked_by_cdc = 0 then 'cdc功能禁用' else 'cdc功能啟用' end 描述 from sys.tables where object_id= object_id('dbo.department')

/******* step4:測試dml變更捕獲*******/

--測試插入資料

insert into dbo.department( name , groupname , modifieddate )values('marketing','sales and marketing',getdate()) --測試更新資料

update dbo.department set name = 'marketing group',modifieddate = getdate() where name = 'marketing'

--測試刪除資料

delete from dbo.department where name='marketing group'

--查詢捕獲資料

select * from cdc.dbo_department_ct

對於insert/delete操作,會有對應的一行記錄,而對於update,會有兩行記錄。__$operation列:1 = 刪除、2= 插入、3= 更新(舊值)、4= 更新(新值);

如圖:

關於CDC在非控制項類中的使用

在非cstatic的派生類中,由於進行圖形的繪製的話,我們需要對該類傳入乙個cdc以便於繪畫。這是因為非cstatic等控制項類無法自己產生onpaint這類的訊息,因此需要借傳入的cdc進行回執,然後回執在其他的記憶體上,最後達到繪圖的效果。但是,在這裡面有乙個問題,當我們直接傳入cdc的時候,往...

關於overflow hidden的研究

示例頁面原始碼 當外層div設定overflow hidden屬性,內層div設定了float left,如果同時寬度超過外層div,會自動擷取內層div width,以適合外層width.nei wai 另外,我們再做乙個試驗,將wai這個div的高度值刪除後,我們發現,wai的高度自動的被nei...

關於foxmail的研究

foxmail的資料儲存,都是由兩個檔案組成 ind 和 box的檔案,ind 檔案主要記錄簡單資訊,以及詳細資訊在.box檔案中的起始位置。預設情況下,foxmail的位址簿由兩個檔案組成,address.ind 和 address.box。address.ind檔案 檔案頭的範圍為00h 39h...