1. 概述
CDC(Change Data Capture),即数据变更抓取,通过为源端数据源开启CDC,可实现数据源的实时数据同步以及数据表的 DDL 同步。
本章节主要介绍如何为 SQL Server 数据库开启 CDC 功能。
2. 约束限制
SQL Server CDC 不支持computed column(计算字段),若使用 SQL Server CDC 进行管道任务同步,请避免创建表时出现类似 [HashValue] As (abs(checksum([cID]))%(10)) PERSISTED NOT NULL 的计算字段。
3. 操作步骤
3.1 确认当前使用的数据库版本
同步来源数据源的数据至去向数据源之前,需要确保 SQL Server 版本为数据管道支持的版本。
数据管道支持读取的 SQL Server 数据库类型及版本如下表所示:
数据库类型 | 企业版(Enterprise Edition) | 标准版(Standard) |
---|---|---|
SQL Server | 2008 2012 2014 2016 2017 2019 | 2016 SP1 2017 2019 |
数据管道支持写入的 SQL Server 数据库类型及版本如下表所示:
数据库类型 | 版本 |
---|---|
SQL Server | 2000 2005 2008 2012 2014 2016 2017 2019 |
可以通过如下语句查看数据库的版本。
select @@version
3.2 读取数据库开启CDC
3.2.1 开启 Sql Server 数据库代理服务
需要确保 SQL Server Agent 为运行状态。
检查方法:使用 sysadmin 角色的用户执行 EXEC master.dbo.xp_servicecontrol N'QUERYSTATE', N'SQLSERVERAGENT'; 并确保结果为 Running,则标识SQL Server Agent 运行中。
若结果为 Stopped,此时需要使用 sysadmin 角色的用户开启数据库代理服务。
界面操作方式:
在开始菜单中,找到 Microsoft SQL Server >配置工具,然后打开SQL Server 配置管理器。
在 SQL Server 配置管理器中,展开服务,然后单击SQL 代理。在结果窗格中,右键单击启动,如下图所示:
SQL Server Agent 旁的图标上和工具栏上的绿色箭头指示 SQL Server Agent 已成功启动,如下图所示:
3.2.2 开启 CDC 变更数据捕获
开启数据库 CDC
使用命令开启:
use 数据库名称
go
EXEC sys.sp_cdc_enable_db
go
注:其中数据库名称是要启用增量复制的数据库。
使用命令检查是否已经开启CDC:
SELECT name, database_id, is_cdc_enabled
FROM sys.databases WHERE name ='数据库名称'
go
注:其中数据库名称是要启用增量复制的数据库。
开启数据表 CDC
注:对数据库开启 CDC 后,需要对数据表也开启 CDC,否则无法进行数据管道任务配置。
使用命令开启:
use 数据库名称
go
EXEC sys.sp_cdc_enable_table
@source_schema = N'Schema',
@source_name = N'Table',
@role_name = N'Role'
go
注:Table是数据表的名称(没有 schema )。Role 是可以访问更改数据的角色。数据管道功能需要使用 SQL Server 数据库 public 数据库角色 中的 db_datareader 用户。
例如,schema 模式为 dbo,则示例如下:
use Roxy
go
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'test',
@role_name = N'public'
go
如下图所示:
使用命令检查是否已经开启CDC:
use 数据库名称
go
SELECT name,is_tracked_by_cdc
FROM sys.tables
WHERE name = N'table'
go
3.3 确认数据库账号权限
需要规划一个可访问数据源的账号,用于后续数据管道过程中访问数据源并进行数据提取、写入的同步操作。
创建账号操作详情请参见: 创建Sql server 账号
创建用户示例语句可参考:
use your database;
create login test with password='your password';
go
create user test for login test;
go
注:test 为用户名称;your password 改为用户实际的数据库密码。
此时即可使用该用户配置数据源,如下图所示:
3.3.1 角色要求
数据管道功能需要使用 SQL Server 数据库 public 数据库角色 中的 db_datareader 用户。
例如可使用以下命令将用户添加到固定数据库级角色 db_datareader。
use your database;
go
exec sp_addrolemember 'db_datareader','your user'
go
3.3.2 权限要求
数据管道需要 SQL Server 数据库用户拥有数据源表的 SELECT 权限、INFORMATION_SCHEMA 的 SELECT 权限、sys 的 SELECT 权限。
对需要进行同步的表赋予SELECT权限
use your database;
grant select on OBJECT::your schema.your table name to test;
// 假设database是master,schema是dbo,表名是users,示例:
use master;
grant select on OBJECT::dbo.users to test;
注:test 为用户名称。
对 SCHEMA 下面所有表赋予SELECT权限
use your database;
grant select on SCHEMA::your schema to test;
// 假设database是master,schema是dbo,示例:
use master;
grant select on SCHEMA::dbo to test;
注:如果 capture instance 指定了角色(role),该角色需要包含当前用户。
注:test 为用户名称。
增量同步,需要对名为cdc的schema,赋予SELECT权限
-- 增量权限
use your database;
grant select on SCHEMA::cdc to test;
4. 后续步骤
在配置好数据库后,即可完成数据源配置。
需要在使用数据管道进行实时同步任务配置前,在 FineDataLink 中配置好需要同步的源端和目标端数据库数据连接,以便在同步任务配置过程中,通过选择数据源名称来控制同步任务,详情参见:配置数据连接
然后设置数据管道任务即可,详情参见:配置数据管道任务