使用 Dumpling 和 TiDB Lightning 备份与恢复

本文档介绍如何使用 Dumpling 和 TiDB Lightning 进行全量备份与恢复。

在备份与恢复场景中,如果需要全量备份少量数据(例如小于 50 GB),且不要求备份速度,你可以使用 Dumpling 从 TiDB 数据库导出数据进行备份,再使用 TiDB Lightning 将数据导入至 TiDB 数据库实现恢复。更多备份与恢复的相关信息,参见使用 BR 备份集群使用 BR 恢复集群

前提条件

资源要求

操作系统:本文档示例使用的是若干新的、纯净版 CentOS 7 实例,你可以在本地虚拟化一台主机,或在供应商提供的平台上部署一台小型的云虚拟主机。TiDB Lightning 运行过程中,默认会占满 CPU,建议单独部署在一台主机上。如果条件不允许,你可以将 TiDB Lightning 和其他组件(比如 tikv-server)部署在同一台机器上,然后设置 region-concurrency 配置项的值为逻辑 CPU 数的 75%,以限制 TiDB Lightning 对 CPU 资源的使用。

内存和 CPU:因为 TiDB Lightning 对计算机资源消耗较高,建议分配 64 GB 以上的内存以及 32 核以上的 CPU,而且确保 CPU 核数和内存 (GB) 比为 1:2 以上,以获取最佳性能。

磁盘空间

推荐使用 Amazon S3、Google Cloud Storage (GCS) 和 Azure Blob Storage 等外部存储,以便能够快速存储备份文件,且不受磁盘空间限制。

如果需要保存单次备份数据到本地磁盘,需要注意以下磁盘空间限制:

  • Dumpling 需要能够储存整个数据源的存储空间,即可以容纳要导出的所有上游表的空间。计算方式参考下游数据库所需空间
  • TiDB Lightning 导入期间,需要临时空间来存储排序键值对,磁盘空间需要至少能存储数据源的最大单表。

说明:目前无法精确计算 Dumpling 从 TiDB 导出的数据大小,但你可以用下面 SQL 语句统计信息表的 data_length 字段估算数据量:

  1. /* 统计所有 schema 大小,单位 MiB,注意修改 ${schema_name} */
  2. SELECT table_schema,SUM(data_length)/1024/1024 AS data_length,SUM(index_length)/1024/1024 AS index_length,SUM(data_length+index_length)/1024/1024 AS SUM FROM information_schema.tables WHERE table_schema = "${schema_name}" GROUP BY table_schema;
  3. /* 统计最大单表,单位 MiB,注意修改 ${schema_name} */
  4. SELECT table_name,table_schema,SUM(data_length)/1024/1024 AS data_length,SUM(index_length)/1024/1024 AS index_length,SUM(data_length+index_length)/1024/1024 AS SUM from information_schema.tables WHERE table_schema = "${schema_name}" GROUP BY table_name,table_schema ORDER BY SUM DESC LIMIT 5;

目标 TiKV 集群的磁盘空间要求

目标 TiKV 集群必须有足够空间接收新导入的数据。除了标准硬件配置以外,目标 TiKV 集群的总存储空间必须大于数据源大小 × 副本数量 × 2。例如,集群默认使用 3 副本,那么总存储空间需为数据源大小的 6 倍以上。公式中的 2 倍可能难以理解,其依据是以下因素的估算空间占用:

  • 索引会占据额外的空间。
  • RocksDB 的空间放大效应。

使用 Dumpling 备份全量数据

  1. 运行以下命令,从 TiDB 导出全量数据至 Amazon S3 存储路径 s3://my-bucket/sql-backup?region=us-west-2

    1. tiup dumpling -h ${ip} -P 3306 -u root -t 16 -r 200000 -F 256MiB -B my_db1 -f 'my_db1.table[12]' -o 's3://my-bucket/sql-backup?region=us-west-2'

    Dumpling 默认导出数据格式为 SQL 文件,你也可以通过设置 --filetype 指定导出文件的类型。

    关于更多 Dumpling 的配置,请参考 Dumpling 主要选项表

  2. 导出完成后,可以在数据存储目录 s3://my-bucket/sql-backup?region=us-west-2 查看导出的备份文件。

使用 TiDB Lightning 恢复全量数据

  1. 编写配置文件 tidb-lightning.toml,将 Dumpling 备份的全量数据从 s3://my-bucket/sql-backup?region=us-west-2 恢复到目标 TiDB 集群:

    1. [lightning]
    2. # 日志
    3. level = "info"
    4. file = "tidb-lightning.log"
    5. [tikv-importer]
    6. # "local":默认使用该模式,适用于 TB 级以上大数据量,但导入期间下游 TiDB 无法对外提供服务。
    7. # "tidb":TB 级以下数据量也可以采用`tidb`后端模式,下游 TiDB 可正常提供服务。 关于后端模式更多信息请参阅:https://docs.pingcap.com/tidb/stable/tidb-lightning-backends
    8. backend = "local"
    9. # 设置排序的键值对的临时存放地址,目标路径必须是一个空目录,目录空间须大于待导入数据集的大小。建议设为与 `data-source-dir` 不同的磁盘目录并使用闪存介质,独占 IO 会获得更好的导入性能
    10. sorted-kv-dir = "${sorted-kv-dir}"
    11. [mydumper]
    12. # 源数据目录,即上一章节中 Dumpling 保存数据的路径。
    13. data-source-dir = "${data-path}" # 本地或 S3 路径,例如:'s3://my-bucket/sql-backup?region=us-west-2'
    14. [tidb]
    15. # 目标集群的信息
    16. host = ${host} # 例如:172.16.32.1
    17. port = ${port} # 例如:4000
    18. user = "${user_name}" # 例如:"root"
    19. password = "${password}" # 例如:"rootroot"
    20. status-port = ${status-port} # 导入过程 Lightning 需要在从 TiDB 的“状态端口”获取表结构信息,例如:10080
    21. pd-addr = "${ip}:${port}" # 集群 PD 的地址,Lightning 通过 PD 获取部分信息,例如 172.16.31.3:2379。当 backend = "local" 时 status-port 和 pd-addr 必须正确填写,否则导入将出现异常。

    关于更多 TiDB Lightning 的配置,请参考 TiDB Lightning 配置参数

  2. 运行 tidb-lightning。如果直接在命令行中启动程序,可能会因为 SIGHUP 信号而退出,建议配合 nohupscreen 等工具,如:

    若从 S3 导入,则需将有权限访问该 Amazon S3 后端存储的账号的 SecretKey 和 AccessKey 作为环境变量传入 Lightning 节点。同时还支持从 ~/.aws/credentials 读取凭证文件。

    1. export AWS_ACCESS_KEY_ID=${access_key}
    2. export AWS_SECRET_ACCESS_KEY=${secret_key}
    3. nohup tiup tidb-lightning -config tidb-lightning.toml > nohup.out 2>&1 &
  3. 导入开始后,可以通过 grep 日志关键字 progress 查看进度,默认 5 分钟更新一次。

  4. 导入完毕后,TiDB Lightning 会自动退出。查看 tidb-lightning.log 日志末尾是否有 the whole procedure completed,如果有,数据导入成功,恢复完成。如果没有,则表示导入遇到了问题,可根据日志中的 error 提示解决遇到的问题。

注意:

无论导入成功与否,最后一行都会显示 tidb lightning exit。它只是表示 TiDB Lightning 正常退出,不代表恢复任务完成。

如果恢复过程中遇到问题,请参见 TiDB Lightning 常见问题