本文介绍从 TiDB-A 库导出数据到 TiDB-B 库;
导出
Dumpling 包含在 tidb-toolkit 安装包中,可在此下载。
从 TiDB/MySQL 导出数据
需要的权限
- SELECT
- RELOAD
- LOCK TABLES
- REPLICATION CLIENT
导出到 sql 文件
先贴命令
- nohup /home/service/var/data/tidb-util/dumpling \
- -h IP地址 \
- -P 端口 \
- -u 用户名 \
- -p 密码 \
- --filetype sql \
- --threads 32 \
- --rows 1000 \
- --params "tidb_distsql_scan_concurrency=5,tidb_mem_quota_query=8589934592" \
- -o /home/service/var/data/tidb-util/pull_db \
- --filter "库名.*" \
- -F 1GiB > /home/service/var/data/tidb-util/logs/pull_log.log 2>&1 &
等同于
nohup /home/service/var/data/tidb-util/dumpling -u 用户名 -P 端口 -p 密码 -h IP地址 --filetype sql --threads 32 --rows 1000 --params "tidb_distsql_scan_concurrency=5,tidb_mem_quota_query=8589934592" -o /home/service/var/data/tidb-util/pull_db --filter "库名.*" -F 1GiB > /home/service/var/data/tidb-util/logs/pull_log.log 2>&1 &
这个命令中有一些参数,释义如下:
参数 Key | 释义 | 说明 |
---|---|---|
-u | 用户名 | |
-p | 密码 | |
-h 或 --host | IP地址 | 这里注意,需要使用TiDB管理后台的 Cluster Info 中的IP地址 |
-P | 端口 | 一般情况都是4000 |
--filetype | 导出类型 | 目前本文演示的是导出 sql |
-t 或 --threads | dumpling 并发线程数 | |
-r 或 --rows | 将 table 划分成 row 行数据,一般针对大表操作并发生成多个文件。 | 举个栗子,例如某个大数据量的表,单行数据库结构设计最大是 1Kb 那这里划分10000000的话,单次使用的就是 9.5367431640625G 的内存 它消耗的是 TiDB 服务器的内存!如果单表过大会使 TiDB 服务器产生 OOM |
tidb_distsql_scan_concurrency | 导出时的 session 变量 | 减少 TiDB scan 操作的并发度 |
tidb_mem_quota_query | 该参数默认为 32GB,可控制 TiDB 单条查询语句的内存使用。 | 如果有超大的表,遇到了 TiDB OOM 问题,建议调整这个参数到 8589934592 (8GB) 或更小 |
-o 或 --output | 导出文件路径 | |
-f 或 --filter | 导出能匹配模式的表 | *.* (导出所有库表),xxx.*(导出 xxx 库的所有表) |
-F 或 --filesize | 将 table 数据划分出来的文件大小 | 需指明单位(如 |
静静等待导出成功。我在这个过程中遇到了 OOM 问题,表象就是导出日志显示如下内容
- [mysql] 2021/02/08 11:47:18 packets.go:36: unexpected EOF
- [mysql] 2021/02/08 11:47:18 packets.go:122: closing bad idle connection: EOF
- [mysql] 2021/02/08 11:47:18 packets.go:122: closing bad idle connection: EOF
- [2021/02/08 11:47:18.558 +08:00] [ERROR] [main.go:230] ["dump failed error stack info"] [error="invalid connection"] [stack="main.main\n\t/home/jenkins/agent/workspace/ild_dumpling_multi_branch_v4.0.8/go/src/github.com/pingcap/dumpling/cmd/dumpling/main.go:230\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:203"]
-
- dump failed: invalid connection
这是因为 Dumpling 导出 TiDB 较大单表时,可能会因为导出数据过大导致 TiDB 内存溢出 (OOM),从而使连接中断导出失败。可以通过以下参数减少 TiDB 的内存使用。
- 设置
--rows
参数,可以划分导出数据区块减少 TiDB 扫描数据的内存开销,同时也可开启表内并发提高导出效率。 - 调小
--tidb-mem-quota-query
参数到8589934592
(8GB) 或更小。该参数默认为 32GB,可控制 TiDB 单条查询语句的内存使用。 - 调整
--params "tidb_distsql_scan_concurrency=5"
参数,即设置导出时的 session 变量 tidb_distsql_scan_concurrency 从而减少 TiDB scan 操作的并发度。
导入
部署 tidb-lightning 过程就不赘述了,可以看文档 https://docs.pingcap.com/zh/tidb/stable/deploy-tidb-lightning
第一步,配置 tidb-lightning.toml
。对于没有出现在下述模版中的配置,TiDB Lightning 给出配置错误的提醒并退出。sorted-kv-dir
需要设置为一个空的目录,并且确保所在的磁盘有较多空闲的空间。
- [lightning]
-
- # 日志
- level = "debug"
- file = "/home/service/var/data/tidb-util/push_log.log"
-
- [checkpoint]
- enable = true
- # 存储断点的数据库名称。
- schema = "tidb_lightning_checkpoint"
- # 存储断点的方式。
- # - file:存放在本地文件系统。
- # - mysql:存放在兼容 MySQL 的数据库服务器。
- driver = "file"
-
- [tikv-importer]
- # backend 设置为 local 模式
- backend = "local"
- # 设置本地临时存储路径
- sorted-kv-dir = "/home/service/var/data/tidb-util/sorted-kv-dir"
-
- [mydumper]
- # Mydumper 源数据目录。
- data-source-dir = "/home/service/var/data/tidb-util/pull_db"
-
- [tidb]
- # 目标集群的信息。tidb-server 的监听地址,填一个即可。
- # 这里注意,需要使用TiDB管理后台的 Cluster Info 中的 TiDB IP 地址
- host = "1.1.1.1"
- port = 4000
- user = "用户名"
- password = "密码"
- # 表架构信息在从 TiDB 的“状态端口”获取。
- status-port = 10080
- # pd-server 的地址,填一个即可
- # 这里注意,需要使用TiDB管理后台的 Cluster Info 中的 PD 信息
- pd-addr = "1.1.1.1:2379"
第二步,运行 tidb-lightning
。如果直接在命令行中用 nohup
启动程序,可能会因为 SIGHUP 信号而退出,建议把 nohup
放到脚本里面,新建一个 shell 文件放在和 tidb-lightning 同级的目录,如:
- #!/usr/bin/env bash
- nohup ./tidb-lightning -config /home/service/var/data/tidb-util/conf/push.toml > /home/service/var/data/tidb-util/logs/start_push_log.log &
第三步,执行 sh start_push.sh
静静等待导入成功的日志打印