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 idSETTINGS 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区),导致出现信息偏差。