有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
TDSQL-H LibraDB 和 MySQL 是两种完全不同的数据库,因此在数据定义,SQL 语法等使用方式都有不同。CDC 提供了自动化的转换方案,结合少量的用户参与配置,即可满足多数场景需求。

数据表转换规则

数据表统一自动转换到 ReplicatedReplacingMergeTree。
为用户创建对应的本地表和分布式表。本地表为表名添加 _local 后缀。n示例:
-- 使用 CDC 同步 MySQL 库表 sbtest.sbtest1 到 LibraSQL 分析引擎,自定义分区键为 t
-- MySQL 表定义
CREATE TABLE `sbtest1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
`t` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8

-- 转换到 LibraSQL 分析引擎的本地表
CREATE TABLE sbtest.sbtest1_local (
`id` Int32,
`k` Int32,
`c` String,
`pad` String,
`t` DateTime,
`_sign` Int8,
`_version` UInt64
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/sbtest/tables/sbtest1_local/{shard}', '{replica}', _version)
PARTITION BY toYYYYMM(t)
ORDER BY id
SETTINGS index_granularity = 8192

-- 转换到 LibraSQL 分析引擎的分布式表
CREATE TABLE sbtest.sbtest1 (
`id` Int32,
`k` Int32,
`c` String,
`pad` String,
`t` DateTime,
`_sign` Int8,
`_version` UInt64
) ENGINE = Distributed('default_cluster', 'sbtest', 'sbtest1_local', cityHash64(id))

Key 的转换规则

排序键:优先选择 MySQL 表主键,其次是“不可为 NULL 的唯一键”。若“不可为 NULL 的唯一键”有多列,则选择其中第一列。
主键:不做设定,默认为排序键。
分区键:默认不设置,用户可自定义,详见 设置分区键
分片键:使用表达式 cityHash64(主键)。

数据类型的转换规则

默认的数据类型转换规则表。
MySQL 数据类型
LibraSQL 分析引擎数据类型
BIGINT
Int64
BINARY
String
BIT
Int64
CHAR
String
DATE
String
DATETIME
String
DECIMAL
String:MySQL DECIMAL 映射为 LibraSQL DECIMAL 功能上线前启动的 CDC 任务。
DECIMAL:版本为 LibraSQL 10.3.213 新创建的 CDC 任务及后续 LibraSQL 版本。DECIMAL 仅支持不超过38位精度。
DOUBLE
Float64
ENUM
String
FLOAT
Float32
GEOMETRY
String
GEOMETRYCOLLECTION
String
INT
Int32
INTEGER
Int32
JSON
String
LINESTRING
String
MEDIUMINT
Int32
MULTILINESTRING
String
MULTIPOINT
String
MULTIPOLYGON
String
POINT
String
POLYGON
String
SET
String
SMALLINT
Int16
TIME
String
TIMESTAMP
String
TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
String
TINYINT
Int8
TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT
String
VARBINARY
String
VARCHAR
String
YEAR
Int16

自定义数据类型转换

MySQL 和 LibraSQL 分析引擎的某些类型转换方式,会影响到用户的使用,因此提供了用户设定能力。在创建 CDC 的高级设置中,有字段类型映射功能。


n对于时间类型,CDC 服务默认转换为 String,确保信息不丢失。但这样会丢失 LibraSQL 分析引擎时间函数等能力,因此用户可在此处自行选择转换方式。
注意
LibraSQL 分析引擎的时间类型基于 UNIX 时间戳,因此无法表达1970-01-01 00:00:00前的时间信息。当 MySQL 的数据有此之前的时间时,会自动转换为1970-01-01 08:00:00(自动时区转换到东8区),导致出现信息偏差。