本文简要介绍了TiDB工具生态中的数据导出工具Dumpling和数据快速导入工具Lightning,并结合场景进行测试使用。
Dumpling是go语言开发的数据备份工具,可以将TiDB/MySQL中的数据导出为SQL/CSV格式,可以实现逻辑上的全量备份或者导出。Dumpling针对TiDB进行了专门的优化,比如:
在使用Dumpling时,需要在已经启动的集群上执行导出命令
[root@tango-01 tidb-toolkit]# tiup cluster display tidb-test Starting component `cluster`: /root/.tiup/components/cluster/v1.2.3/tiup-cluster display tidb-test Cluster type: tidb Cluster name: tidb-test Cluster version: v4.0.0 SSH type: builtin ID Role Host Ports OS/Arch Status Data Dir Deploy Dir -- ---- ---- ----- ------- ------ -------- ---------- 192.168.112.10:9093 alertmanager 192.168.112.10 9093/9094 linux/x86_64 Up /tidb-data/alertmanager-9093 /tidb-deploy/alertmanager-9093 192.168.112.10:3000 grafana 192.168.112.10 3000 linux/x86_64 Up - /tidb-deploy/grafana-3000 192.168.112.101:2379 pd 192.168.112.101 2379/2380 linux/x86_64 Up /tidb-data/pd-2379 /tidb-deploy/pd-2379 192.168.112.102:2379 pd 192.168.112.102 2379/2380 linux/x86_64 Up|L|UI /tidb-data/pd-2379 /tidb-deploy/pd-2379 192.168.112.103:2379 pd 192.168.112.103 2379/2380 linux/x86_64 Up /tidb-data/pd-2379 /tidb-deploy/pd-2379 192.168.112.10:9090 prometheus 192.168.112.10 9090 linux/x86_64 Up /tidb-data/prometheus-9090 /tidb-deploy/prometheus-9090 192.168.112.101:4000 tidb 192.168.112.101 4000/10080 linux/x86_64 Up - /tidb-deploy/tidb-4000 192.168.112.102:4000 tidb 192.168.112.102 4000/10080 linux/x86_64 Up - /tidb-deploy/tidb-4000 192.168.112.103:4000 tidb 192.168.112.103 4000/10080 linux/x86_64 Up - /tidb-deploy/tidb-4000 192.168.112.101:20160 tikv 192.168.112.101 20160/20180 linux/x86_64 Up /tidb-data/tikv-20160 /tidb-deploy/tikv-20160 192.168.112.102:20160 tikv 192.168.112.102 20160/20180 linux/x86_64 Up /tidb-data/tikv-20160 /tidb-deploy/tikv-20160 192.168.112.103:20160 tikv 192.168.112.103 20160/20180 linux/x86_64 Up /tidb-data/tikv-20160 /tidb-deploy/tikv-20160 Total nodes: 12
所有通过Dumpling导出的数据都可以通过Lightning导入到TiDB中。
TiDB工具包中包括了TiDB Binlog、TiDB Lightning、BR备份恢复工具、TiDB Data Migration、Dumpling等,下载链接为https://download.pingcap.org/tidb-toolkit-{version}-linux-amd64.tar.gz
[root@tango-01 src]# tar -xzvf tidb-toolkit-v4.0.10-linux-amd64.tar.gz [root@tango-01 src]# mv tidb-toolkit-v4.0.10-linux-amd64 ../tidb-toolkit [root@tango-01 bin]# ls br dumpling mydumper pd-tso-bench sync_diff_inspector tidb-lightning tidb-lightning-ctl tikv-importer
1)导出到SQL文件
Dumpling默认导出数据格式为sql文件,可以通过设置–filetype sql导出数据到sql文件:
[root@tango-01 tidb-toolkit]# ./bin/dumpling -u root -P4000 -h192.168.112.101 --filetype sql --threads 32 -o /tmp/test -F 256MiB
2)输出文件格式
[root@tango-01 test]# cat metadata Started dump at: 2021-02-14 14:38:30 SHOW MASTER STATUS: Log: tidb-binlog Pos: 422912907133583361 GTID: Finished dump at: 2021-02-14 14:38:33
[root@tango-01 test]# cat tango-schema-create.sql /*!40101 SET NAMES binary*/; CREATE DATABASE `tango` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; [root@tango-01 test]# cat tango.tab_tidb-schema.sql /*!40101 SET NAMES binary*/; CREATE TABLE `tab_tidb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL DEFAULT '', `age` int(11) NOT NULL DEFAULT 0, `version` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `idx_age` (`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30002;
[root@tango-01 test]# cat tango.tab_tidb.000000000.sql /*!40101 SET NAMES binary*/; INSERT INTO `tab_tidb` VALUES (1,'TiDB',5,'TiDB-v4.0.0');
3)导出到CSV文件
[root@tango-01 tidb-toolkit]# ./bin/dumpling -u root -P4000 -h192.168.112.101 --filetype csv --threads 32 -o /tmp/test1 --sql 'select * from tango.tab_tidb'
4)输出文件格式
[root@tango-01 test1]# cat metadata Started dump at: 2021-02-14 14:48:46 SHOW MASTER STATUS: Log: tidb-binlog Pos: 422913068470108161 GTID: Finished dump at: 2021-02-14 14:48:47
[root@tango-01 test1]# cat result.000000000.csv "id","name","age","version" 1,"TiDB",5,"TiDB-v4.0.0"
1)使用 --where 选项筛选数据
默认情况下,Dumpling会导出系统数据库(包括 mysql 、sys 、INFORMATION_SCHEMA 、PERFORMANCE_SCHEMA、METRICS_SCHEMA 和 INSPECTION_SCHEMA)外所有其他数据库。可以使用 --where 来选定要导出的记录,比如:
[root@tango-01 tidb-toolkit]# ./bin/dumpling -u root -P4000 -h192.168.112.101 --threads 32 -o /tmp/test1 --where "id < 10"
上述命令将会导出各个表的 id < 10 的数据
[root@tango-01 test1]# ll total 32 -rw-r--r-- 1 root root 146 Feb 14 15:05 metadata -rw-r--r-- 1 root root 53 Feb 14 14:48 result.000000000.csv -rw-r--r-- 1 root root 96 Feb 14 15:05 tango-schema-create.sql -rw-r--r-- 1 root root 194 Feb 14 15:05 tango.tab01.000000000.sql -rw-r--r-- 1 root root 237 Feb 14 15:05 tango.tab01-schema.sql -rw-r--r-- 1 root root 311 Feb 14 15:05 tango.tab_tidb.000000000.sql -rw-r--r-- 1 root root 346 Feb 14 15:05 tango.tab_tidb-schema.sql -rw-r--r-- 1 root root 95 Feb 14 15:05 test-schema-create.sql [root@tango-01 test1]# [root@tango-01 test1]# cat tango.tab01.000000000.sql /*!40101 SET NAMES binary*/; INSERT INTO `tab01` VALUES (1,'Beijing'), (2,'Shanghai'), (3,'Guangzhou'), (4,'Shenzhen'), (5,'Foshan'), (6,'Hangzhou'), (7,'Chengdu'), (8,'Wuhan'), (9,'Changsha'); [root@tango-01 test1]# cat tango.tab_tidb.000000000.sql /*!40101 SET NAMES binary*/; INSERT INTO `tab_tidb` VALUES (1,'TiDB',5,'TiDB-v4.0.0'), (2,'TiDB',5,'TiDB-v4.0.0'), (3,'TiDB',5,'TiDB-v4.0.0'), (4,'TiDB',5,'TiDB-v4.0.0'), (5,'TiDB',5,'TiDB-v4.0.0'), (6,'TiDB',5,'TiDB-v4.0.0'), (7,'TiDB',5,'TiDB-v4.0.0'), (8,'TiDB',5,'TiDB-v4.0.0'), (9,'TiDB',5,'TiDB-v4.0.0');
2)使用–filter选项筛选数据
Dumpling可以通过–filter指定table-filter来筛选特定的库表
[root@tango-01 tidb-toolkit]# ./bin/dumpling -u root -P4000 -h192.168.112.101 --threads 32 -o /tmp/test2 --filter "*.tab01"
上述命令将会导出所有数据库中的tab01表
[root@tango-01 test2]# ll total 36 -rw-r--r-- 1 root root 109 Feb 14 15:09 INFORMATION_SCHEMA-schema-create.sql -rw-r--r-- 1 root root 146 Feb 14 15:09 metadata -rw-r--r-- 1 root root 105 Feb 14 15:09 METRICS_SCHEMA-schema-create.sql -rw-r--r-- 1 root root 96 Feb 14 15:09 mysql-schema-create.sql -rw-r--r-- 1 root root 109 Feb 14 15:09 PERFORMANCE_SCHEMA-schema-create.sql -rw-r--r-- 1 root root 96 Feb 14 15:09 tango-schema-create.sql -rw-r--r-- 1 root root 270 Feb 14 15:09 tango.tab01.000000000.sql -rw-r--r-- 1 root root 237 Feb 14 15:09 tango.tab01-schema.sql -rw-r--r-- 1 root root 95 Feb 14 15:09 test-schema-create.sql
3)使用-B或-T选项筛选数据
Dumpling也可以通过-B或-T选项导出特定的数据库/数据表,-B导出指定的数据库、-T导出指定的表。
注:–filter与-T不可同时使用;-T只能是完整的表名形式“库名.表名”
默认情况下,导出的文件会存储到 ./export- 目录下。常用选项如下:
利用以上选项可以提高Dumpling的并行度
Dumpling通过–consistency 标志控制导出数据的一致性,有以下几种方式
默认情况下,TiDB会通过获取某个时间戳的快照来保证一致性(即 --consistency snapshot)。在使用snapshot来保证一致性的时候,可以使用–snapshot选项指定要备份的时间戳。
Dumpling可以通过–snapshot指定导出某个 tidb_snapshot 时的数据。–snapshot选项可设为 TSO(SHOW MASTER STATUS 输出的 Position 字段)或有效的 datetime 时间,例如:
mysql> show master status; +-------------+--------------------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------+--------------------+--------------+------------------+-------------------+ | tidb-binlog | 422913627203829761 | | | | +-------------+--------------------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) [root@tango-01 tidb-toolkit]# ./bin/dumpling -u root -P4000 -h192.168.112.101 --threads 32 -o /tmp/test3 --snapshot 422913627203829761 [root@tango-01 tidb-toolkit]# ./bin/dumpling -u root -P4000 -h192.168.112.101 --threads 32 -o /tmp/test2 --snapshot "2021-02-14 15:12:00"
即可导出TSO为422913627203829761或2021-02-14 15:12:00 时的TiDB历史数据快照。
Dumpling导出TiDB较大单表时,可能会因为导出数据过大导致TiDB内存溢出(OOM),从而使连接中断导出失败。可以通过以下参数减少TiDB的内存使用。
TiDB Lighting是将全量数据快速导入TiDB的工具,支持Dumpling或CSV格式的数据源。主要有以下使用场景:
使用TiDB Lightning时需要注意以下几点:
bin/tidb-lightning-ctl --switch-mode=normal
TiDB Lightning 整体工作原理如下:
1)解压缩TiDB工具包tidb-toolkit-v4.0.10-linux-amd64.tar.gz,并将tidb-lightning 及 bin/tidb-lightning-ctl拷贝到指定目录
[root@tango-01 tidb-toolkit]# cp ./bin/tidb-lightning ./tidb-lightning/ [root@tango-01 tidb-toolkit]# cp ./bin/tidb-lightning-ctl ./tidb-lightning/ [root@tango-01 tidb-toolkit]# cd tidb-lightning/ [root@tango-01 tidb-lightning]# ll total 168268 -rwxr-xr-x 1 root root 91104752 Feb 14 16:07 tidb-lightning -rwxr-xr-x 1 root root 81197800 Feb 14 16:07 tidb-lightning-ctl
2)配置tidb-lightning.toml
[lightning] # 转换数据的并发数,默认为逻辑 CPU 数量,不需要配置。 # 混合部署的情况下可以配置为逻辑 CPU 的 75% 大小。 # region-concurrency = # 日志 level = "info" file = "tidb-lightning.log" [tikv-importer] # backend 设置为 local 模式 backend = "local" # 设置本地临时存储路径 sorted-kv-dir = "/tmp/sorted-kv-dir" [mydumper] # Mydumper 源数据目录。 data-source-dir = "/tmp/test3" [tidb] # 目标集群的信息。tidb-server 的监听地址,填一个即可。 host = "192.168.112.101" port = 4000 user = "root" password = "" # 表架构信息在从 TiDB 的“状态端口”获取。 status-port = 10080 # pd-server 的地址,填一个即可 pd-addr = "192.168.112.101:2379"
3)运行tidb-lightning
[root@tango-01 tidb-lightning]# nohup ./tidb-lightning -config tidb-lightning.toml > nohup.out &
查看日志信息:
[2021/02/14 16:11:23.394 +08:00] [INFO] [restore.go:718] ["restore table completed"] [table=`tango`.`tab_tidb`] [takeTime=5.248430549s] [] [2021/02/14 16:11:23.394 +08:00] [INFO] [restore.go:1296] ["local checksum"] [table=`tango`.`tab01`] [checksum="{cksum=5022109439688970821,size=489,kvs=14}"] [2021/02/14 16:11:23.394 +08:00] [INFO] [checksum.go:158] ["remote checksum start"] [table=tab01] [2021/02/14 16:11:23.394 +08:00] [INFO] [restore.go:1296] ["local checksum"] [table=`tango`.`tab_tidb`] [checksum="{cksum=16567959753162286234,size=1320,kvs=30}"] [2021/02/14 16:11:23.394 +08:00] [INFO] [checksum.go:158] ["remote checksum start"] [table=tab_tidb] [2021/02/14 16:11:23.565 +08:00] [INFO] [checksum.go:161] ["remote checksum completed"] [table=tab01] [takeTime=171.287295ms] [] [2021/02/14 16:11:23.565 +08:00] [INFO] [restore.go:1753] ["checksum pass"] [table=`tango`.`tab01`] [local="{cksum=5022109439688970821,size=489,kvs=14}"] [2021/02/14 16:11:23.565 +08:00] [INFO] [restore.go:1758] ["analyze start"] [table=`tango`.`tab01`] [2021/02/14 16:11:23.608 +08:00] [INFO] [checksum.go:161] ["remote checksum completed"] [table=tab_tidb] [takeTime=213.714593ms] [] [2021/02/14 16:11:23.608 +08:00] [INFO] [restore.go:1753] ["checksum pass"] [table=`tango`.`tab_tidb`] [local="{cksum=16567959753162286234,size=1320,kvs=30}"] [2021/02/14 16:11:23.608 +08:00] [INFO] [restore.go:1758] ["analyze start"] [table=`tango`.`tab_tidb`] [2021/02/14 16:11:24.839 +08:00] [INFO] [restore.go:1760] ["analyze completed"] [table=`tango`.`tab01`] [takeTime=1.273633373s] [] [2021/02/14 16:11:25.038 +08:00] [INFO] [restore.go:1760] ["analyze completed"] [table=`tango`.`tab_tidb`] [takeTime=1.430174433s] [] [2021/02/14 16:11:25.038 +08:00] [INFO] [restore.go:863] ["restore all tables data completed"] [takeTime=7.113491037s] [] [2021/02/14 16:11:25.041 +08:00] [INFO] [restore.go:608] ["everything imported, stopping periodic actions"] [2021/02/14 16:11:25.075 +08:00] [INFO] [restore.go:678] ["add back PD leader®ion schedulers"] [2021/02/14 16:11:25.076 +08:00] [INFO] [restore.go:1351] ["skip full compaction"] [2021/02/14 16:11:25.161 +08:00] [INFO] [restore.go:1445] ["clean checkpoints start"] [keepAfterSuccess=false] [taskID=1613290277518783443] [2021/02/14 16:11:25.161 +08:00] [INFO] [restore.go:1452] ["clean checkpoints completed"] [keepAfterSuccess=false] [taskID=1613290277518783443] [takeTime=92.058µs] [] [2021/02/14 16:11:25.161 +08:00] [INFO] [restore.go:300] ["the whole procedure completed"] [takeTime=7.560768233s] [] [2021/02/14 16:11:25.161 +08:00] [INFO] [main.go:95] ["tidb lightning exit"]
由参数“enable = true”控制是否启用断点续传;导入数据时,TiDB Lightning会记录当前表导入的进度,所以即使Lightning或其他组件异常退出,在重启时也可以避免重复再导入已完成的数据。TiDB Lightning支持两种断点存储方式:本地文件或MySQL数据库。
如果Tidb-lightning因为不可恢复的错误退出,重启的时候不会使用断点而是直接报错,因此需要先解决这些错误才能继续,此时可以使用tidb-lightning-ctrl工具:
TiDB 4.0开始,所有的TiDB工具集都可以使用通用的过滤语法来定义子集,比如:
表库的过滤方法可以使用通配符,也可以使用正则表达式
TiDB Lightning的后端决定 tidb-lightning 组件将如何把将数据导入到目标集群中,目前支持以下几种后端方式
三种方式的对比如下:
如果导入的目标集群为v4.0或以上版本,优先考虑使用Local-backend模式。Local-backend部署更简单并且性能也较其他两个模式更高。
TiDB Lightning支持服务器模式,可以在Web端查看导入的进度以及执行简单的任务,在启动的时候加入“–server-mode --status-addr :8289”参数或者配置文件中将server-mode设置为true即可。
[lightning] server-mode = true status-addr = ':8289'
TiDB Lightning启动后,访问http://192.168.112.10:8289来管理任务
1) 提交任务
2)查看导入进度
1)CSV文件名
CSV文件需命名为db_name.table_name.csv,该文件会被解析为数据库db_name里名为table_name的表。如果一个表分布于多个CSV文件,这些CSV文件命名需加上文件编号的后缀,如 db_name.table_name.001.csv,数字部分不需要连续但必须递增,并用零填充。
2) 表结构
CSV文件没有表结构,在导入TiDB过程中,需提供表结构,可通过以下方法实现:
3)配置文件
[lightning] server-mode = true status-addr = ':8289' # 转换数据的并发数,默认为逻辑 CPU 数量,不需要配置。 # 混合部署的情况下可以配置为逻辑 CPU 的 75% 大小。 # region-concurrency = # 日志 level = "info" file = "tidb-lightning.log" [mydumper.csv] separator = ',' delimiter = '"' header = true not-null = false null = '\N' backslash-escape = true trim-last-separator = false [tikv-importer] # backend 设置为 local 模式 backend = "local" # 设置本地临时存储路径 sorted-kv-dir = "/tmp/sorted-kv-dir" [mydumper] # Mydumper 源数据目录。 no-schema = true data-source-dir = "/tmp/test4" [tidb] # 目标集群的信息。tidb-server 的监听地址,填一个即可。 host = "192.168.112.101" port = 4000 user = "root" password = "" # 表架构信息在从 TiDB 的“状态端口”获取。 status-port = 10080 # pd-server 的地址,填一个即可 pd-addr = "192.168.112.101:2379"
4)创建表
mysql> CREATE TABLE `tab02` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `city` varchar(20) NOT NULL DEFAULT '', -> PRIMARY KEY (`id`)); Query OK, 0 rows affected (0.28 sec)
5)启动
[root@tango-01 tidb-lightning]# nohup ./tidb-lightning -config tidb-lightning-csv.toml > nohup.out &
源文件格式如下:
[root@tango-01 test4]# ll total 8 -rw-r--r-- 1 root root 146 Feb 14 18:02 metadata -rw-r--r-- 1 root root 60 Feb 14 18:02 tango.tab02.csv [root@tango-01 test4]# cat tango.tab02.csv "id","city" 11,"Suzhou" 12,"Hefei" 13,"Xian" 14,"Chongqing"
查看导入结果如下
mysql> select * from tab02; +----+-----------+ | id | city | +----+-----------+ | 11 | Suzhou | | 12 | Hefei | | 13 | Xian | | 14 | Chongqing | +----+-----------+ 4 rows in set (0.01 sec)
1)通过Dumpling工具生成SQL文件
[root@tango-01 tidb-toolkit]# ./bin/dumpling -u root -P4000 -h192.168.112.101 --threads 32 -o /tmp/test5 --filter 'tango.tab01' [root@tango-01 test5]# ll total 16 -rw-r--r-- 1 root root 146 Feb 14 18:35 metadata -rw-r--r-- 1 root root 96 Feb 14 18:35 tango-schema-create.sql -rw-r--r-- 1 root root 270 Feb 14 18:35 tango.tab01.000000000.sql -rw-r--r-- 1 root root 237 Feb 14 18:35 tango.tab01-schema.sql
修改输出文件的名称及schema为新表tab03
[root@tango-01 test5]# ll total 16 -rw-r--r-- 1 root root 146 Feb 14 18:35 metadata -rw-r--r-- 1 root root 96 Feb 14 18:41 tango-schema-create.sql -rw-r--r-- 1 root root 270 Feb 14 18:40 tango.tab03.000000000.sql -rw-r--r-- 1 root root 237 Feb 14 18:40 tango.tab03-schema.sql
2)配置文件
[lightning] pprof-port = 8289 # 转换数据的并发数,默认为逻辑 CPU 数量,不需要配置。 # 混合部署的情况下可以配置为逻辑 CPU 的 75% 大小。 # region-concurrency = # 日志 level = "info" file = "tidb-lightning.log" [tikv-importer] # backend 设置为 local 模式 backend = "local" # 设置本地临时存储路径 sorted-kv-dir = "/tmp/sorted-kv-dir" [mydumper] # Mydumper 源数据目录。 data-source-dir = "/tmp/test5" [tidb] # 目标集群的信息。tidb-server 的监听地址,填一个即可。 host = "192.168.112.101" port = 4000 user = "root" password = "" # 表结构信息在从 TiDB 的“状态端口”获取。 status-port = 10080 # pd-server 的地址,填一个即可 pd-addr = "192.168.112.101:2379"
3)监控配置
# 用于调试和 Prometheus 监控的 HTTP 端口。输入 0 关闭。 pprof-port = 8289
[root@tango-01 conf]# pwd /tidb-deploy/prometheus-9090/conf [root@tango-01 conf]# vi prometheus.yml scrape_configs: - job_name: "lightning" static_configs: - targets: - '192.168.112.10:8289'
修改配置后重启Prometheus服务
[root@tango-01 tidb-lightning]# tiup cluster restart tidb-test -R prometheus
4)运行任务
[root@tango-01 tidb-lightning]# nohup ./tidb-lightning -config tidb-lightning-sql.toml > nohup.out &
5)查看导入的数据
mysql> select * from tab03; +----+-----------+ | id | city | +----+-----------+ | 1 | Beijing | | 2 | Shanghai | | 3 | Guangzhou | | 4 | Shenzhen | | 5 | Foshan | | 6 | Hangzhou | | 7 | Chengdu | | 8 | Wuhan | | 9 | Changsha | | 10 | Nanjing | | 11 | Suzhou | | 12 | Hefei | | 13 | Xian | | 14 | Chongqing | +----+-----------+ 14 rows in set (0.01 sec)
到这里,已经完成了TiDB Lightning的数据导入测试,在使用时需要注意以下几点:
参考资料:
转载请注明原文地址:https://blog.csdn.net/solihawk/article/details/118691591
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!