MySQL 迁移同步到 ClickHouse
NineData 数据复制支持将自建 MySQL 的数据复制到 ClickHouse,支持全量复制和增量复制。
功能介绍
NineData 数据复制支持数据源之间的结构、全量数据、增量数据的高性能复制,对于 MySQL 数据源之间的复制,还提供双向复制功能,实现快捷构建异地多活业务架构。
- 结构:支持同构及异构数据源之间的对象结构复制,很大程度上降低了两个数据源之间的数据复制门槛。
- 全量数据:通过智能数据分片实现行级并发批量复制能力,有效保障复制性能。自主研发的新型断点续传技术,保证无主键表的数据准确性。
- 增量数据:支持全对象类型的 DML|DDL 增量数据复制,结合事务级并发、热点合并等技术,在保障事务一致性的基础上,提供强劲复制性能。
- 双向数据实时复制:直接多个节点之间的数据双向复制,保证所有节点的数据均保持最新状态。
通过以上功能,可以轻松高效地实现全量|增量数据复制、全量|增量数据迁移、全量|增量数据同步、数据集成、不停机无缝迁移等场景,为企业提供灵活和可靠的数据复制解决方案。
前提条件
已将源数据源和目标数据源添加至 NineData。如何添加,请参见添加数据源。
源和目标数据源的版本见下表。
源数据源 目标数据源 - MySQL 8.0
- MySQL 5.7
- MySQL 5.6
ClickHouse 20.8 及以上 源数据源必须开启 Binlog,并且 Binlog 相关参数设置如下:
binlog_format
=ROW
binlog_row_image
=FULL
提示如果源数据源为备库,为保证获取完整的 Binlog 日志,还需要开启
log_slave_updates
参数。用于登录 ClickHouse 的账号的
access_management
参数值需为1
。配置方式:通过编辑器打开位于
/etc/clickhouse-server
目录下的User.xml
配置文件,找到目标用户,加入参数:<access_management>1</access_management>
。
注意事项
源 MySQL 数据源中,如果有无符号整形类型字段,则 ClickHouse 中会被映射为 Uint 类型。MySQL 和 ClickHouse 的其他数据类型映射关系,请参见附录。
通常 MySQL 到 ClickHouse 的复制场景需要包含结构复制,系统会自动迁移 MySQL 的表结构到 ClickHouse,并在 ClickHouse 涉及复制的表中插入两个系统列。如果复制类型不包含结构复制,则您在需要手动确保下列事项:
ClickHouse 数据源中涉及复制的数据对象,其库表结构必须和 MySQL 数据源一致。
ClickHouse 数据源涉及复制的表中都需要手动插入如下两个系统列用于记录 DML 操作以及 Binlog 的时间。
列名称 数据类型 列默认值 说明 _jz_data_sign Int8 DEFAULT 1 记录 DML 操作的类型,保证 ClickHouse 端的数据和 MySQL 端一致。 - INSERT 操作:该字段记录为 1。
- DELETE 操作:该字段记录为 -1。
- UPDATE 操作:拆分成 INSERT、DELETE 两条记录。
_jz_data_time String DEFAULT now() 记录 Binlog 的时间。 示例:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
...
_jz_data_sign Int8 DEFAULT 1 COMMENT 'replication data update sign: add = 1, remove = -1',
_jz_data_time String DEFAULT now() COMMENT 'replication data update time'
) ENGINE = engine
使用限制
- 数据复制功能仅针对数据源中的用户数据库,系统库不会被复制。例如:MySQL 类型数据源中的
information_schema
、mysql
、performance_schema
、sys
库不会被复制。 - 源数据源的账号必须拥有复制对象的
SELECT
权限(结构复制、全量复制)、SHOW VIEW
权限(视图复制)以及REPLICATION CLIENT
、REPLICATION SLAVE
权限(增量复制),目标数据源的账号必须拥有DML、DDL权限。 - 执行数据同步前需评估源数据源和目标数据源的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源数据源和目标数据源一定的读写资源,导致数据库负载上升。
- 同步对象为表级别的情况下,同步过程中请勿使用在线 DDL 变更工具(例如:gh-ost、pt-online-schema-change)对源库的同步对象进行变更,否则会导致同步失败。
- 需要确保同步对象中的每张表都有主键或唯一约束、列名具有唯一性,否则可能会重复同步相同数据。
操作步骤
NineData 数据复制产品已商业化,您仍然可以保有 10 条复制任务免费使用,注意事项如下:
- 10 条复制任务中可以包含 1 条任务,规格为 Micro。
- 状态为的任务不算在 10 条任务的限制内,如果您已经创建了 10 条复制任务,还想要继续创建,可以先终止之前的复制任务,然后再创建新任务。
- 创建复制任务时,仅可选择您已购买的,未购买的规格将以灰度显示,无法选择。如需购买,请通过页面右下角的客服图标联系我们。
登录 NineData 控制台。
在左侧导航栏单击数据复制 > 。
在数据复制页面,单击右上角的创建数据复制。
在数据源与目标页签,按照下表进行配置,并单击下一步。
参数 说明 任务名称 输入数据复制任务的名称,为了方便后续查找和管理,请尽量使用有意义的名称。最多支持 64 个字符。 源数据源 同步对象所在的 MySQL 数据源。 目标数据源 接收同步对象的 ClickHouse 数据源。 复制类型 - 结构复制:只同步源数据源的库表结构,不同步数据。
- 全量复制:同步源数据源的所有对象和数据,即全量数据复制。
- 增量复制:在全量同步完成后,基于源数据源的日志进行增量同步。单击图标,可以根据需求取消勾选某一些操作类型,取消勾选后,这些操作会在增量同步中被忽略。
增量开始时间 单选增量复制时需要选择。 - 从启动时间开始:以当前复制任务开始时间为基准,进行增量复制。
- 自定义时间:选择增量复制开始的时间点,请根据您的数据源所在地域选择时区。如果将时间点配置为当前复制任务开始前,则如果该时间段内有 DDL 操作,复制任务将失败。
目标库存在同名对象(选中结构复制时需要选择) - 预检查报错并停止任务:预检查阶段检测到同名表时,停止任务。
- 跳过并继续任务:预检查阶段检测到同名表时,发送提示并继续任务。 结构复制时,忽略该同名表。如果您同时进行了数据复制,则数据会在同名表中追加,而不会覆盖原有数据。
- 删除对象并重建:预检查阶段检测到同名表时,发送提示并继续任务。结构复制时,删除目标库同名表,并从源库重新复制表结构。如果您同时进行了数据复制,则数据会在表结构复制完成后写入。
- 保留结构并清空数据,再覆盖写入(同时进行结构和数据复制时可选):预检查阶段检测到同名表时,发送提示并继续任务。结构复制时在目标库保留该表结构,并在数据复制开始时清空同名表中的数据,然后重新从原表中复制。
目标表存量数据处理策略(未选中结构复制时需要选择) - 预检查报错并退出:预检查阶段检测到目标表中存在数据时,停止任务。
- 忽略存量数据,追加写入:预检查阶段检测到目标表中存在数据时,忽略该部分数据,追加写入其他数据。
- 清空存量数据,重新写入:预检查阶段检测到目标表中存在数据时,删除该部分数据,重新写入。
在选择复制对象页签,确认需要复制的内容,您可以选择所有对象同步源库所有内容,也可以选择自定义对象,在源对象列表中选定需要同步的内容,单击>添加到右侧目标对象列表,然后单击下一步。
在配置映射页签,根据所选的复制类型选择不同操作。
包含结构复制:配置目标表同步到目标数据源之后的表名,单击保存并预检查。
提示您可以单击页面右侧的映射与过滤,自定义列名同步到目标数据源之后的名称。
不包含结构复制:系统默认选择目标数据源中的同名数据库,如果不存在,则需要手动选择目标库。目标库中的表名、列名需要和同步对象一致。如果不一致,您也可以手动进行表名和列名的映射。
在预检查页签,等待系统完成预检查,预检查通过后,单击启动任务。
提示您可以勾选开启数据一致性对比。在同步任务完成后,自动开启基于源数据源的数据一致性对比,保证两端数据一致。根据您选择的复制类型,数据一致性对比的启动时机如下:
结构复制:结构复制完成后启动。
结构复制+全量复制:全量复制完成后启动。
结构复制+全量复制+增量复制:当增量数据首次和源数据源一致且同步延迟为 0 秒时启动。您可以单击查看详情,在复制详情页面中查看同步延迟。
如果预检查未通过,需要单击目标检查项右侧操作列的详情,排查失败的原因,手动修复后单击重新检查重新执行预检查,直到通过。
检查结果为警告的检查项,可视具体情况修复或忽略。
在启动任务页签,提示启动成功,同步任务开始运行。此时您可以进行如下操作:
- 单击查看详情查看同步任务各个阶段的执行情况。
- 单击返回列表可以返回数据复制列表。
查看同步结果
登录 NineData 控制台。
在左侧导航栏单击数据复制 > 。
在数据复制页面单击目标同步任务的任务 ID,页面说明如下。
序号 功能 介绍 1 同步延迟 源数据源和目标数据源之间的数据同步延迟,0 秒表示两端之间没有延迟,此时您可以选择将业务切换到目标数据源,实现平滑迁移。 2 配置告警 配置告警后,系统会在任务失败时通过您选择的方式通知您。更多信息,请参见运维监控简介。 3 更多 - 暂停:暂停任务,仅状态为运行中的任务可选。
- 终止:结束未完成或监听中(即增量同步中)的任务,终止任务后无法重启任务,请谨慎操作。如果同步对象中包含触发器,会弹出触发器复制选项,请按需选择。
- 删除:删除任务,任务删除后无法恢复,请谨慎操作。
4 结构复制(包含结构复制的场景下显示) 展示结构复制的进度和详细信息。 - 单击页面右侧的日志:查看结构复制的执行日志。
- 单击页面右侧的刷新:查看最新的信息。
- 单击列表中目标表右侧操作列的查看 DDL:可以查看 SQL 回放。
5 全量复制(包含全量复制的场景下显示) 展示全量复制的进度和详细信息。 - 单击页面右侧的监控:查看全量复制过程中的各监控指标。
- 单击页面右侧的日志:查看全量复制的执行日志。
- 单击页面右侧的刷新:查看最新的信息。
6 增量复制(包含增量复制的场景下显示) 展示增量复制的各项监控指标。 - 击页面右侧的日志:查看增量复制的执行日志。
- 单击页面右侧的刷新:查看最新的信息。
7 修改对象 展示同步对象的修改记录。 - 单击页面右侧的修改同步对象,可对同步对象进行配置,配置方式和步骤 5相同。
- 单击页面右侧的刷新:查看最新的信息。
8 数据对比 展示源数据源和目标数据源之间数据对比的结果。包含结构对比和数据对比。 - 单击页面右侧的重新对比:对当前源和目标两端数据重新发起对比。
- 单击页面右侧的日志:查看一致性对比的执行日志。
- 单击页面右侧的监控(仅数据对比显示):查看对比 RPS(每秒对比的记录数)的走势图。单击详情可以查看更早之前的记录。
- 在对比列表右侧操作列单击:查看源端和目标端的表定义 DDL 语句对比详情。
- 在对比列表右侧操作列单击(不一致情况下显示):生成变更 SQL,您可以直接复制该 SQL 到目标数据源执行,修改不一致的内容。
附录 1:MySQL 和 ClickHouse 数据类型的映射关系表
数据复制过程中,MySQL 的数据类型会被映射成对应的 ClickHouse 数据类型。
MySQL | ClickHouse |
---|---|
INT、MEDIUMNINT | Int32 |
BIT | UInt64 |
TINYINT | Int8 |
SMALLINT UNSIGNED、YEAR | UInt16 |
BIGINT | Int64 |
DECIMAL | Decimal |
FLOAT | Float32 |
DOUBLE | Float64 |
DATE | Date32 |
DATETIME、TIMESTAMP | DateTime64 |
TIME、CHAR、VARCHAR、BINARY、VARBINARY、TINYBLOB、TINYTEXT、BLOB、TEXT、MEDIUMBLOB、MEDIUMTEXT、LONGBLOB、LONGTEXT、ENUM、SET、GEOMETRY、GEOMETRYCOLLECTION、JSON | String |
POINT、MULTIPOINT | Point |
LINESTRING、MULTILINESTRING | Ring |
POLYGO | Polygon |
MULTIPOLYGON | MultiPolygon |
附录 2:预检查项一览表
检查项 | 检查内容 |
---|---|
目标库数据存在性检查 | 检查待复制对象在目标数据库中是否已存在数据 |
目标库同名对象存在性检查 | 检查待复制对象在目标数据库中是否已存在 |
检查目标表是否包含系统字段 | 检查目标表是否包含系统字段 _sign 、 _version |
源数据源连接检查 | 检查源数据源网关状态、实例是否可达、用户名及密码准确性 |
目标数据源连接检查 | 检查目标数据源网关状态、实例是否可达、用户名及密码准确性 |
目标库权限检查 | 检查目标数据库的账号权限是否满足要求 |
源库权限检查 | 检查源数据库的账号权限是否满足要求 |
源数据库 log_slave_updates 是否支持 | 当源数据库为从库时,检查 log_slave_updates 是否为 ON |
源数据源和目标数据源版本检查 | 检测源数据库与目标数据库的版本是否兼容 |
源数据库是否开启 Binlog | 检查源数据库是否开启 Binlog |
源数据库 Binlog Format 是否支持 | 检查源数据库的 binlog 格式是否为 'ROW' |
源数据库 binlog_row_image 是否支持 | 检查源数据库的 binlog_row_image 是否为 'FULL' |