021、数据库管理之数据导入工具(Lightning)

news/2024/5/19 14:53:37 标签: 数据库, 分布式数据库, tidb

Lightning

    • Lightning原理
    • 后端模式对比
    • 部署需求
    • 获取TiDB Lightning
    • 配置Lightning
    • 启动运行Lightning
    • 退出Lightning
    • 断点续传
    • 使用表库过滤
    • 表库过滤语法
    • 使用通配符
    • 使用文件导入
    • 注释与空行
    • 排除规则
    • 转义字符
    • 引号包裹的标识符
    • 正则表达式
    • 使用多个过滤规则
    • 实验

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-backendImporter-backendTiDB-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_SCHEMAPERFORMANCE_SCHEMAMETRICS_SCHEMAINSPECTION_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
表名只由有效的标识符组成,例如:
数字(09)
字母(a 到 z,AZ)
$
_
非 ASCII 字符(U+0080U+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+0065U+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、 验证

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA     |
| PERFORMANCE_SCHEMA |
| mysql              |
| test               |
+--------------------+
5 rows in set (0.00 sec)

5、查看Lighting日志

[root@tiup tidb-toolkit]# more tidb-lightning.log 

http://www.niftyadmin.cn/n/480317.html

相关文章

算法设计与分析之贪心算法

文章目录 1. 贪心算法简介2. 找零钱问题 1. 贪心算法简介 贪心算法(Greedy Algorithm)是一种基于贪心思想的算法策略。它通过每一步选择当前状态下最优的解决方案,从而逐步得到全局最优解。贪心算法通常在问题具有贪心选择性质和最优子结构性…

Vue 子组件使用 this.$parent 无法访问到父组件数据和方法

前言 最近在使用父子组件时候,通过this.$parent访问父组件数据和方法,出现undefined的情况。 实际场景是父组件有一个dialog弹出框,包含几个子组件form表单,根据标识只展示一个子组件。 在子组件需要传递一个ID给父组件中的data…

Linux文件的权限

1.Linux文件的权限 linux文件的权限可以分为四类:可读、可写、可执行、没有权限。分别用字符r、w、x、- 表示。 2. 用户与用户组 Linux是一个多用户多任务的操作系统,可以通过用户和用户组来更好的控制文件的权限。 每个文件都有一个拥有者&#xff08…

4、动手学深度学习——多层感知机:模型选择、欠拟合和过拟合

1、训练误差和泛化误差 训练误差(training error)是指, 模型在训练数据集上计算得到的误差。 泛化误差(generalization error)是指, 模型对位置数据项预测的误差,泛化误差体现出了模型的泛化能…

MDK指定.sct(分散加载描述文件)文件位置

文章目录 MDK指定.sct(分散加载描述文件)文件位置概述END MDK指定.sct(分散加载描述文件)文件位置 概述 用STM32CubeMX生成的工程, 默认的.sct位置在临时输出目录, 里面都是.o. 都是工程编译时生成的临时文件(中间文件) 当工程归档时, 这个临时目录肯定是要删除的(编译过程…

【Linux】MySQL 进阶语句

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MySQL 进阶语句 算排名算中位数算累积总计算总合百分比算累积总合百分比 use zs; CREATE TABLE ikun (Name char(10),Sales int(5)); INSERT INTO ikun VALUES (cx,10); INSE…

[RocketMQ] Broker接收消息入口源码 (九)

文章目录 1.Broker处理请求入口1.1 registerProcessor注册消息处理器1.2 NettyServerHandler处理请求1.3 processRequestCommand分发处理请求1.3.1 rejectRequest是否拒绝请求 2.asyncProcessRequest异步处理请求2.1 asyncProcessRequest异步处理请求 3.总结 1.Broker处理请求入…

iOS开发进阶(一):走近iOS原生开发

文章目录 一、前言二、知识储备三、 Object-C四、启动流程五、拓展阅读 一、前言 在应用 uni-app 进行跨平台APP开发过程中,发现并不支持视频播放小窗功能,且插件市场提供的插件用户体验不好,遂决定自行开发 uni-app 原生插件。 uni-app原生…