简述
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 的 CDC
SQL Server 将用户的每一个数据操作都记录在后缀为 ldf 日志文件中。这些日志会保留在 ldf 文件中。当数据库启用 CDC 能力后,SQL Server 代理上会生成一个专门剖析 ldf 文件的作业,再将具体的表启用 CDC, 则该作业开始继续剖析文件中的变更事件到指定的表中。
作业执行用到 SQL Server 代理,该组件如果处于非启动状态,则生成任何可生产的变更数据。通常,咱们能够在 Windows 对象资源管理器中查看是否曾经开启了 SQL Server 代理。
因为 SQL Server 执行作业时无奈设置起始地位,因而对于一个表的变更记录咱们最早只能追溯到表启用 CDC 的那个工夫点。具体的起始位点能够在“cdc.change_tables”表中查问失去。
还须要留神的另外一个细节是 CDC 表也是一张一般的表它和用户共享同一个数据空间。为了避免 CDC 表数据有限收缩 SQL Server 会每天定时执行清理作业,清理过期的数据(具体工夫视数据库配置而定)。
SQL Server -> MySQL 的数据类型反对
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 SaaS 版,应用参见疾速上手文档
- 筹备一个 SQL Server 数据库,和 MySQL 实例(本例别离应用自建 SQL Server 2008 和 MySQL 8.0)
- 登录 CloudCanal 平台,增加 SQL Server 和 MySQL
-
创立一条 SQL Server -> MySQL 链路作为增量数据起源
工作创立
- 工作治理 -> 工作创立
- 测试链接 并抉择 源 和 指标 数据库
- 点击下一步
- 抉择 数据同步 ,并勾选 全量数据初始化,其余选项默认
- 此时如果 SQL Server 上数据库还没有启用 CDC 性能,则会在点击下一步的时候提醒如何启用 CDC。只有依照提醒的参考语句执行即可。
- 抉择须要迁徙同步的 表和 列
- 确认创立工作
- 工作主动做 构造迁徙 、 全量迁徙 、 增量同步
校验数据
- 程序造数据,SQL Server -> MySQL,在源端以 1:1:1 的比例随机执行 Insert、Update、Delete 三种类型语句。应用 20 个线程并发写入变更。
- 工作失常运行一段时间后,进行造数据
- 点击 SQLServer -> MySQL 工作 详情 , 性能列表 -> 创立类似工作 ,在创立工作的第二步抉择 数据校验
-
数据校验 OK
- 上面这个是校验后果。如果咱们对端和源端一旦呈现数据不统一就会像上面这样十分醒目的提醒给用户,有多少数据不统一,有多少数据失落。
常见问题
反对什么版本的 SQL Server 和 MySQL?
- 目前源端 SQL Server 2008 及以上版本皆可应用 CloudCanal 进行迁徙同步(举荐应用 SQL Server 2016 或 SQL Server 2008)
-
对端 MySQL 反对 5.6、5.7、8.0 版本,也能够选用 阿里云 RDS for MySQL 对应的版本,或者其它云服务商的 MySQL 版本
数据不同步了都有哪些状况?
- SQL Server CDC 须要依赖 SQL Server 代理,首先要确定 SQL Server 代理服务是否启动
- 表在启动 CDC 的时候会确定要捕捉的列清单,此时如果批改列的类型可能会导致 CDC 中断。目前解决办法只能重建工作。
-
增 / 减 同一个列名的列,对一个列删除后在减少。尽管 CDC 表中字段仍然存在然而也会导致整个 CDC 中断。
什么状况下会影响稳固的数据同步?
- 如果工作在同步期间呈现了异样导致工作提早。这时候须要分外留神,如果过长时间的提早,即使是修复了提早的问题(比方对端数据库长时间呈现不可用)在后续数据同步上也可能存在失落数据的危险。
- SQL Server 为了避免 CDC 表数据有限收缩 SQL Server 会每天定时执行清理作业,清理超过 3 天的数据。
-
为了减少提早的容忍度能够执行这条 SQL 来减少 CDC 数据的保留工夫,代价是这些数据须要寄存到数据库表中,如果每日数据变更很多对磁盘开销会有额定的要求。
- execute sys.sp_cdc_change_job @job_type = n’cleanup’, @retention = 4320
- msdb.dbo.cdc_jobs 表中保留了具体 捕捉工作的数据保留工夫。
总结
本文简略介绍了如何应用 CloudCanal 进行 SQL Server -> MySQL 数据迁徙同步。各位读者敌人,如果你感觉还不错,请点赞、评论加转发吧。