SQL Server Connector
SQL Server CDC Pipeline 连接器支持从 SQL Server 数据库读取快照数据和增量数据,并提供端到端的表数据同步能力。本文描述如何设置 SQL Server CDC Pipeline 连接器。
前置条件
- SQL Server Agent 正在运行。
- 已为数据库和需要捕获的表开启 Change Data Capture。
- 配置的 SQL Server 用户可以连接服务器并读取被捕获的表。
- 当前连接器的
tables配置中,数据库只支持单个固定库名,schema 和 table 支持正则表达式匹配多个。
为数据库和表启用 CDC:
USE MyDB;
GO
EXEC sys.sp_cdc_enable_db;
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'MyTable',
@role_name = NULL,
@supports_net_changes = 0;
GO
检查表是否已启用 CDC:
USE MyDB;
GO
EXEC sys.sp_cdc_help_change_data_capture;
GO
示例
从 SQL Server 读取数据同步到 Doris 的 Pipeline 可以定义如下:
source:
type: sqlserver
name: SQL Server Source
hostname: 127.0.0.1
port: 1433
username: root
password: 123456
# 数据库只支持单个固定库名,schema 和 table 支持正则匹配多个。
tables: inventory.dbo.\.*
schema-change.enabled: true
sink:
type: doris
name: Doris Sink
fenodes: 127.0.0.1:8030
username: root
password: 123456
pipeline:
name: SQL Server to Doris Pipeline
parallelism: 4
连接器配置项
| Option | Required | Default | Type | Description |
|---|---|---|---|---|
| hostname | required | (none) | String | SQL Server 数据库服务器的 IP 地址或主机名。 |
| port | optional | 1433 | Integer | SQL Server 数据库服务器的整数端口号。 |
| username | required | (none) | String | 连接 SQL Server 数据库服务器时使用的 SQL Server 用户名。 |
| password | required | (none) | String | 连接 SQL Server 数据库服务器时使用的密码。 |
| tables | required | (none) | String | 需要监控的 SQL Server 表名。database 只支持单个固定库名,schema 和 table 支持正则表达式匹配多个;不支持数据库级别正则表达式或跨数据库匹配。点号(.)会被视为 database、schema 和 table 名的分隔符。如果需要在正则表达式中使用点号(.)匹配任意字符,必须使用反斜杠转义。 示例:inventory.dbo.\.*、inventory.dbo.user_table_[0-9]+、inventory.dbo.(app|web)_order_\.* |
| tables.exclude | optional | (none) | String | 在应用 `tables` 后需要排除的 SQL Server 表名。schema 和 table 支持正则表达式匹配多个。所有排除规则必须与 `tables` 选项使用同一个固定库名。 示例:inventory.dbo.audit_\.*、inventory.dbo.tmp_[0-9]+ |
| schema-change.enabled | optional | true | Boolean | 是否发送 schema change 事件,使下游 sink 可以同步表结构变更。 |
| server-time-zone | optional | (none) | String | 数据库服务器中的会话时区。如果未设置,则使用 ZoneId.systemDefault() 确定服务器时区。 |
| scan.incremental.snapshot.chunk.key-column | optional | (none) | String | 表快照的切分键。默认使用主键的第一列,该列必须是主键列。 |
| scan.incremental.snapshot.chunk.size | optional | 8096 | Integer | 表快照的 chunk 大小,单位为行数。 |
| scan.snapshot.fetch.size | optional | 1024 | Integer | 读取表快照时每次轮询的最大读取条数。 |
| scan.startup.mode | optional | initial | String | SQL Server CDC 消费者可选启动模式。合法值为 "initial"、"latest-offset"、"snapshot" 和 "timestamp"。 |
| scan.startup.timestamp-millis | optional | (none) | Long | 当 `scan.startup.mode` 为 "timestamp" 时使用的启动时间戳。 |
| scan.incremental.snapshot.backfill.skip | optional | false | Boolean | 是否在快照读取阶段跳过 backfill。跳过 backfill 可能导致部分 change log 事件以 at-least-once 语义被重放。 |
| scan.incremental.snapshot.unbounded-chunk-first.enabled | optional | true | Boolean | 是否在快照读取阶段优先分配无上界 chunk。这可能有助于降低对最大的无上界 chunk 执行快照时 TaskManager 出现内存溢出(OOM)的风险。 |
| connect.timeout | optional | 30s | Duration | 连接器尝试连接 SQL Server 数据库服务器后的最长等待时间。 |
| connect.max-retries | optional | 3 | Integer | 连接器建立 SQL Server 数据库服务器连接的最大重试次数。 |
| connection.pool.size | optional | 20 | Integer | 连接池大小。 |
| metadata.list | optional | (none) | String | 从 SourceRecord 中读取并传递给下游的元数据列表,使用英文逗号分隔。可用元数据包括:database_name、schema_name、table_name、op_ts。 |
| scan.incremental.close-idle-reader.enabled | optional | false | Boolean | 是否在快照阶段结束时关闭空闲 reader。此特性依赖 FLIP-147。 |
| scan.newly-added-table.enabled | optional | false | Boolean | 是否扫描新增表。该选项仅在作业从 savepoint 或 checkpoint 启动时有用。 |
| debezium.* | optional | (none) | String | 传递给 Debezium Embedded Engine 的 Debezium 属性。 |
| jdbc.properties.* | optional | (none) | String | 传递自定义 JDBC URL 属性。例如:jdbc.properties.encrypt=false。 |
兼容性说明:如果希望保持旧版本 Pipeline 行为,可以显式配置
scan.incremental.snapshot.backfill.skip: true和scan.incremental.snapshot.unbounded-chunk-first.enabled: false。
可用 Metadata
配置 metadata.list 后,以下 metadata 可以传递到下游。
| Key | DataType | Description |
|---|---|---|
| database_name | STRING NOT NULL | 包含该行的数据库名称。 |
| schema_name | STRING NOT NULL | 包含该行的 schema 名称。 |
| table_name | STRING NOT NULL | 包含该行的表名。 |
| op_ts | TIMESTAMP_LTZ(3) NOT NULL | 该变更在数据库中发生的时间。对于快照记录,该值始终为 0。 |
启动读取位置
配置项 scan.startup.mode 指定 SQL Server CDC 消费者的启动模式。有效值包括:
initial:先对被监控表执行初始快照,然后继续读取最新变更。latest-offset:从最新 change log offset 开始读取。snapshot:只读取快照。timestamp:从scan.startup.timestamp-millis指定的时间戳开始读取。
数据类型映射
限制
单数据库
tables 中的所有条目必须属于同一个数据库。数据库只支持单个固定库名,schema 和 table 支持正则表达式匹配多个。
Copyright © 2026 The Apache Software Foundation. Apache Flink, Flink, and the Flink logo are trademarks of The Apache Software Foundation.