SQL Server 数据源

最近更新时间:2024-09-04 20:44:31

我的收藏
数据集成提供了 SQL Server 的读取和写入能力,本文为您介绍使用 SQL Server 进行实时数据同步的前置环境配置以及当前能力支持情况。

支持版本

目前数据集成已支持 SQL Server 单表及整库级实时读取和单表写入,使用实时同步能力需遵循以下版本限制:
类型
版本
SQL Server
2008、2008R2、2012、2014、2016、2017、2019

使用限制

SQL Server 一个数据源只能对应一个数据库,所以一个实时整库任务只支持同步一个数据库下的表,不支持跨库选择表。
无主键的表由于无法保证 exactly once 可能会有数据重复,因此实时同步任务最好保证有主键。
SQL Server 当前仅支持全量阶段自动建表,增量阶段暂不支持。

数据库环境准备

开启数据库 CDC

1. 将 mydatabase 替换为实际数据库:
if exists(select 1 from sys.databases where name='mydatabase' and is_cdc_enabled=0)
begin
exec sys.sp_cdc_enable_db
end
执行以下命令查询 CDC 是否开启成功,结果为“1”表示成功。
select is_cdc_enabled from sys.databases where name='mydatabase'

开启表级别 CDC

1. sqlserver必须开启表级别 CDC,才会真正的采集日志。
IF EXISTS(SELECT 1 FROM sys.tables WHERE name='mytable' AND is_tracked_by_cdc = 0)
BEGIN
EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo', -- source_schema
@source_name = 'mytable', -- table_name
@capture_instance = NULL, -- capture_instance
@role_name = NULL, -- role_name 指定一个角色,您可以向该角色添加要授予对源表的捕获列的 SELECT 权限的用户。sysadmin 或 db_owner 角色中的用户也可以访问指定的更改表。将 @role_name 的值设置为 NULL,以仅允许 sysadmin 或 db_owner 中的成员对捕获的信息具有完全访问权限。
@supports_net_changes = 0
END
其中,mytable 替换为实际需要开启 CDC 配置的表名。
2. 执行以下命令查询执行结果,结果为“1”表示成功。
SELECT is_tracked_by_cdc FROM sys.tables WHERE name='mytable'

其他操作

如果表结构有调整,需要重新开启 CDC 配置,配置步骤如下:
1. 先关闭 CDC 配置,请根据实际情况填写 schema 和 name。
EXEC sys.sp_cdc_disable_table
@source_schema = N'dbo',
@source_name = 'mytable',
@capture_instance ='all'
2. 重新开启 CDC 配置,请根据实际情况填写 schema 和 name。
IF EXISTS(SELECT 1 FROM sys.tables WHERE name='mytable' AND is_tracked_by_cdc = 0)
BEGIN
EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo', -- source_schema
@source_name = 'mytable', -- table_name
@capture_instance = NULL, -- capture_instance
@role_name = NULL, -- role_name 指定一个角色,您可以向该角色添加要授予对源表的捕获列的 SELECT 权限的用户。sysadmin 或 db_owner 角色中的用户也可以访问指定的更改表。将 @role_name 的值设置为 NULL,以仅允许 sysadmin 或 db_owner 中的成员对捕获的信息具有完全访问权限。
@supports_net_changes = 0
END

整库读取节点配置

数据来源设置




参数
说明
数据源
选择需要同步的 SQL Server 数据源。
来源表
SQL Server 只支持指定表和指定库,不支持所有库表
指定表:此选项下需指定到具体表名称,设置后任务仅同步指定表,只能选择一个库下的表,不支持跨库选择;若需要新增同步表需暂停并重启任务。



指定库:此选项下需指定具体库名、表名正则表达式。其中库名必须要相同,不支持多个数据库。设置后,任务运行期间符合表名表达式的新增表默认将同步至目标端。



读取模式
全量 + 增量:数据同步分为全量和增量同步阶段,全量阶段完成后任务进入增量阶段。全量阶段将同步库内历史数据,增量阶段从任务启动后 binlog cdc 的位点开始同步。
增量:仅从任务启动后的 binlog cdc 位点开始同步数据。
一致性语义
仅代表读取端的一致性语义。支持 At-least-once 和 Exactly-once。
At-least-once:数据可能存在重复读取,依赖目标端支持去重来保证数据的一致性。适用于全量阶段数据量大且使用非数值型主键、对同步性能要求高的场景。
Exactly-once:数据严格只读取一次,性能上有一定损失,不支持无主键且无唯一索引列的表。适用于源表有数值型主键或唯一索引列的通用场景。
当前版本两种模式状态不兼容,任务提交后如果修改模式,不支持带状态重启。
高级设置(可选)
可根据业务需求配置参数。

支持的目标数据源

当前支持将 SQL Server 数据实时整库同步到以下类型的目标端:

单表读取节点配置




参数
描述
数据来源
选择 SQL Server 数据源。
支持选择或者手动输入需读取的库名称。
默认将数据源绑定的数据库作为默认库,其他数据库需手动输入库名称。
当数据源网络不联通导致无法直接拉取库信息时,可手动输入数据库名称。在数据集成网络连通的情况下,仍可进行数据同步。
支持选择或者手动输入需读取的表名称。
分表情况下,可在 SQL Server 源端支持选择或输入多个表名称,多个表需保证结构一致。
分表情况下,支持配置表序号区间。例如 'table_[0-99]' 表示读取 'table_0'、'table_1'、'table_2' 直到 'table_99' ; 如果您的表数字后缀的长度一致,例如 'table_000'、'table_001'、'table_002' 直到 'table_999',您可以配置为 '"table": ["table_00[0-9]", "table_0[10-99]", "table_[100-999]"]' 。
当数据源网络不联通导致无法直接拉取表信息时,可手动输入表名称。在数据集成网络连通的情况下,仍可进行数据同步。
添加分库分表
适用于分库场景,点击后可配置多个数据源、库及表信息。分库分表场景下需保证所有表结构一致,任务配置将默认展示并使用第一个表结构进行数据获取。
读取模式
全量 + 增量:数据同步分为全量和增量同步阶段,全量阶段完成后任务进入增量阶段。全量阶段将同步库内历史数据,增量阶段从任务启动后 binlog cdc 的位点开始同步。
仅增量:仅从任务启动后的 binlog cdc 位点开始同步数据。
过滤操作
设置后将不同步指定操作类型的数据,支持过滤插入、更新和删除操作。
时区
设置日志时间所属时区,默认上海。
参数(选填)
可根据业务需求配置参数。

单表写入节点配置




参数
说明
数据源
需要写入的 SQL Server 数据源。
支持选择、或者手动输入需写入的库名称
当数据源网络不联通导致无法直接拉取库信息时,可手动输入数据库名称。在数据集成网络连通的情况下,仍可进行数据同步。
Schema
支持选择、或者手动输入需要写入的 SQL Server 模式。
支持选择、或者手动输入需写入的表名称。
当数据源网络不联通导致无法直接拉取表信息时,可手动输入表名称。在数据集成网络连通的情况下,仍可进行数据同步。
主键
选择一个字段作为写入表的主键。
高级设置(选填)
可根据业务需求配置参数。

日志采集写入节点配置




参数
说明
数据去向
选择当前项目中可用的 SQL Server 数据源。
支持选择、或者手动输入需写入的库名称
当数据源网络不联通导致无法直接拉取库信息时,可手动输入数据库名称。在数据集成网络连通的情况下,仍可进行数据同步。
schema
支持选择、或者手动输入需读取的 schema 名称。
支持选择、或者手动输入需写入的表名称。
当数据源网络不联通导致无法直接拉取表信息时,可手动输入表名称。在数据集成网络连通的情况下,仍可进行数据同步。
主键
选择一个字段作为数据表主键
高级设置(可选)
可根据业务需求配置参数。

数据类型转换支持

读取

SQL Server 读取支持的数据类型及转换对应关系如下(在处理 SQL Server 时,会先将 SQL Server 数据源的数据类型和数据处理引擎的数据类型做映射):
SQLServer 类型
内部类型
char(n)
CHAR(n)
varchar(n),nvarchar(n),nchar(n)
VARCHAR(n)
text,ntext,xml
STRING
decimal(p, s),money,smallmoney
DECIMAL(p, s)
numeric
NUMERIC
REAL,FLOAT
FLOAT
bit
BOOLEAN
int
INT
tinyint
TINYINT
smallint
SMALLINT
time (n)
TIME (n)
bigint
BIGINT
date
DATE
datetime2,datetime,smalldatetime
TIMESTAMP(n)
datetimeoffset
TIMESTAMP_LTZ(3)

写入

SQL Server 写入支持的数据类型及转换对应关系如下:
内部类型
SQLServer 类型
CHAR(n)
char(n)
VARCHAR(n)
varchar(n),nvarchar(n),nchar(n)
STRING
text,ntext,xml
BIGINT
BIGINT,BIGSERIAL
DECIMAL(p, s)
decimal(p, s),money,smallmoney
NUMERIC
numeric
FLOAT
float,real
BOOLEAN
bit
INT
int
TINYINT
tinyint
SMALLINT
smallint
BIGINT
bigint
TIME(n)
time(n)
TIMESTAMP(n)
datetime2,datetime,smalldatetime
TIMESTAMP_LTZ(3)
datetimeoffset