SQL Server 是一个值得信赖的老牌数据库系统,自从 1988 年由 Microsoft、Sybase 和 Ashton-Tate 三家公司共同推出之后就一直不断迭代更新。而如今我们提到 SQL Server 通常是指 Microsoft 从 SQL Server 2000 之后的版本。至今 SQL Server 家族已经非常繁茂涵盖了 云上(Azure SQL Server)、IoT 设备(边缘 SQL Server)、以及经典版本(本地 SQL Server)。
实现 SQL Server 作为源端的实时数据同步,一般都会用到它的 CDC 功能,这个功能是从 2008 版本才开始支持。因此本文主要也是基于 SQL Server 2008 版本介绍如何使用 CloudCanal 快速构建一条稳定高效运行的 SQL Server 到 MySQL 数据同步链路。
SQL Server 将用户的每一个数据操作都记录在后缀为 ldf 日志文件中。这些日志会保存在 ldf 文件中。当数据库启用 CDC 能力后,SQL Server 代理上会生成一个专门分析ldf文件的作业,再将具体的表启用 CDC, 则该作业开始持续分析文件中的变更事件到指定的表中。
作业执行用到 SQL Server 代理,该组件如果处于非启动状态,则生成任何可消费的变更数据。通常,我们可以在 Windows 对象资源管理器中查看是否已经开启了 SQL Server 代理。
由于 SQL Server 执行作业时无法设置起始位置,因此对于一个表的变更记录我们最早只能追溯到表启用 CDC 的那个时间点。具体的起始位点可以在 “cdc.change_tables” 表中查询得到。
还需要注意的另外一个细节是 CDC 表也是一张普通的表它和用户共享同一个数据空间。为了防止 CDC 表数据无限膨胀 SQL Server 会每天定时执行清理作业,清理过期的数据(具体时间视数据库配置而定)。
CloudCanal 从 2021 年开始支持 SQL Server 同步后就不断地丰富它的对端数据源,支持 SQL Server 到 MySQL 是一个非常重要的同步链路。
目前 CloudCanal 已经可以支持的类型和映射关系如下:
SQL Server 类型 | MySQL 类型 | 备注 |
---|---|---|
BIT | BIT | |
DECIMAL | DECIMAL | |
NUMERIC | DECIMAL | |
SMALLINT | SMALLINT | |
TINYINT | TINYINT | 映射为 tinyint unsigned� |
INT | INT | |
BIGINT | BIGINT | |
SMALLMONEY | FLOAT | |
MONEY | FLOAT | |
FLOAT | FLOAT | |
REAL | DOUBLE | |
DATE | DATE | |
DATETIMEOFFSET | DATETIME | 由于 MySQL 类型限制,会丢弃时区信息同时最多保留 6 位精度 |
DATETIME2 | DATETIME | 由于 MySQL 类型限制,会保留最多 6 位精度 |
SMALLDATETIME | DATETIME | |
DATETIME | DATETIME | 由于 MySQL 类型限制,会保留最多 6 位精度 |
TIME | TIME | 由于 MySQL 类型限制,会保留最多 6 位精度 |
CHAR | CHAR | � |
VARCHAR | VARCHAR | 源端 SQL Server 如果为 VARCHAR(MAX),则按照 TEXT 来处理 |
TEXT | TEXT | |
NCHAR | CHAR | |
NVARCHAR | VARCHAR | 源端 SQL Server 如果为 NVARCHAR(MAX),则按照 NTEXT� 来处理 |
NTEXT | TEXT | |
BINARY | BINARY | |
VARBINARY | VARBINARY | 源端 SQL Server 如果为 VARBINARY(MAX),则按照 IMAGE� 来处理 |
IMAGE | BLOB | |
TIMESTAMP | BIGINT | 会映射为 bigint unsigned |
ROWVERSION | BIGINT | 会映射为 bigint unsigned |
HIERARCHYID | – | 暂不支持 |
UNIQUEIDENTIFIER | VARCHAR(36) | |
SQL_VARIANT | – | 暂不支持 |
XML | TEXT | |
GEOMETRY | – | 暂不支持 |
GEOGRAPHY | – | 暂不支持 |
SYSNAME | VARCHAR(128) |
本文简单介绍了如何使用 CloudCanal 进行 SQL Server -> MySQL 数据迁移同步。各位读者朋友,如果你觉得还不错,请点赞、评论加转发吧。