Loader 使用文档

Loader 是什么

是由 PingCAP 开发的数据导入工具,可以用于向 TiDB 中导入数据。

Binary 下载

为什么我们要做这个东西

当数据量比较大的时候,如果用 mysqldump 这样的工具迁移数据会比较慢。我们尝试了 mydumper/myloader 套件,能够多线程导出和导入数据。在使用过程中,mydumper 问题不大,但是 myloader 由于缺乏出错重试、断点续传这样的功能,使用起来很不方便。所以我们开发了 loader,能够读取 mydumper 的输出数据文件,通过 MySQL protocol 向 TiDB/MySQL 中导入数据。

Loader 有哪些优点

  • 多线程导入

  • 支持表级别的并发导入,分散写入热点

  • 支持对单个大表并发导入,分散写入热点

  • 支持 mydumper 数据格式

  • 出错重试

  • 断点续导

  • 通过 system variable 优化 TiDB 导入数据速度

使用方法

注意事项

请勿使用 loader 导入 MySQL 实例中 mysql 系统数据库到下游 TiDB。

如果 mydumper 使用 -m 参数,会导出不带表结构的数据,这时 loader 无法导入数据。

如果使用默认的 checkpoint-schema 参数,在导完一个 database 数据库后,请 drop database tidb_loader 后再开始导入下一个 database。

推荐数据库开始导入的时候,明确指定 checkpoint-schema = "tidb_loader" 参数。

参数说明

  1. -L string
  2. log 级别设置,可以设置为 debug, info, warn, error, fatal (默认为 "info")
  3. -P int
  4. TiDB/MySQL 的端口 (默认为 4000)
  5. -V
  6. 打印 loader 版本
  7. -c string
  8. 指定配置文件启动 loader
  9. -checkpoint-schema string
  10. checkpoint 数据库名,loader 在运行过程中会不断的更新这个数据库,在中断并恢复后,会通过这个库获取上次运行的进度 (默认为 "tidb_loader")
  11. -d string
  12. 需要导入的数据存放路径 (default "./")
  13. -h string
  14. TiDB 服务 host IP (default "127.0.0.1")
  15. -p string
  16. TiDB 账户密码
  17. -pprof-addr string
  18. Loader pprof 地址,用于对 Loader 进行性能调试 (默认为 ":10084")
  19. -t int
  20. 线程数 (默认为 16). 每个线程同一时刻只能操作一个数据文件。
  21. -u string
  22. TiDB 的用户名 (默认为 "root")

配置文件

除了使用命令行参数外,还可以使用配置文件来配置,配置文件的格式如下:

  1. # 日志输出等级;可以设置为 debug, info, warn, error, fatal (默认为 "info")
  2. log-level = "info"
  3. # 指定 loader 日志目录
  4. log-file = "loader.log"
  5. # 需要导入的数据存放路径 (default "./")
  6. dir = "./"
  7. # Loader 的 pprof 地址,用于对 Loader 进行性能调试 (默认为 ":10084")
  8. pprof-addr = "127.0.0.1:10084"
  9. # checkpoint 数据库名,loader 在运行过程中会不断的更新这个数据库,在中断并恢复后,
  10. # 会通过这个库获取上次运行的进度 (默认为 "tidb_loader")
  11. checkpoint-schema = "tidb_loader"
  12. # 线程数 (默认为 16). 每个线程同一时刻只能操作一个数据文件。
  13. pool-size = 16
  14. # 目标数据库信息
  15. [db]
  16. host = "127.0.0.1"
  17. user = "root"
  18. password = ""
  19. port = 4000
  20. # sharding 同步规则,采用 wildcharacter
  21. # 1\. 星号字符 (*) 可以匹配零个或者多个字符,
  22. # 例子, doc* 匹配 doc 和 document, 但是和 dodo 不匹配;
  23. # 星号只能放在 pattern 结尾,并且一个 pattern 中只能有一个
  24. # 2\. 问号字符 (?) 匹配任一一个字符
  25. # [[route-rules]]
  26. # pattern-schema = "shard_db_*"
  27. # pattern-table = "shard_table_*"
  28. # target-schema = "shard_db"
  29. # target-table = "shard_table"

使用示例

通过命令行参数:

  1. ./bin/loader -d ./test -h 127.0.0.1 -u root -P 4000

或者使用配置文件 “config.toml”:

  1. ./bin/loader -c=config.toml

FAQ

合库合表场景案例说明

根据配置文件的 route-rules 可以支持将分库分表的数据导入到同一个库同一个表中,但是在开始前需要检查分库分表规则:

  • 是否可以利用 route-rules 的语义规则表示
  • 分表中是否包含唯一递增主键,或者合并后是否包含数据上有冲突的唯一索引或者主键

Loader 需要配置文件中开启 route-rules 参数以提供合库合表功能

  • 如果使用该功能,必须填写 pattern-schematarget-schema
  • 如果 pattern-tabletarget-table 为空,将不进行表名称合并或转换
  1. [[route-rules]]
  2. pattern-schema = "example_db"
  3. pattern-table = "table_*"
  4. target-schema = "example_db"
  5. target-table = "table"