TiCDC CSV Protocol

当使用云存储服务作为下游 sink 时,你可以使用 CSV 格式将 DML 事件发送到下游云存储服务。

TiCDC CSV Protocol - 图1

警告

当开启 Old Value 功能时 (enable-old-value = true),CSV 协议数据格式无法输出更新事件的旧值。

具体原因请参考 TiCDC 在开启 Old Value 功能后更新事件格式有何变化?

使用 CSV

使用 CSV 时的配置样例如下所示:

  1. cdc cli changefeed create --server=http://127.0.0.1:8300 --changefeed-id="csv-test" --sink-uri="s3://bucket/prefix" --config changefeed.toml

changefeed.toml 文件内容如下:

  1. [sink]
  2. protocol = "csv"
  3. terminator = "\n"
  4. [sink.csv]
  5. delimiter = ','
  6. quote = '"'
  7. null = '\N'
  8. include-commit-ts = true

数据保存的事务性约束

  • 单个 CSV 文件中后一行数据的 commit-ts 大于等于前一行数据的 commit-ts。
  • 单表的同一事务不会存储在不同的 CSV 文件中。
  • 相同事务涉及的不同表会存储在不同的 CSV 文件中。

数据格式定义

CSV 文件中,单行的每一列定义如下:

  • 第一列:DML 操作指示符,取值包括 IUDI 表示 INSERTU 表示 UPDATED 表示 DELETE
  • 第二列:表名。
  • 第三列:库名。
  • 第四列:commit ts,即原始事务的 commit ts。该列为可选配置。
  • 第五列至最后一列:变更数据的列,可为一列或多列。

假设某张表 hr.employee 的定义如下:

  1. CREATE TABLE `employee` (
  2. `Id` int NOT NULL,
  3. `LastName` varchar(20) DEFAULT NULL,
  4. `FirstName` varchar(30) DEFAULT NULL,
  5. `HireDate` date DEFAULT NULL,
  6. `OfficeLocation` varchar(20) DEFAULT NULL
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

该表上的 DML 事件以 CSV 格式存储后如下所示:

  1. "I","employee","hr",433305438660591626,101,"Smith","Bob","2014-06-04","New York"
  2. "U","employee","hr",433305438660591627,101,"Smith","Bob","2015-10-08","Los Angeles"
  3. "D","employee","hr",433305438660591629,101,"Smith","Bob","2017-03-13","Dallas"
  4. "I","employee","hr",433305438660591630,102,"Alex","Alice","2017-03-14","Shanghai"
  5. "U","employee","hr",433305438660591630,102,"Alex","Alice","2018-06-15","Beijing"

数据类型映射

MySQL 类型CSV 类型示例描述
BOOLEAN/TINYINT/SMALLINT/INT/MEDIUMINT/BIGINTInteger123-
FLOAT/DOUBLEFloat153.123-
NULLNull\N-
TIMESTAMP/DATETIMEString“1973-12-30 15:30:00.123456”格式:yyyy-MM-dd HH:mm:ss.%06d
DATEString“2000-01-01”格式:yyyy-MM-dd
TIMEString“23:59:59”格式:HH:mm:ss
YEARInteger1970-
VARCHAR/JSON/TINYTEXT/MEDIUMTEXT/LONGTEXT/TEXT/CHARString“test”以 UTF-8 编码输出
VARBINARY/TINYBLOB/MEDIUMBLOB/LONGBLOB/BLOB/BINARYString“6Zi/5pav”以 Base64 编码输出
BITInteger81-
DECIMALString“129012.1230000”-
ENUMString“a”-
SETString“a,b”-