利用Sqlrver的CDC功能实现2张表的同步更新

更新时间:2023-06-22 13:34:44 阅读: 评论:0

利⽤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 ,
generation是什么意思
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,那么可以在⾓⾊⼀栏⾃动创建的
具体语句
pos
USE db1;
maintain翻译GO
EXECUTEsys.sp_cdc_enable_table
@source_schema = 'dbo'
, @source_name = 't_cdc_ta'
cambridge
, @role_name = 'cdc_Admin'--可以⾃动创建
美国好声音第七季, @capture_instance=DEFAULT
GO
执⾏完后,我们会发现,在db1的系统表⾥会⽣成这样⼀张表
这张表就是针对⽬标表的增删改操作会⽣成相关的监听数据,写进这张表⾥,下⾯我们来事例下4测试cdc功能,看看⽇志表情况(记录⽬标表的变化情况)
kuci对⽬标表进⾏相关的增删改操作
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,
@id INT,
@name VARCHAR(20),
@addr VARCHAR(20),
@ttime DATETIME
AS
-- 删除
IF @oper=1

本文发布于:2023-06-22 13:34:44,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/153755.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:功能   数据   增删   标表   操作   开启   标记
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图