TiDB Lightning 是TiDB数据库的生态工具之一,可以将全量数据高速导入到TiDB集群中。
- 支持的数据格式
Dumping、CSV等输出格式IDE数据源
Lightning原理
导入模式-》建立schema和表->分割表->读取SQL DUMP-》 写入本地临时存储->导入数据到TiKV集群-》校验与分析
DDL 的SQL语句通过TiDB Server执行,生成对象。但是里面的数据并不是将SQL应用到TiDB上,而是将读取的数据直接应用对应的TiKV上,所以快。数据的应用,它不是通过SQL(类似insert)执行方式实现,而是将读到的数据,直接载入到TiKV中。它可以通过pd获得元数据信息,来辅助这个导入。
注意: 如果中间断掉了,需要手工切换到普通模式
后端模式对比
以上几种后端导入数据的区别如下:
-
Local-backend:tidb-lightning 先将数据编码成键值对并排序存储在本地临时目录,然后将这些键值对以 SST 文件的形式上传到各个 TiKV 节点,然后由 TiKV 将这些 SST 文件 Ingest 到集群中。和 Importer-backend 原理相同,不过不依赖额外的 tikv-importer 组件。
-
Importer-backend:tidb-lightning 先将 SQL 或 CSV 数据编码成键值对,由 tikv-importer 对写入的键值对进行排序,然后把这些键值对 Ingest 到 TiKV 节点中。
-
TiDB-backend:tidb-lightning 先将数据编码成 INSERT 语句,然后直接在 TiDB 节点上运行这些 SQL 语句进行数据导入。它就是传统执行SQL(insert ),支持事务。
其他两种方式,不能导入的同时还做dml。
后端 | Local-backend | Importer-backend | TiDB-backend |
---|---|---|---|
速度 | 快 (~500 GB/小时) | 快 (~400 GB/小时) | 慢 (~50 GB/小时) |
资源使用率 | 高 | 高 | 低 |
占用网络带宽 | 高 | 中 | 低 |
导入时是否满足 | ACID | 否 | 否 |
目标表 | 必须为空 | 必须为空 | 可以不为空 |
额外组件 | 无 | tikv-importer | 无 |
支持 TiDB 集群版本 | >= v4.0.0 | 全部 | 全部 |
是否影响 TiDB 对外提供服务 | 是 | 是 | 否 |
部署需求
- 硬件需求
- 32+ 逻辑核CPU
- SSD 硬盘
- 使用万兆网卡
- 单独部署
- 比较吃硬件资源,例如源数据是1t,假设3副本 13,另外还有个本地临时缓存,所以再乘以2 13*2=6t
- 权限:select insert update delete create drop alter
获取TiDB Lightning
- 使用TiUP执行 tiup install lightning命令
- tidb-toolkit 安装包
配置Lightning
[lightning]
# 日志
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
# 选择使用的导入模式,如下为local模式
backend = "local"
# 设置本地临时存储路劲,排序的键值对的临时存放地址,目标路径需要是一个空目录
sorted-kv-dir = "/mnt/ssd/sorted-kv-dir"
[mydumper]
# 源数据目录。
data-source-dir = "/data/my_datasource/"
# 配置通配符规则,默认规则会过滤 mysql、sys、INFORMATION_SCHEMA、PERFORMANCE_SCHEMA、METRICS_SCHEMA、INSPECTION_SCHEMA 系统数据库下的所有表
# 若不配置该项,导入系统表时会出现“找不到 schema”的异常
filter = ['*.*', '!mysql.*', '!sys.*', '!INFORMATION_SCHEMA.*', '!PERFORMANCE_SCHEMA.*', '!METRICS_SCHEMA.*', '!INSPECTION_SCHEMA.*']
[tidb]
# 目标集群的信息,tidb-server的监听地址,填写一个即可。
host = "172.16.31.2"
port = 4000
user = "root"
password = "rootroot"
# 表架构信息在从 TiDB 的“状态端口”获取。
status-port = 10080
# 集群 pd 的地址,填写一个即可
pd-addr = "172.16.31.3:2379"
把SQL语句提炼成键值对形式,临时存放在本地临时存储路径中,然后直接加载这些数据。
启动运行Lightning
#!/bin/bash
nohup tiup tidb-lightning -config tidb-lightning.toml > nohup.out &## 退出Lightning
退出Lightning
导入完毕后,Lightning 会自动退出。若导入成功,日志的最后一行会显示 tidb lightning exit。
断点续传
# 存储断点的方式
# - file:存放在本地文件系统(要求 v2.1.1 或以上)
# - mysql:存放在兼容 MySQL 的数据库服务器
driver = "file"
# 存储断点的架构名称(数据库名称)
# 仅在 driver = "mysql" 时生效
# schema = "tidb_lightning_checkpoint"
1、断电续传的启用与配置
[checkpoint]
# 启用断点续传。
# 导入时,TiDB Lightning 会记录当前进度。
# 若 TiDB Lightning 或其他组件异常退出,在重启时可以避免重复再导入已完成的数据。
enable = true
2、断点的存储
# 断点的存放位置
#file : 本地文件系统 ; mysql: 数据库服务器
# 若 driver = "file",此参数为断点信息存放的文件路径。
# 如果不设置该参数则默认为 `/tmp/CHECKPOINT_SCHEMA.pb`
#
# 若 driver = "mysql",此参数为数据库连接参数 (DSN),格式为“用户:密码@tcp(地址:端口)/”。
# 默认会重用 [tidb] 设置目标数据库来存储断点。
# 为避免加重目标集群的压力,建议另外使用一个兼容 MySQL 的数据库服务器。
# dsn = "/tmp/tidb_lightning_checkpoint.pb"
# 导入成功后是否保留断点。默认为删除。
# 保留断点可用于调试,但有可能泄漏数据源的元数据。
# keep-after-success = false
3、 断点续传的控制i
若 tidb-lightning 因不可恢复的错误而退出(例如数据出错),重启时不会使用断点,而是直接报错离开。为保证已导入的数据安全,这些错误必须先解决掉才能继续。使用 tidb-lightning-ctl 工具可以标示已经恢复。
--checkpoint-error-destroy
tidb-lightning-ctl --checkpoint-error-destroy='`schema`.`table`'
该命令会让失败的表从头开始整个导入过程。选项中的架构和表名必须以反引号 (`) 包裹,而且区分大小写。
如果导入 `schema`.`table` 这个表曾经出错,这条命令会:
从目标数据库移除 (DROP) 这个表,清除已导入的数据。
将断点重设到“未开始”的状态。
如果 `schema`.`table` 没有出错,则无操作。
传入 "all" 会对所有表进行上述操作。这是最方便、安全但保守的断点错误解决方法:
tidb-lightning-ctl --checkpoint-error-destroy=all
--checkpoint-error-ignore
tidb-lightning-ctl --checkpoint-error-ignore='`schema`.`table`' &&
tidb-lightning-ctl --checkpoint-error-ignore=all
如果导入 `schema`.`table` 这个表曾经出错,这条命令会清除出错状态,如同没事发生过一样。传入 "all" 会对所有表进行上述操作。
注意
除非确定错误可以忽略,否则不要使用这个选项。如果错误是真实的话,可能会导致数据不完全。启用校验和 (CHECKSUM) 可以防止数据出错被忽略。
--checkpoint-remove
tidb-lightning-ctl --checkpoint-remove='`schema`.`table`' &&
tidb-lightning-ctl --checkpoint-remove=all
无论是否有出错,把表的断点清除。
--checkpoint-dump
tidb-lightning-ctl --checkpoint-dump=output/directory
将所有断点备份到传入的文件夹,主要用于技术支持。此选项仅于 driver = "mysql" 时有效。
使用表库过滤
- 命令行
在命令行中使用多个 -f 或 --filter 参数,即可在 TiDB 数据迁移工具中应用表库过滤规则。每个过滤规则均采用 db.table 形式,支持通配符(详情见下一节)。以下为各个工具中的使用示例:
BR:
./br backup full -f 'foo*.*' -f 'bar*.*' -s 'local:///tmp/backup'
./br restore full -f 'foo*.*' -f 'bar*.*' -s 'local:///tmp/backup'
Dumpling:
./dumpling -f 'foo*.*' -f 'bar*.*' -P 3306 -o /tmp/data/
TiDB Lightning:
./tidb-lightning -f 'foo*.*' -f 'bar*.*' -d /tmp/data/ --backend tidb
- TOML 配置文件
在 TOML 文件中,表库过滤规则以字符串数组的形式指定。以下为各个工具中的使用示例:
TiDB Lightning:
[mydumper]
filter = ['foo*.*', 'bar*.*']
TiCDC:
[filter]
rules = ['foo*.*', 'bar*.*']
[[sink.dispatchers]]
matcher = ['db1.*', 'db2.*', 'db3.*']
dispatcher = 'ts'
表库过滤语法
- 直接使用表名
每条表库过滤规则由“库”和“表”组成,两部分之间以英文句号 (.) 分隔。只有表名与规则完全相符的表才会被接受。
db1.tbl1
db2.tbl2
db3.tbl3
表名只由有效的标识符组成,例如:
数字(0 到 9)
字母(a 到 z,A 到 Z)
$
_
非 ASCII 字符(U+0080 到 U+10FFFF)
使用通配符
表名的两个部分均支持使用通配符(详情见 fnmatch(3) )。
*:匹配零个或多个字符。
?:匹配一个字符。
[a-z]:匹配 "a" 和 "z" 之间的一个字符。
[!a-z]:匹配不在 "a" 和 "z" 之间的一个字符。
db[0-9].tbl[0-9a-f][0-9a-f]
data.*
*.backup_*
此处,“字符”指的是一个 Unicode 码位,例如:
U+00E9 "é" 是 1 个字符。
U+0065,U+0301 "é" 是 2 个字符。
U+1F926 U+1F3FF U+200D U+2640 U+FE0F "🤦🏿♀️" 是 5 个字符。
使用文件导入
如需导入一个文件作为过滤规则,请在规则的开头加上一个 “@” 来指定文件名。库表过滤解析器将导入文件中的每一行都解析为一条额外的过滤规则。
例如,config/filter.txt 文件有以下内容:
employees.*
*.WorkOrder
以下两条表库过滤命令是等价的:
./dumpling -f '@config/filter.txt'
./dumpling -f 'employees.*' -f '*.WorkOrder'
导入的文件里不能使用过滤规则导入另一个文件。
注释与空行
导入的过滤规则文件中,每一行开头和结尾的空格都会被去除。此外,空行(空字符串)也将被忽略。
行首的 # 表示该行是注释,会被忽略。而不在行首的 # 则会被认为是语法错误。
# 这是一行注释
db.table # 这一部分不是注释,且可能引起错误
排除规则
在一条过滤规则的开头加上 !,则表示符合这条规则的表不会被 TiDB 数据迁移工具处理。通过应用排除规则,库表过滤可以作为屏蔽名单来使用。
*.*
#^ 注意:必须先添加 *.* 规则来包括所有表
!*.Password
!employees.salaries
转义字符
如果需要将特殊字符转化为标识符,可以在特殊字符前加上反斜杠 \。
db\.with\.dots.*
为了简化语法并向上兼容,不支持下列字符序列:
- 在行尾去除空格后使用 \(使用 [ ] 来匹配行尾的空格)。
- 在 \ 后使用数字或字母 ([0-9a-zA-Z])。特别是类似 C 的转义序列,如 \0、\r、\n、\t 等序列,目前在表库过滤规则中无意义。
引号包裹的标识符
除了 \ 之外,还可以用 " 和 ` 来控制特殊字符。
"db.with.dots"."tbl\1"
`db.with.dots`.`tbl\2`
也可以通过输入两次引号,将引号包含在标识符内。
"foo""bar".`foo``bar`
# 等价于:
foo\"bar.foo\`bar
用引号包裹的标识符不可以跨越多行。
用引号只包裹标识符的一部分是无效的,例如:
"this is "invalid*.*
正则表达式
如果你需要使用较复杂的过滤规则,可以将每个匹配模型写为正则表达式,以 / 为分隔符:
/^db\d{2,}$/./^tbl\d{2,}$/
这类正则表示使用 Go dialect。只要标识符中有一个子字符串与正则表达式匹配,则视为匹配该模型。例如,/b/ 匹配 db01。
注意
正则表达式中的每一个 / 都需要转义为 \/,包括在 [...] 里面的 /。不允许在 \Q...\E 之间放置一个未转义的 /。
使用多个过滤规则
当表的名称与过滤列表中所有规则均不匹配时,默认情况下这些表被忽略。
要建立一个屏蔽名单,必须使用显式的 . 作为第一条过滤规则,否则所有表均被排除。
# 所有表均被过滤掉
./dumpling -f '!*.Password'
# 只有 “Password” 表被过滤掉,其余表仍保留
./dumpling -f '*.*' -f '!*.Password'
如果一个表的名称与过滤列表中的多个规则匹配,则以最后匹配的规则为准。例如:
# rule 1
employees.*
# rule 2
!*.dep*
# rule 3
*.departments
过滤结果如下:
表名 | 规则 1 | 规则 2 | 规则 3 | 结果 |
---|---|---|---|---|
irrelevant.table | 默认(拒绝) | |||
employees.employees | ✓ | 规则 1 | ||
employees.dept_emp | ✓ | ✓ | 规则 2(拒绝) | |
employees.departments | ✓ | ✓ | ✓ | 规则 3(接受) |
else.departments | ✓ | ✓ | 规则 3(接受) |
实验
1、检查备份数据
上一小节中,使用导出工具dumpling将test库的数据导出。这个时候使用TiDB Lighting工具将其导入到TiDB数据库中
[root@tiup tmp]# cd test/
[root@tiup test]# ls
metadata test.afs_test-schema.sql test.t1-schema.sql
test-schema-create.sql test.t2.0000000010000.sql
test.afs_test.0000000010000.sql test.t1.0000000010000.sql test.t2-schema.sql
2、模拟故障
mysql> drop database test;
Query OK, 0 rows affected (0.58 sec)
2、编辑TiDB Lighting 工具的配置文件
[root@tiup ~]# more tidb-lightning.yaml
[lightning]
# 日志
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
# 选择使用的 local 后端
backend = "local"
# 设置排序的键值对的临时存放地址,目标路径需要是一个空目录
sorted-kv-dir = "/tmp/tidb-test/kv"
[mydumper]
# 源数据目录。
data-source-dir = "/tmp/test"
[tidb]
# 目标集群的信息
host = "192.168.16.10"
port = 4000
user = "root"
password = ""
# 表架构信息在从 TiDB 的“状态端口”获取。
status-port = 10080
# 集群 pd 的地址
pd-addr = "192.168.16.10:2379"
3、导入备份文件
[root@tiup tidb-toolkit]# ./tidb-lightning -config ~/tidb-lightning.yaml
Verbose debug logs will be written to tidb-lightning.log
+---+----------------------------------------------+-------------+--------+
| # | CHECK ITEM | TYPE | PASSED |
+---+----------------------------------------------+-------------+--------+
| 1 | Source csv files size is proper | performance | true |
+---+----------------------------------------------+-------------+--------+
| 2 | checkpoints are valid | critical | true |
+---+----------------------------------------------+-------------+--------+
| 3 | table schemas are valid | critical | true |
+---+----------------------------------------------+-------------+--------+
| 4 | Cluster is available | critical | true |
+---+----------------------------------------------+-------------+--------+
| 5 | Lightning has the correct storage permission | critical | true |
+---+----------------------------------------------+-------------+--------+
.....
4、 验证文章来源:https://www.toymoban.com/news/detail-507358.html
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA |
| PERFORMANCE_SCHEMA |
| mysql |
| test |
+--------------------+
5 rows in set (0.00 sec)
5、查看Lighting日志文章来源地址https://www.toymoban.com/news/detail-507358.html
[root@tiup tidb-toolkit]# more tidb-lightning.log
到了这里,关于021、数据库管理之数据导入工具(Lightning)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!