-
SQL Server
审计功能入门:
CDC<
/p>
(
Change Data
Capture
)
介绍
SQL Server
2008
引入了
CDC(Change Data
Capture),
它能记录:
1.
哪些数据行发生了改变
2.
数据行变更的历史记录,而不仅仅是最终值。
跟
CT(Change Tracking)
< br>相比,它通过作业实现异步变更跟踪
(
像事务复制
)
,而
CT
是同步<
/p>
实现的。因此它对性能的影响较轻并且不会影响事务。
典型应用是在提取、传输和加载数据到其它数据源,就像图中的数据仓库。
实现
微软建议
CDC
结合快照快照隔离级别使用,可以避免读取变更
数据与变更数据写入时的读
写阻塞。
需要注意:快照隔离级别会有额外的开销,特别是
Tempdb(
所有的数据更改都会被版本化
存到
tempdb)
。
use
master
go
create
database
CDCTest
go
alter
database
CDCTest
set
allow_snapshot_isolation
on
go
--enable CDC on database
CDCTest
use
CDCTest
go
exec
_cdc_enable_db
go
<
/p>
启用
CDC
之后会新增一个叫
CDC
的
Schema
和
一系列的系统表、
SP
和
View
p>
。官方建议
不要直接查询系统表而是使用对应的系统
SP/FN
来获取
CDC
数据
。
系统对象
ed_columns
_tables
_history
说明
行
为数据库中的每个更改表返回一行
每一数据定义语言
(DDL)
更改返回一
行
建议使用的对象
为在捕获实例中跟踪
的每一列返回一
_cdc_get_source_columns
_cdc_help_change_data_capture
针对启用了变更数
据捕获的表所做的
_cdc_get_ddl_history
_time_mapping
_column
_jobs
为每个在更改表中存在行
的事务返回
_cdc_map_lsn_to_time
一行
行
<
/p>
存储用于捕获和清除作业的变更数据
NA
捕获配置参数
改表。
该表为对源表执行的每个插入
每个更新操作返回两
行
.captur
e_instance
格式
=SchameName_Tabl
eName
为与更改表关联的每一索引列返回一
_cdc_help_change_data_capture
(Tran
sact-SQL)
,
_cdc_map_time_to_lsn
cdc.
p>
对
源表启用变更数据捕获时创建的更
<
br>CDC LSN
_cd
c_get_all_changes_
和删除操作
返回一行,
为对源表执行的
_cdc_get_net_cha
nges_
创建测试表并对期启用
。使用
_cdc_enable_table
p>
对表启用
CDC
。
--Create a test table for
CDC
use
CDCTest
GO
create
table
tb(ID
int
primary
key
,name
varchar
(
20
),weight
decimal
(
10
,
2
));
go
EXECUTE
_cdc_enable_table
@source_schema
=
N
'dbo'
,
@source_name
=
N
'tb'
,
@role_name
=
null
;
GO
<
/p>
如果源表是数据库中
第一个
要启用变更数
据捕获的表,并且数据库不存在事务发布,则
_cdc_enable_table
还将为数据库创建捕获和清理作业。
它将
目录视图
中的
is_tracked_by_cdc
列设置为
1
。
对应的
跟踪表
_tb_CT
包含了源表所有的变更数据。它包含原来所
有的列和
5
个新
的列,结构如图:
p>
验证
当在源表中操行数据更改操作,表
_tb_CT
会记录下来。试一下:
为什么没
有数据呢?因为之前介绍过了,
CDC
是靠作业来捕获变更数据
的,我的
Agent
还
没有运行。
p>
手动启用后,就有数据了。
结果列的含义:
列名
数据类型
说明
更改提交的
。在同一事务中提交的更改将共享同一个提交
LSN
值。
一个事务内可能有多个更改发生,这个值用于对它们进行排
序。
更改操作的类型:
1 =
删除
__$$operation
int
2 =
插入
3 =
更新(捕获的列值是执行更新操作前的值)。
4 =
更新(捕获的列值是执行更新操作后的值)。
位掩码,源表中被
CDC
跟踪的每一列对应一个位。如
果
__$$operation
= 1
或
2
,该值将所有已定义的位设置为
1
。
__$$update_mask
varbinary(128)
如果
__$$operation
= 3
或
4
,则只有那些对应已更改列的位
设置为
1
。
__$$start_lsn
binary(10)
__$$seqval
binary(10)
现在再插入一
行,并更新它,然后再删除
ID=1
的行。再查看结果:
-
-
-
-
-
-
-
-
-
上一篇:Smart3D成果通过文本编辑器合并多个3MX模型
下一篇:描写雪景的词语和诗句