oracle cdc ssis,SSIS+CDC 增量抽取数据

本文介绍了如何使用SQL Server Change Data Capture (CDC)技术,通过创建CDC记录表、初始化和结束捕获日志的存储过程,以及设计SSIS控制流程来实现实时数据的增量捕获。重点展示了如何通过SP获取LSN范围,执行数据提取,并在SSIS中进行更新操作的详细步骤。
摘要由CSDN通过智能技术生成

一 、建立cdc记录表用于每次增量的时间节点

create table dbo.cdc_capture_log (

cdc_capture_log_id int identity not null

, capture_instance nvarchar(50) not null

, start_time datetime not null

, min_lsn binary(10) not null

, max_lsn binary(10) not null

, end_time datetime null

, status_code int not null default 0)

capture_instance:資料表開啟CDC所指定的值。

start_time、end_time:紀錄執行所花的時間。

min_lsn、max_lsn:表示CDC記錄每次更改LSN的範圍。

status_code:當SSIS成功完成時,status_code=1。

二、create procedure dbo.usp_init_cdc_capture_log

create procedure dbo.usp_init_cdc_capture_log

@capture_instance nvarchar(50)

as

begin

set nocount on;

declare

@start_lsn binary(10)

, @end_lsn binary(10)

, @prev_max_lsn binary(10)

--get the max LSN for the capture instance from

--the last extract

select @prev_max_lsn = max(max_lsn)

from dbo.cdc_capture_log

where capture_instance = @capture_instance

-- if no row found in cdc_capture_log get the min lsn

-- for the capture instance

if @prev_max_lsn is null

set @start_lsn = sys.fn_cdc_get_min_lsn(@capture_instance)

else

set @start_lsn = sys.fn_cdc_increment_lsn(@prev_max_lsn)

-- get the max lsn

set @end_lsn = sys.fn_cdc_get_max_lsn()

insert into dbo.cdc_capture_log

(capture_instance,start_time,min_lsn,max_lsn)

values

(@capture_instance,getdate(),@start_lsn,@end_lsn)

select cast(scope_identity() as int) cdc_capture_log_id

end

該SP幫助我們取得上次所執行的max_lsn,[email protected]tart_lsn,

否則就呼叫sys.fn_cdc_get_min_lsn並取得lsn,最後會返回cdc_capture_log_id,

後續將利用cdc_capture_log_id來執行相關資料更新。

create procedure dbo.usp_end_cdc_capture_log

create procedure dbo.usp_end_cdc_capture_log

@capture_log_id int

as

begin

set nocount on;

update dbo.cdc_capture_log set

end_time = getdate(),

status_code = 1

where cdc_capture_log_id = @cdc_capture_log_id

end

該SP幫助我們更新cdc_capture_log資料表的結束時間和狀態。

create procedure dbo.usp_extract_userm_capture_log

create procedure dbo.usp_extract_userm_capture_log

@capture_log_id int

as

begin

set nocount on;

declare

@start_lsn binary(10)

,@end_lsn binary(10)

-- get the lsn range to process

select

@start_lsn = min_lsn

,@end_lsn = max_lsn

from dbo.cdc_capture_log

where cdc_capture_log_id = @cdc_capture_log_id

-- extract and return the changes

select m.tran_end_time modified_ts, x.*

from cdc.fn_cdc_get_net_changes_dbo_userm (

@start_lsn, @end_lsn, ‘all‘

) x

join cdc.lsn_time_mapping m

on m.start_lsn = x.__$start_lsn ;

end

該SP幫助我們取得lsn範圍([email protected]_capture_log_id查詢cdc_capture_log資料表),

並透過呼叫cdc.fn_cdc_get_net_changes_dbo_userm和cdc.lsn_time_mapping來取得lsn範圍中發生的所有資料變更。

三、設計SSIS控制流程和資料流程

157b1c64aa9abcaa6fe26d1a325f6697.png

編輯Exec usp_init_cdc_capture_log

78815803

78815803

2459cefbf83d8d4d3bfc5fe0e8d49493.png

78815803

94a3a5497dbbb6c5c8ba3e374d30fd97.png

创建全局变量

78815803

5ed76ad948a38adfaf296247fcd48546.png

編輯資料流程

78815803

387c689943e80878c8cce00f9157d80a.png

編輯OLE DB來源

78815803

7b47c2b79a183d638da1c9faa5b56774.png

78815803

291e7d363cc2e26966c318291c789304.png

編輯條件式分割

78815803

a6d97385f373926abba008b36c548a66.png

編輯update(oledb命令)

78815803

483b351381a2333a10becc5245965a8f.png

78815803

5f2b2794b9cb1d7584925d6b3eccd5ba.png

編輯insert

78815803

1f7a281c01c1329e36ec70d44e2d8e43.png

最后就是测试,在数据源做添删改,运行包,查看目标数据是否同步。

原文:https://www.cnblogs.com/purple5252/p/10335110.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值