# **练习-2 : 使用 `TiDB Lightning` 并行导入分库分表数据至 `TiDB`**

## 概述
+ 本练习中，您将使用 TiDB Lightning 来向 TiDB 数据库中导入由 2 个分表分库的 MySQL 分片导出的 SQL 文件，并将表进行合并。

## 实验环境要求
+ 1. 注意，您的实验环境（包括IP，端口号，用户名，密码和目录）可能和手册不同。
+ 2. 可以连接到实验用虚拟机。
+ 3. TiDB 数据库提前部署完毕。
+ 4. 清理掉之前的实验数据。

## 拓扑图
<img src="../../../diagram/TiDBLightningLabToplogy_aa_001_20220725.png" width="50%" align="top"/>

## 步骤

-----------------------------------------------
#### 1. TiDB Lightning 工具集成在 tidb-toolkit 中，先进行下载安装:
+ **请从网址：https://pingcap.com/zh/product-community/ 中下载最新的 TiDB-community-toolkit 软件包，并上传到练习环境中。**  

+ **解压下载的软件包**：
    ```
     # tar xvf tidb-community-toolkit-v6.1.0-linux-amd64.tar
    ```

+ **解压 TiDB Lightning 工具**
    ```
     # cd tidb-community-toolkit-v6.1.0-linux-amd64
     # tar xvf tidb-lightning-v6.1.0-linux-amd64.tar.gz
    ```
    ```
     tidb-lightning
    ```

+ **确认安装完毕:**
     ```
     # ls tidb-lightning*
    ``` 
    ```
     tidb-lightning  tidb-lightning-ctl  tidb-lightning-v6.1.0-linux-amd64.tar.gz
    ``` 
+ **也可以将目录加入环境变量，方便后续执行:** 
    ```
     # cd
     # vi .bash_profile
    ``` 
    ```
     PATH=$PATH:$HOME/bin:/usr/local/mysql/bin:/root/tidb-community-toolkit-v6.1.0
    ``` 
+ **注意:本练习，需要在 2 个节点上安装 TiDB Lightning 达到并行的效果，所以请在另一个节点上再安装一次 TiDB Lightning。** 
-----------------------------------------------
#### 2. 查看需要导入的 SQL 格式数据文件:
+ **首先，查看第 1 个节点上的数据文件**：
    ```
    # ls
    ```
    ```
     metadata  my_db.my_table_1.000000000.sql  my_db.my_table_1-schema.sql  my_db-schema-create.sql
    ```
+ **查看第 1 个节点上的 SQL 文件的数据内容**：
    ```
    # vi my_db-schema-create.sql
    ```
    ```sql
    /*!40101 SET NAMES binary*/;
    CREATE DATABASE `my_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
    ```
    ```
    # vi my_db.my_table_1-schema.sql 
    ```
    ```sql
    /*!40101 SET NAMES binary*/;
    CREATE TABLE `my_table_1` (
    `id` int(11) NOT NULL,
    `name` varchar(32) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    ```
    ```
    # vi my_db.my_table_1.000000000.sql
    ```
    ```sql
    /*!40101 SET NAMES binary*/;
    INSERT INTO `my_table_1` VALUES
    (1,'tom'),
    (3,'frank');
    ```
+ **其次，查看第 2 个节点上的数据文件**：
    ```
    # ls
    ```
    ```
     metadata  my_db.my_table_2.000000000.sql  my_db.my_table_2-schema.sql  my_db-schema-create.sql
    ```
+ **查看第 2 个节点上的 SQL 文件的数据内容**：
    ```
    # vi my_db-schema-create.sql
    ```
    ```sql
    /*!40101 SET NAMES binary*/;
    CREATE DATABASE `my_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
    ```
    ```
    # vi  my_db.my_table_2-schema.sql
    ```
    ```sql
    /*!40101 SET NAMES binary*/;
    CREATE TABLE `my_table_2` (
    `id` int(11) NOT NULL,
    `name` varchar(32) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    ```
    ```
    # vi my_db.my_table_2.000000000.sql
    ```
    ```sql
    /*!40101 SET NAMES binary*/;
    INSERT INTO `my_table_2` VALUES
    (2,'jack'),
    (4,'tony');
    ```
-----------------------------------------------
#### 3. 编辑 TiDB Lightning 工具的配置文件:
+ **首先，编辑第 1 个节点上的配置文件 tidb-lightning-2.toml，如下:**
    ```
    # vi tidb-lightning-2.toml
    ```
+ **其次，编辑第 2 个节点上的配置文件 tidb-lightning-2.toml，如下:**
    ```
    # vi tidb-lightning-2.toml
    ```
-----------------------------------------------
#### 4. 连接到目标 `TiDB` ，准备并检查导入数据前的 `TiDB` 数据库:(请根据自己实验环境输入密码)
+ **连接到目标 `TiDB` 数据库，并清理旧的练习数据，如下:**
    ```sql
    # mysql -h172.31.0.135 -P4000 -uroot -ptidb
    mysql> drop database my_db;
    ```
-----------------------------------------------
#### 5. 使用 TiDB Lightning 工具进行数据导入:
+ **首先，在第 1 个节点启动 TiDB Lightning，如下:**
    ```
      # ! /bin/bash
      # nohup tidb-lightning -config tidb-lightning-2.toml > nohup.out &
    ```
+ **其次，在第 2 个节点启动 TiDB Lightning，如下:**
    ```
      # ! /bin/bash
      # nohup tidb-lightning -config tidb-lightning-2.toml > nohup.out &
    ```

+ **这里请注意：无论第 1 个节点还是第 2 个节点，此时屏幕光标会悬停在最后一行，我们可以点击回车键“Enter”，来使 nohup 的 tidb-lighting 在后台工作， 如下:**
    ```
      # nohup tidb-lightning -config tidb-lightning-2.toml > nohup.out &
      [1] 4256
      # nohup: ignoring input and redirecting stderr to stdout

      # 
    ```
+ **无论第 1 个节点还是第 2 个节点，TiDB Lightning 导入完毕后，会出现如下字样:**
    ```
      [1]+  Done                    nohup tidb-lightning -config tidb-lightning-2.toml > nohup.out
    ```
-----------------------------------------------
#### 6. 检查数据导入结果:
+ **首先，在第 1 个节点检查nohup日志，确认 TiDB Lightning 正常退出，如下:**
    ```
    # vi nohup.out
    ```
+ **如果 TiDB Lightning 没有正常退出请检查其日志文件 tidb-lightning.log，来确认出错原因，如下:**
    ```
    vi tidb-lightning.log
    ```
+ **其次，在第 2 个节点检查nohup日志，确认 TiDB Lightning 正常退出，如下:**
    ```
    # vi nohup.out
    ```
+ **如果 TiDB Lightning 没有正常退出请检查其日志文件 tidb-lightning.log，来确认出错原因，如下:**
    ```
    vi tidb-lightning.log
    ```
+ **连接到目标 `TiDB` 数据库，查看 my_db.my_table 表中的数据，如下:**
    ```sql
    # mysql -h172.31.0.135 -P4000 -uroot -ptidb
    mysql> select * from my_db.my_table;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | tom   |
    |  2 | jack  |
    |  3 | frank |
    |  4 | tony  |
    +----+-------+
    4 rows in set (0.00 sec)
    ```
-----------------------------------------------

## 输出样例

-----------------------------------------------
#### 步骤1-解压下载的软件包输出参考：
```
    # tar xvf tidb-community-toolkit-v6.1.0-linux-amd64.tar
```
```
tidb-community-toolkit-v6.1.0-linux-amd64/
tidb-community-toolkit-v6.1.0-linux-amd64/reparo
tidb-community-toolkit-v6.1.0-linux-amd64/2225.cdc.json
tidb-community-toolkit-v6.1.0-linux-amd64/9.errdoc.json
tidb-community-toolkit-v6.1.0-linux-amd64/805.dm-master.json
tidb-community-toolkit-v6.1.0-linux-amd64/2.spark.json
tidb-community-toolkit-v6.1.0-linux-amd64/1.root.json
tidb-community-toolkit-v6.1.0-linux-amd64/213.tiup.json
...
tidb-community-toolkit-v6.1.0-linux-amd64/dmctl-v6.1.0-linux-amd64.tar.gz
tidb-community-toolkit-v6.1.0-linux-amd64/root.json
```

-----------------------------------------------
#### 步骤3-编辑第 1 个节点上的配置文件 tidb-lightning-2.toml 输出参考：
```
# vi tidb-lightning-2.toml
```
```
[lightning]

# 转换数据的并发数，默认为逻辑 CPU 数量，不需要配置。
# 混合部署的情况下可以配置为逻辑 CPU 的 75% 大小。
# region-concurrency = 1

# 日志
level = "info"
file = "tidb-lightning.log"

[tikv-importer]
# 是否允许向已存在数据的表导入数据。默认值为 false。
# 当使用并行导入模式时，由于多个 TiDB Lightning 实例同时导入一张表，因此此开关必须设置为 true。
incremental-import = true
# backend 设置为 local 模式
backend = "local"
# 设置本地临时存储路径
sorted-kv-dir = "/tmp/sorted-kv-dir"

[mydumper]
# 源数据目录。
data-source-dir = "/root/sample/sql/my_table_1"
# 配置通配符规则，默认规则会过滤 mysql、sys、INFORMATION_SCHEMA、PERFORMANCE_SCHEMA、METRICS_SCHEMA、INSPECTION_SCHEMA 系统数据库下的所有表                     
``` 
 -----------------------------------------------
#### 步骤3-编辑第 2 个节点上的配置文件 tidb-lightning-2.toml 输出参考：
```
# vi tidb-lightning-2.toml
```
```
[lightning]

# 转换数据的并发数，默认为逻辑 CPU 数量，不需要配置。
# 混合部署的情况下可以配置为逻辑 CPU 的 75% 大小。
# region-concurrency = 1

# 日志
level = "info"
file = "tidb-lightning.log"

[tikv-importer]
# 是否允许向已存在数据的表导入数据。默认值为 false。
# 当使用并行导入模式时，由于多个 TiDB Lightning 实例同时导入一张表，因此此开关必须设置为 true。
incremental-import = true
# backend 设置为 local 模式
backend = "local"
# 设置本地临时存储路径
sorted-kv-dir = "/tmp/sorted-kv-dir"

[mydumper]
# 源数据目录。
data-source-dir = "/root/sample/sql/my_table_2"
# 配置通配符规则，默认规则会过滤 mysql、sys、INFORMATION_SCHEMA、PERFORMANCE_SCHEMA、METRICS_SCHEMA、INSPECTION_SCHEMA 系统数据库下的所有表                      
``` 
-----------------------------------------------
#### 步骤6-在第 1 个节点检查nohup日志，确认 TiDB Lightning 正常退出，输出参考
```
# vi nohup.out
```
```
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   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+
|^[[33m  6 ^[[0m|^[[33m sorted-kv-dir:/tmp/sorted-kv-dir and data-source-dir:/root/sample/sql/my_table_1 are in the same disk, may slow down performance ^[[0m|^[[33m performance ^[[0m|^[[33m false  ^[[0m|
+^[[33m----^[[0m+^[[33m----------------------------------------------------------------------------------------------------------------------------------^[[0m+^[[33m-------------^[[0m+^[[33m--------^[[0m+
|  7 | local disk resources are rich, estimate sorted data size 85B, local available is 5.149GiB                                        | critical    | true   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+
|  8 | Cluster available is rich, available is 54.46GiB, we need 255B                                                                   | critical    | true   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+
|  9 | Cluster doesn't have too many empty regions                                                                                      | critical    | true   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+
| 10 | Cluster region distribution is balanced                                                                                          | critical    | true   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+

tidb lightning exit successfully
```
-----------------------------------------------
#### 步骤6-在第 2 个节点检查 nohup 日志，确认 TiDB Lightning 正常退出，输出参考
```
# vi nohup.out
```
```
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   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+
|^[[33m  6 ^[[0m|^[[33m sorted-kv-dir:/tmp/sorted-kv-dir and data-source-dir:/root/sample/sql/my_table_2 are in the same disk, may slow down performance ^[[0m|^[[33m performance ^[[0m|^[[33m false  ^[[0m|
+^[[33m----^[[0m+^[[33m----------------------------------------------------------------------------------------------------------------------------------^[[0m+^[[33m-------------^[[0m+^[[33m--------^[[0m+
|  7 | local disk resources are rich, estimate sorted data size 85B, local available is 7.173GiB                                        | critical    | true   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+
|  8 | Cluster available is rich, available is 54.46GiB, we need 255B                                                                   | critical    | true   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+
|  9 | Cluster doesn't have too many empty regions                                                                                      | critical    | true   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+
| 10 | Cluster region distribution is balanced                                                                                          | critical    | true   |
+----+----------------------------------------------------------------------------------------------------------------------------------+-------------+--------+

tidb lightning exit successfully
```
 -----------------------------------------------