利⽤Sqlrver的CDC功能实现2张表的同步更新Sqlrver利⽤CDC功能实时同步两张表数据
⼀适⽤环境
仅在SQLServer2008(含)以后的企业版、开发版和评估版中可⽤。
在开启CDC功能前,记得要把sqlrver的代理服务器打开。、
⼆ CDC功能⼤概介绍
CDC(change data capture)功能主要捕获SQLServer指定表的增删改操作,由于任何操作都会写⽇志(哪怕truncate),所以CDC的捕获来源于⽇志⽂件。⽇志⽂件会把更改应⽤到数据⽂件中,同时也会标记符合要求的数据标记为需要添加跟踪的项。然后通过⼀些配套函数,最后写⼊到数据仓库中。⼤概流程如图:
三具体同步步骤以及截图
1准备⼯作
现在假设有2个数据库和2张表,db1是我们的⽬标数据库,⾥⾯有⼀张⽬标表t_cdc_ta,对⽬标表的所有增删改查操作,我们想要同步到结果库monitor⾥的结果表t_cdc_ta⾥。
⾸先创建这样2张表
create databa db1;百发百中的近义词
create databamonitor;
然后创建表结构,如下
CREATETABLE [t_cdc_ta]
(
[id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[name] [varchar](20) NULL,
[addr] [varchar](20) NULL,
[ttime] [datetime] NULL
牙龈肿痛吃什么好)
2对数据库开启CDC功能
开启cdc功能
USEdb1
GO
EXEC sys.sp_cdc_enable_db
-验证
--检查是否开启成功
SELECT is_cdc_enabled ,
先烈事迹CASE WHEN is_cdc_enabled = 0 THEN 'CDC功能禁⽤' ELSE 'CDC功能启⽤'
END 描述
FROM sys.databas
WHERE NAME = 'db1'
--0 :未开启cdc 1:开启cdc
扶风堂
然后可以发现数据库db1⾥的⼀些变化
db1的安全性⾥的⽤户添加了cdc,架构也添加了cdc
在sqlrver代理⾥,我们也会发现,增加了⽬标库的capture和cleanup,⼀个负责捕获变化,⼀个负责清除变化。
3对某张表具体开启cdc功能
USE db1;
GO
EXECsys.sp_cdc_enable_table
@source_schema ='dbo'
电脑屏幕翻转
,@source_name='t_cdc_ta'
,@role_name=null
大刀眉
,@capture_instance=NULL
,@supports_net_changes=1
,@index_name=null
,@captured_column_list=null
,@filegroup_name=default
,@allow_partition_switch=1
这⾥补充说明下,source_schema是表的拥有者,source_schema是表名。
role_name可以写null,但是如果设置了⽐如设置成cdc_Admin,那么可以在⾓⾊⼀栏⾃动创建的
具体语句
USE db1;
GO
EXECUTEsys.sp_cdc_enable_table
@source_schema = 'dbo'
, @source_name = 't_cdc_ta'
, @role_name = 'cdc_Admin'--可以⾃动创建
, @capture_instance=DEFAULT
GO
执⾏完后,我们会发现,在db1的系统表⾥会⽣成这样⼀张表
这张表就是针对⽬标表的增删改操作会⽣成相关的监听数据,写进这张表⾥,下⾯我们来事例下4测试cdc功能,看看⽇志表情况(记录⽬标表的变化情况)
对⽬标表进⾏相关的增删改操作
u db1;
inrt intodbo.t_cdc_ta(id,name,addr,ttime) values
(1,'zjm','addr1','2017-10-1909:56:15.000'),
(2,'zjm2','addr2','2017-10-1909:56:15.000'),
(3,'zjm3','addr3','2017-10-1909:56:15.000'),
(4,'zjm4','addr4','2017-10-1909:56:15.000')
update dbo.t_cdc_tat name='xxq' where id=1
delete fromdbo.t_cdc_ta where id=3
此时我们看下⽇志表的具体情况
lect*from [db1].[cdc].[dbo_t_cdc_ta_CT]
右边边框是⽬标表⾥的数据,对于[__$operation]列,相当于对于增删改打了个标签,1代表删除,2代表插⼊,3代表update的旧数据,4代表update的新数据。
显示器显示无信号5如何针对⽇志表对结果表同步
先针对结果表写⼀个存储过程,实现对结果表的增删改操作
U monitor
CREATE PROC [dbo].[p_merge]
@oper INT,
nice的比较级
@id INT,
@name VARCHAR(20),
@addr VARCHAR(20),
@ttime DATETIME
AS
-- 删除
IF @oper=1