TiDB Lightning 支持从多种类型的文件导入数据到 TiDB 集群。通过以下配置为 TiDB Lightning 指定数据文件所在位置。

[mydumper] # 本地源数据目录或 S3 等外部存储 URL data-source-dir = "/data/my_database"

TiDB Lightning 运行时将查找 data-source-dir 中所有符合命令规则的文件。

文件类型 分类 命名规则
Schema 文件 包含 DDL 语句 CREATE TABLE 的文件 ${db_name}.${table_name}-schema.sql
Schema 文件 包含 CREATE DATABASE DDL 语句的文件 ${db_name}-schema-create.sql
数据文件 包含整张表的数据文件,该文件会被导入 ${db_name}.${table_name} 表 ${db_name}.${table_name}.${csv|sql|parquet}
数据文件 如果一个表分布于多个数据文件,这些文件命名需加上文件编号的后缀 ${db_name}.${table_name}.001.${csv|sql|parquet}

TiDB Lightning 尽量并行处理数据,由于文件必须顺序读取,所以数据处理协程是文件级别的并发(通过 region-concurrency 配置控制)。因此导入大文件时性能比较差。通常建议单个文件尺寸为 256MiB,以获得最好的性能。

CSV

表结构

CSV 文件是没有表结构的。要导入 TiDB,就必须为其提供表结构。可以通过以下任一方法实现:

  • 创建包含 DDL 语句的 ${db_name}.${table_name}-schema.sql 和 ${db_name}-schema-create.sql
  • 在 TiDB 中手动创建。

配置

CSV 格式可在 tidb-lightning.toml 文件中 [mydumper.csv] 下配置。大部分设置项在 MySQL [LOAD DATA] 语句中都有对应的项目。

[mydumper.csv] # 字段分隔符,支持一个或多个字符,默认值为 ','。如果数据中可能有逗号,建议源文件导出时分隔符使用非常见组合字符例如'|+|'。 separator = ',' # 引用定界符,设置为空表示字符串未加引号。 delimiter = '"' # 行尾定界字符,支持一个或多个字符。设置为空(默认值)表示 "\n"(换行)和 "\r\n" (回车+换行),均表示行尾。 terminator = "" # CSV 文件是否包含表头。 # 如果为 true,首行将会被跳过,且基于首行映射目标表的列。 header = true # CSV 是否包含 NULL。 # 如果为 true,CSV 文件的任何列都不能解析为 NULL。 not-null = false # 如果 `not-null` 为 false(即 CSV 可以包含 NULL), # 为以下值的字段将会被解析为 NULL。 null = '\N' # 是否解析字段内的反斜线转义符。 backslash-escape = true # 是否移除以分隔符结束的行。 trim-last-separator = false

对于诸如 separatordelimiter 和 terminator 等取值为字符串的配置项,如果需要设置的字符串中包含特殊字符,可以通过使用反斜杠 \ 转义的方式进行输入,输入的转义序列必须被包含在一对双引号 " 之间。例如,设置 separator = "\u001f" 表示使用 ASCII 字符 0X1F 作为字符串定界符。

你也可以使用单引号字符串 '...' 禁止对字符进行转义。

另外,设置 separator = '\n' 表示使用两个字符 \ + n 作为字符串定界符,而不是转义后的换行符 \n

更多详细的内容请参考 TOML v1.0.0 标准。

separator

  • 指定字段分隔符。

  • 可以为一个或多个字符,不能为空。

  • 常用值:

    • CSV 用 ','
    • TSV 用 "\t"
    • "\u0001" 表示使用 ASCII 字符 0x01
  • 对应 LOAD DATA 语句中的 FIELDS TERMINATED BY 项。

delimiter

  • 指定引用定界符。

  • 如果 delimiter 为空,所有字段都会被取消引用。

  • 常用值:

    • '"' 使用双引号引用字段,和 [RFC 4180] 一致。
    • '' 不引用
  • 对应 LOAD DATA 语句中的 FIELDS ENCLOSED BY 项。

参考 RFC 4180。

terminator

  • 指定行尾定界符。
  • 如果 terminator 为空,则 "\n"(换行)和 "\r\n" (回车+换行)均表示行尾。
  • 对应 LOAD DATA 语句中的 LINES TERMINATED BY 项。

header

  • 是否所有 CSV 文件都包含表头行。
  • 如为 true,第一行会被用作列名。如为 false,第一行并无特殊性,按普通的数据行处理。

not-null 和 null

  • not-null 决定是否所有字段不能为空。

  • 如果 not-null 为 false,设定了 null 的字符串会被转换为 SQL NULL 而非具体数值。

  • 引用不影响字段是否为空。

    例如有如下 CSV 文件:

    A,B,C \N,"\N",

    在默认设置(not-null = false; null = '\N')下,列 A and B 导入 TiDB 后都将会转换为 NULL。列 C 是空字符串 '',但并不会解析为 NULL。

backslash-escape

  • 是否解析字段内的反斜线转义符。

  • 如果 backslash-escape 为 true,下列转义符会被识别并转换。

    转义符 转换为
    \0 空字符 (U+0000)
    \b 退格 (U+0008)
    \n 换行 (U+000A)
    \r 回车 (U+000D)
    \t 制表符 (U+0009)
    \Z Windows EOF (U+001A)

    其他情况下(如 \")反斜线会被移除,仅在字段中保留其后面的字符("),这种情况下,保留的字符仅作为普通字符,特殊功能(如界定符)都会失效。

  • 引用不会影响反斜线转义符的解析与否。

  • 对应 LOAD DATA 语句中的 FIELDS ESCAPED BY '\' 项。

trim-last-separator

  • 将 separator 字段当作终止符,并移除尾部所有分隔符。

    例如有如下 CSV 文件:

    A,,B,,

  • 当 trim-last-separator = false,该文件会被解析为包含 5 个字段的行 ('A', '', 'B', '', '')

  • 当 trim-last-separator = true,该文件会被解析为包含 3 个字段的行 ('A', '', 'B')

  • 此配置项已被弃用,建议使用兼容性更好的 terminator

    如果有如下旧的配置:

    separator = ',' trim-last-separator = true

    建议修改为:

    separator = ',' terminator = ",\n" # 请根据文件实际使用的换行符指定为 ",\n" 或 ",\r\n"

不可配置项

TiDB Lightning 并不完全支持 LOAD DATA 语句中的所有配置项。例如:

  • 不可使用行前缀 (LINES STARTING BY)。
  • 不可跳过表头 (IGNORE n LINES)。如有表头,必须是有效的列名。

启用严格格式

导入文件的大小统一约为 256 MB 时,TiDB Lightning 可达到最佳工作状态。如果导入单个 CSV 大文件,TiDB Lightning 只能使用一个线程来处理,这会降低导入速度。

要解决此问题,可先将 CSV 文件分割为多个文件。对于通用格式的 CSV 文件,在没有读取整个文件的情况下无法快速确定行的开始和结束位置。因此,默认情况下 TiDB Lightning 不会自动分割 CSV 文件。但如果你确定待导入的 CSV 文件符合特定的限制要求,则可以启用 strict-format 设置。启用后,TiDB Lightning 会将单个 CSV 大文件分割为单个大小为 256 MB 的多个文件块进行并行处理。

[mydumper] strict-format = true

严格格式的 CSV 文件中,每个字段仅占一行,即必须满足以下条件之一:

  • delimiter 为空;
  • 每个字段不包含 terminator 对应的字符串。在默认配置下,对应每个字段不包含 CR (\r)或 LF(\n)。

如果 CSV 文件不是严格格式但 strict-format 被误设为 true,跨多行的单个完整字段会被分割成两部分,导致解析失败,甚至不报错地导入已损坏的数据。

常见配置示例

CSV

默认设置已按照 RFC 4180 调整。

[mydumper.csv] separator = ',' # 如果数据中可能有逗号,建议源文件导出时分隔符使用非常见组合字符例如'|+|' delimiter = '"' header = true not-null = false null = '\N' backslash-escape = true

示例内容:

ID,Region,Count 1,"East",32 2,"South",\N 3,"West",10 4,"North",39

TSV

[mydumper.csv] separator = "\t" delimiter = '' header = true not-null = false null = 'NULL' backslash-escape = false

示例内容:

ID Region Count 1 East 32 2 South NULL 3 West 10 4 North 39

TPC-H DBGEN

[mydumper.csv] separator = '|' delimiter = '' terminator = "|\n" header = false not-null = true backslash-escape = false

示例内容:

1|East|32| 2|South|0| 3|West|10| 4|North|39|

SQL

TiDB Lightning 在处理 SQL 文件时,由于无法对单个文件进行快速分割,因此无法通过增加并发提高单个文件的导入速度。鉴于此,导出数据为 SQL 文件时应尽量避免单个 SQL 文件过大,通常单文件在 256MiB 左右可以达到最佳性能。

Parquet

TiDB Lightning 目前仅支持由 Amazon Aurora 导出快照生成的 Parquet 文件。要识别其在 S3 的文件组织形式,需要使用如下配置匹配到所有的数据文件:

[[mydumper.files]] # 解析 AWS Aurora parquet 文件所需的表达式 pattern = '(?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$' schema = '$1' table = '$2' type = '$3'

注意,此处仅说明 Aurora snapshot 导出的 parquet 文件如何匹配。Schema 文件需要单独导出及处理。

关于 mydumper.files,请参考自定义文件匹配。

自定义文件匹配

TiDB Lightning 仅识别符合命名要求的数据文件,但在某些情况下已提供的数据文件并不符合要求,因此可能出现 TiDB Lightning 在极短的时间结束,处理文件数量为 0 的情况。

为了解决此类问题,TiDB Lightning 提供了 [[mydumper.files]] 配置用于通过自定义表达式匹配数据文件。

以 AWS Aurora 导出至 S3 的快照文件为例,Parquet 文件的完整路径为:S3://some-bucket/some-subdir/some-database/some-database.some-table/part-00000-c5a881bb-58ff-4ee6-1111-b41ecff340a3-c000.gz.parquet

通常 data-source-dir 会被配置为S3://some-bucket/some-subdir/some-database/ 以导入 some-database 库。

根据上述 Parquet 文件的路径,你可以编写正则表达式 (?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$,得到的 match group 中 index=1 的内容为 some-database ,index=2 的内容为 some-table,index=3 的内容为 parquet

根据上述正则表达式及相应的 index 编写配置文件,TiDB Lightning 即可识别非默认命名规则的文件,最终实际配置如下:

[[mydumper.files]] # 解析 AWS Aurora parquet 文件所需的表达式 pattern = '(?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$' schema = '$1' table = '$2' type = '$3'

  • schema:目标库名称,值可以为:

    • 正则表达式匹配到的 group 序号,例如 “$1”。
    • 直接填写期望导入的库名,例如 “db1”。所有匹配到的文件均会导入 “db1”。
  • table:目标表名称,值可以为:
    • 正则表达式匹配到的 group 序号,例如 “$2”。
    • 直接填写期望导入的库名,例如“table1”。所有匹配到的文件均会导入“table1”。
  • type:文件类型,支持sqlparquetcsv,值可以为:
    • 正则表达式匹配到的 group 序号,例如 “$3”。
  • key:文件的序号,即前文所述${db_name}.${table_name}.001.csv中的001
    • 正则表达式匹配到的 group 序号,例如 “$4”。

TiDB Lightning 数据源相关推荐

  1. TiDB Lightning 故障处理

    本文档总结了使用 TiDB Lightning 过程中常见的运行故障及解决方案. TiDB Lightning 导入速度太慢 TiDB Lightning 的正常速度为每条线程每 2 分钟导入一个 2 ...

  2. TiDB Lightning 常见问题

    本文列出了一些使用 TiDB Lightning 时可能会遇到的问题与答案. TiDB Lightning 对 TiDB/TiKV/PD 的最低版本要求是多少? TiDB Lightning 的版本应 ...

  3. TiDB Lightning 快速上手

    本教程假设使用的是若干新的.纯净版 CentOS 7 实例,你可以(使用 VMware.VirtualBox 及其他工具)在本地虚拟化或在供应商提供的平台上部署一台小型的云虚拟主机.因为 TiDB L ...

  4. TiDB Lightning 断点续传

    大量的数据导入一般耗时数小时至数天,长时间运行的进程会有一定机率发生非正常中断.如果每次重启都从头开始,就会浪费掉之前已成功导入的数据.为此,TiDB Lightning 提供了"断点续传& ...

  5. 探索TiDB Lightning源码来解决发现的bug

    背景 上一篇<记一次简单的Oracle离线数据迁移至TiDB过程>说到在使用Lightning导入csv文件到TiDB的时候发现了一个bug,是这样一个过程. Oracle源库中表名都是大 ...

  6. 部署 TiDB Lightning

    本文主要介绍 TiDB Lightning 进行数据导入的硬件需求,以及手动部署 TiDB Lightning 的方式.Lightning 不同的导入模式,其硬件要求有所不同,请先阅读: Physic ...

  7. TiDB Lightning 简介

    TiDB Lightning 是用于从静态文件导入 TB 级数据到 TiDB 集群的工具,常用于 TiDB 集群的初始化数据导入. 要快速了解 Lightning 的基本原理和使用方法,建议先观看下面 ...

  8. TiDB在360云平台的落地

    女主宣言 当一张百亿数据量的表放在你面前,你将面临着什么?加列?哭吧,怎么也得等个几天甚至几周.加索引?哭吧,不论你用 pt-online-schema,还是 gh-ost,你都面临着拷贝一张临时表用 ...

  9. 为什么我们要从MySQL迁移到TiDB?(转)

    为什么我们要从MySQL迁移到TiDB? Nicolas • 发表于2020-03-12 10:49:38 • 2739次阅读 [51CTO.com原创稿件]当一张百亿数据量的表放在你面前,你将面临着 ...

最新文章

  1. Win7系统中同时安装了python2.x和python3.x,如何设置默认启动的python版本
  2. 解决Maven依赖冲突的好帮手,必须了解一下!
  3. 多模块的maven项目,执行 install/deploy 指令时,排除指定module
  4. python函数调用自身后果_python 写函数在一定条件下需要调用自身时的写法说明...
  5. web自动化测试第12步:selenium中下拉框的解决方法(Select)
  6. matlab角点坐标获取,MatLab角点检测(harris经典程序) | 学步园
  7. python pyttsx3文本转语音_Python-文字转语音-pyttsx3
  8. Python Flask Web 第六课 —— 静态文件
  9. Ubuntu18.04上AS运行模拟器报错:/dev/kvm device: permission denied
  10. 1、http网络编程——URL、CURL、CURLcode和curl_slist
  11. 安卓签名MD5相关说明
  12. Kubernetes API的流编解码器StreamSerializer
  13. macOS:删除 MDM 配置描述文件
  14. css代码实现3D动画翻转 - 鱿鱼游戏卡片制作
  15. Axure预览样式错误混乱
  16. ijkplayer编译生成aar,支持https,rtsp,录制与截图
  17. U盘中毒了,里面重要的文件夹不见了怎么办?
  18. django+vue3实现websocket聊天室(群聊)
  19. c#+sql语言开发的小区物业管理系统,基于C#环境下的物业管理系统.doc
  20. MPI部署踩坑实况!!!最终成功跑通梯形面积法!!!精准全流程命令+各步骤报错解决方案!!!

热门文章

  1. oracle 把西历转换成日本年号
  2. 程序员:伤不起的三十岁
  3. flash and .net
  4. cs架构接口协议(常用socket协议)与bs架构接口协议(常用http协议)
  5. Java用ssm开发家教系统家教网站家教兼职系统功能很齐全
  6. MVC架构 使用FastReport
  7. android休眠wifi不关闭吗,Android之WIFI在休眠时不断开的代码实现
  8. Ensp测试配置两个ip段互通
  9. 【转载】一个小时学会MySQL数据库
  10. 开发板上正方形(梯形)的接口是什么?原来是usb接口的一种