# 14、TIUP TIDB

> 参考地址: <https://docs.pingcap.com/zh/tidb/dev/tiup-cluster>

### TIUP 常用命令

```bash
Usage:
  tiup cluster [command]

Available Commands:
  check       对集群进行预检
  deploy      部署集群
  start       启动已部署的集群
  stop        停止集群
  restart     重启集群
  scale-in    集群缩容
  scale-out   集群扩容
  clean       清理数据
  destroy     销毁集群
  upgrade     升级集群
  display     获取集群信息
  list        获取集群列表
  audit       查看集群操作日志
  import      导入一个由 TiDB Ansible 部署的集群
  edit-config 编辑 TiDB 集群的配置
  reload      用于必要时重载集群配置
  patch       使用临时的组件包替换集群上已部署的组件
  help        打印 Help 信息

Flags:
  -c, --concurrency int     最大并行任务数（默认值为 5）
      --format string       (实验特性) 输出的格式, 支持 [default, json] (默认值为 "default")
  -h, --help                帮助信息
      --ssh string          (实验特性）SSH 执行类型，可选值为 'builtin'、'system'、'none'。
      --ssh-timeout uint    SSH 连接超时时间
  -v, --version             版本信息
      --wait-timeout uint   等待操作超时的时间
  -y, --yes                 跳过所有的确认步骤
```

### TIUP 服务器时间必须一直

* 略

### TiUP 查看系统架构

```bash
dpkg --print-architecture
amd64   --> amd64
```

### TiUP 初始化集群拓扑文件

```bash

# 我这里使用的是 跨机房部署 TiDB 集群
tiup-cluster template --multi-dc > topology.yaml
```

**配置如下**

````yaml
```yaml
# # Global variables are applied to all deployments and used as the default value of
# # the deployments if a specific deployment value is missing.
global:
  # 运行 tidb cluster 用户.
  user: "tidb"
  # group用于指定用户所属的组名，如果它与user不同的话。
  # group: "tidb"
  # 受管集群中服务器的SSH端口。
  ssh_port: 22
  # 集群部署文件、启动脚本和配置文件的存储目录。
  deploy_dir: "/tidb-deploy"
  # 集群数据存储目录
  data_dir: "/tidb-data"

  # 支持的系统值， "amd64" || "arm64" (default: "amd64")
  arch: "amd64"

# 所有机器监控设置
monitored:
  # 用于报告TiDB集群中每个节点的系统信息的通信端口。
  node_exporter_port: 9100
  # Blackbox_exporter通信端口，用于TiDB集群端口监控
  blackbox_exporter_port: 9115
  # 监控组件的部署文件、启动脚本和配置文件的存储目录
  deploy_dir: "/tidb-deploy/monitored-9100"
  # 监控组件的数据存储目录
  data_dir: "/tidb-data/monitored-9100"
  # 监控组件的日志存储目录
  log_dir: "/tidb-deploy/monitored-9100/log"

# 全局服务配置
server_configs:
  tidb:
    log.level: debug
    log.slow-query-file: tidb-slow.log
    log.slow-threshold: 300
  tikv:
    # gRPC消息的压缩算法
    server.grpc-compression-type: gzip
    readpool.storage.use-unified-pool: true
    readpool.storage.low-concurrency: 10
    raftstore.raft-min-election-timeout-ticks: 1000
    raftstore.raft-max-election-timeout-ticks: 1020
  # tiflash:
  # tiflash-learner:
  pd:
    # 标签级别设置
    replication.location-labels: ["zone","host"]
    # TiKV数据的副本数量
    # replication.max-replicas: 3
    # 禁止 leader 被安排到指定的标签地点。
    # label-property:
    #   reject-leader:
    #     - key: "dc"
    #       value: "sha"


# 用于指定 PD 服务器的配置
pd_servers:
  # PD 服务器地址
  - host: 10.11.19.142
    # 远程端口
    # ssh_port: 22
    # PD 服务器名字
    name: "pd-1"
    # TiDB服务器要连接的通信端口
    client_port: 2379
    # PD服务器节点之间的通信端口.
    peer_port: 2380
    # PD服务器部署文件、启动脚本、配置文件存储目录
    deploy_dir: "/tidb-deploy/pd-2379"
    # PD服务器数据存储目录
    data_dir: "/tidb-data/pd-2379"
    # PD服务器日志存储目录
    log_dir: "/tidb-deploy/pd-2379/log"
    # # numa节点绑定
    # numa_node: "0,1"
    # # The following configs are used to overwrite the `server_configs.pd` values.
    # config:
    #   schedule.max-merge-region-size: 20
    #   schedule.max-merge-region-keys: 200000
  - host: 10.11.19.143
    # ssh_port: 22
    name: "pd-2"
    client_port: 2379
    peer_port: 2380
    deploy_dir: "/tidb-deploy/pd-2379"
    data_dir: "/tidb-data/pd-2379"
    log_dir: "/tidb-deploy/pd-2379/log"
    # numa_node: "0,1"
    # config:
    #   schedule.max-merge-region-size: 20
    #   schedule.max-merge-region-keys: 200000
  - host: 10.11.19.144
    # ssh_port: 22
    name: "pd-3"
    client_port: 2379
    peer_port: 2380
    deploy_dir: "/tidb-deploy/pd-2379"
    data_dir: "/tidb-data/pd-2379"
    log_dir: "/tidb-deploy/pd-2379/log"
    # numa_node: "0,1"
    # config:
    #   schedule.max-merge-region-size: 20
    #   schedule.max-merge-region-keys: 200000

# 服务器配置用于指定TiDB服务器的配置。
tidb_servers:
  # TiDB 服务器 IP 地址 
  - host: 10.11.19.142
    # 远程端口
    # ssh_port: 22
    # 访问TiDB集群端口
    port: 4000
    # TiDB服务器状态信息报告端口
    status_port: 10080
    # TiDB服务器部署文件，启动脚本，配置文件存储目录。
    deploy_dir: "/tidb-deploy/tidb-4000"
    # TiDB服务器日志文件存储目录
    log_dir: "/tidb-deploy/tidb-4000/log"
  - host: 10.11.19.143
    ssh_port: 22
    port: 4000
    status_port: 10080
    deploy_dir: "/tidb-deploy/tidb-4000"
    log_dir: "/tidb-deploy/tidb-4000/log"
  - host: 10.11.19.144
    ssh_port: 22
    port: 4000
    status_port: 10080
    deploy_dir: "/tidb-deploy/tidb-4000"
    log_dir: "/tidb-deploy/tidb-4000/log"

# # Server configs are used to specify the configuration of TiKV Servers.
tikv_servers:
  # TiKV 服务器IP地址
  - host: 10.11.19.142
    # 远程SSH端口
    # ssh_port: 22
    # TiKV 服务器通信端口
    port: 20160
    # 用于报告TiKV服务器状态的通信端口
    status_port: 20180
    # TiKV服务器部署文件，启动脚本，配置文件存储目录。
    deploy_dir: "/tidb-deploy/tikv-20160"
    # TiKV 服务器数据存储目录
    data_dir: "/tidb-data/tikv-20160"
    # TiKV 服务器日志文件存储目录
    log_dir: "/tidb-deploy/tikv-20160/log"
    # 以下配置用于覆盖 "server_configs.tikv" 值。
    config:
      server.labels:
        zone: us
        host: us-host
  # # The ip address of the TiKV Server.
  - host: 10.11.19.143
    # ssh_port: 22
    port: 20160
    status_port: 20180
    deploy_dir: "/tidb-deploy/tikv-20160"
    data_dir: "/tidb-data/tikv-20160"
    log_dir: "/tidb-deploy/tikv-20160/log"
    config:
      server.labels:
        zone: cn
        host: cn-host
  - host: 10.11.19.144
    # ssh_port: 22
    port: 20160
    status_port: 20180
    deploy_dir: "/tidb-deploy/tikv-20160"
    data_dir: "/tidb-data/tikv-20160"
    log_dir: "/tidb-deploy/tikv-20160/log"
    config:
      server.labels:
        zone: flb
        host: flb-host



# 服务器配置用于指定Prometheus服务器的配置。
monitoring_servers:
  # Prometheus 服务器IP
  - host: 10.11.19.142
    # 远程端口
    # ssh_port: 22
    # Prometheus 服务器通信端口.
    port: 9090
    # ng-监控服务通信端口
    ng_port: 12020
    # Prometheus 部署文件，启动脚本，配置文件存储目录。
    deploy_dir: "/tidb-deploy/prometheus-8249"
    # Prometheus 服务器存储目录.
    data_dir: "/tidb-data/prometheus-8249"
    # Prometheus 服务器日志存储目录.
    log_dir: "/tidb-deploy/prometheus-8249/log"

# Grafana服务器的配置。
grafana_servers:
  #  Grafana 服务器IP
  - host: 10.11.19.142
    # 远程端口
    # ssh_port: 22
    # Grafana Web服务客户端(浏览器)访问端口
    port: 3000
    # Grafana部署文件，启动脚本，配置文件存储目录
    deploy_dir: /tidb-deploy/grafana-3000

# Alertmanager服务器的配置  
alertmanager_servers:
  # Alertmanager  服务器IP
  - host: 10.11.19.142
    # 远程端口
    # ssh_port: 22
    # Alertmanager Web 服务客户端(浏览器)访问端口
    web_port: 9093
    # Alertmanager 通信端口
    cluster_port: 9094
    # Alertmanager 部署文件、启动脚本、配置文件存储目录
    deploy_dir: "/tidb-deploy/alertmanager-9093"
    # Alertmanager 服务器数据存放目录
    data_dir: "/tidb-data/alertmanager-9093"
    # Alertmanager 服务器日志存放目录
    log_dir: "/tidb-deploy/alertmanager-9093/log"

````

### TiUP 检查集群是否符合

```bash
tiup cluster check ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]
```

### TiUP 自动修复集群

```bash
tiup cluster check ./topology.yaml --apply --user root [-p] [-i /home/root/.ssh/gcp_rsa]
#  [-i /home/root/.ssh/gcp_rsa]    # 指定密钥的方式
```

### TiUP 自动部署集群

* tidb-test: 自定义集群名字
* v7.1.0: Tidb 版本

```bash
tiup cluster deploy <cluster-name> <cluster-version> ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]
```

### TiUP 安全启动集群

```bash
# 安全启动方式： --init  ， 不能通过无密码的 root 用户登录数据库，你需要记录命令行返回的密码进行后续操作
tiup cluster start <cluster-name> --init

```

### TiUP 查看集群列表

```bash
tiup cluster list
```

### TiUP 检查集群状态

```bash
tiup cluster display <cluster-name>
```

### TIUP 扩容节点

**对 TiKV、TiFlash 及 Binlog 组件的操作**

* 停止已经下线掉的节点的服务
* 清理已经下线掉的节点的相关数据文件
* 更新集群的拓扑，移除已经下线掉的节点

**对其他组件的操作**

* 下线 PD 组件时，会通过 API 将指定节点从集群中删除掉（这个过程很快），然后停掉指定 PD 的服务并且清除该节点的相关数据文件
* 下线其他组件时，直接停止并且清除节点的相关数据文件

> 参考: <https://docs.pingcap.com/zh/tidb/dev/scale-tidb-using-tiup>

**编写扩容拓扑配置**

> 可以使用 tiup cluster edit-config 查看当前集群的配置信息，因为其中的 global 和 server\_configs 参数配置默认会被 scale-out.yml 继承，因此也会在 scale-out.yml 中生效。

```yaml
# scale-out.yml 
tidb_servers:
  - host: 10.11.19.146
    #ssh_port: 22
    port: 4000
    status_port: 10080
    deploy_dir: /tidb-deploy/tidb-4000
    log_dir: /tidb-deploy/tidb-4000/log


tikv_servers:
  - host: 10.11.19.146
    #ssh_port: 22
    port: 20160
    status_port: 20180
    deploy_dir: /tidb-deploy/tikv-20160
    data_dir: /tidb-data/tikv-20160
    log_dir: /tidb-deploy/tikv-20160/log


pd_servers:
  - host: 10.11.19.146
    #ssh_port: 22
    name: pd-4
    client_port: 2379
    peer_port: 2380
    deploy_dir: /tidb-deploy/pd-2379
    data_dir: /tidb-data/pd-2379
    log_dir: /tidb-deploy/pd-2379/log

```

**执行扩容命令**

```bash

# 检查集群存在的潜在风险
tiup cluster check <cluster-name> scale-out.yml --cluster --user root [-p] [-i /home/root/.ssh/gcp_rsa]

# 自动修复集群存在的潜在风险
tiup cluster check <cluster-name> scale-out.yml --cluster --apply --user root [-p] [-i /home/root/.ssh/gcp_rsa]

# 执行 scale-out 命令扩容 TiDB 集群
tiup cluster scale-out <cluster-name> scale-out.yaml --user root -p
```

### TIUP 缩容节点

**正常缩容**

```bash
# 查看 tidb-test 集群
[admin@es1 ~]$ tiup cluster display tidb-test
tiup is checking updates for component cluster ...
Starting component `cluster`: /home/admin/.tiup/components/cluster/v1.12.2/tiup-cluster display tidb-test
Cluster type:       tidb
Cluster name:       tidb-test
Cluster version:    v7.1.0
Deploy user:        tidb
SSH type:           builtin
Dashboard URL:      http://10.11.19.142:2379/dashboard
Grafana URL:        http://10.11.19.142:3000
ID                  Role          Host          Ports        OS/Arch       Status  Data Dir                      Deploy Dir
--                  ----          ----          -----        -------       ------  --------                      ----------
10.11.19.142:9093   alertmanager  10.11.19.142  9093/9094    linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
10.11.19.142:3000   grafana       10.11.19.142  3000         linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
10.11.19.142:2379   pd            10.11.19.142  2379/2380    linux/x86_64  Up|UI   /tidb-data/pd-2379            /tidb-deploy/pd-2379
10.11.19.143:2379   pd            10.11.19.143  2379/2380    linux/x86_64  Up      /tidb-data/pd-2379            /tidb-deploy/pd-2379
10.11.19.144:2379   pd            10.11.19.144  2379/2380    linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
10.11.19.146:2379   pd            10.11.19.146  2379/2380    linux/x86_64  Up      /tidb-data/pd-2379            /tidb-deploy/pd-2379
10.11.19.142:9090   prometheus    10.11.19.142  9090/12020   linux/x86_64  Up      /tidb-data/prometheus-8249    /tidb-deploy/prometheus-8249
10.11.19.142:4000   tidb          10.11.19.142  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
10.11.19.143:4000   tidb          10.11.19.143  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
10.11.19.144:4000   tidb          10.11.19.144  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
10.11.19.146:4000   tidb          10.11.19.146  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
10.11.19.142:20160  tikv          10.11.19.142  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
10.11.19.143:20160  tikv          10.11.19.143  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
10.11.19.144:20160  tikv          10.11.19.144  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
10.11.19.146:20160  tikv          10.11.19.146  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160





# 执行缩容
tiup cluster scale-in tidb-test --node 10.11.19.146:20160 --node 10.11.19.146:4000 --node 10.11.19.146:2379

---
    There are some nodes can be pruned: 
            Nodes: [10.11.19.146:20160]
            You can destroy them with the command: `tiup cluster prune tidb-test`
---


# 如果过了很久都没有消失，可以手动执行： tiup cluster prune tidb-test  清除 Tombstone 的节点信息
```

### TiUP 切换 PD Dashboard 到其他节点

* 版本: v7.1.0
* 集群: tidb-test

**正常切换**

* 通信正常情况下(直接切换)

```bash
# 中控机执行
tiup cluster display tidb-test  # 查看 CLUSTER_VERSION 版本，例如: Cluster version: v7.1.0
tiup ctl:v7.1.0 pd -u http://<原PD:2379> config set dashboard-address http://<新PD:2379>
```

**故障切换**

* 先禁用 TiDB Dashboard
* 重新启用 TiDB Dashboard

```bash
# 中控机执行, 禁用 TiDB Dashboard
tiup ctl:v7.1.0 pd -u http://10.11.19.142:2379 config set dashboard-address none


# 重新查看
tiup cluster display tidb-test --dashboard



# 自动选举 <重新启用 TiDB Dashboard>
tiup ctl:v7.1.0 pd -u http://<任意PD节点>:2379 config set dashboard-address auto


# 允许指定节点  <重新启用 TiDB Dashboard>
tiup ctl:v7.1.0 pd -u http://<任意PD节点>:2379 config set dashboard-address http://<指定PD>:2379
```

> 注意: 若新启用的 TiDB Dashboard 实例与禁用前的实例不一致，将会丢失之前 TiDB Dashboard 实例所存储的本地数据，包括流量可视化历史、历史搜索记录等。

### TiDB Dashboard 安全问题

* 为 root 用户设置强密码
* 为 TiDB Dashboard 创建最小权限用户
* 用防火墙阻止不可信访问
* 通过反向代理使用 TiDB Dashboard

```bash
# 例如: PD WEB UI 地址: http://192.168.0.123:2379/dashboard/
server {
  listen 8033;
  location /dashboard/ {
    proxy_pass http://192.168.0.123:2379/dashboard/;
  }
}
```

> 建议 root 强密码，防火墙配置

## TiDB 备份与恢复实践示例

```bash
# 安装
tiup install br:v7.1.0

# 升级
tiup update br:v7.1.0
```

**配置备份存储 (Amazon S3)**

* 1、在 S3 创建用于保存备份数据的目录 s3://tidb-pitr-bucket/backup-data
  * 创建 bucket: tidb-pitr-bucket
  * 创建备份数据总目录: backup-data
* 2、配置 br 命令行工具和 TiKV 访问 S3 中的备份目录的权限
  * 备份集群的 TiKV 和 br 命令行工具需要的 s3://<桶名>/<文件夹> 权限
    * s3:ListBucket
    * s3:PutObject
    * s3:AbortMultipartUpload。
  * 恢复集群的 TiKV 和 br 命令行工具需要 s3://<桶名>/<文件夹> 的最小权限
    * s3:ListBucket
    * s3:GetObject
    * s3:PutObject。
* 3、规划备份数据保存的目录结构，以及快照（全量）备份和日志备份的目录。
  * 所有快照备份保存在 s3://tidb-pitr-bucket/backup-data/snapshot-${date} 目录下，${date} 为快照备份开始的时间点，如在 2022/05/12 00:01:30 开始的快照备份保存为 s3://tidb-pitr-bucket/backup-data/snapshot-20220512000130。
  * 日志备份保存在 s3://tidb-pitr-bucket/backup-data/log-backup/ 目录下。

### 示例: TiUP 备份快照数据到 AWS S3

```bash
tiup br backup full -u "${PD_IP}:2379" \
--storage "s3://external/backup-20220915?access-key=${access-key}&secret-access-key=${secret-access-key}"
```

### 示例: TiUP 从 AWS S3 恢复快照备份数据

```bash
tiup br  restore full -u "${PD_IP}:2379" \
--storage "s3://external/backup-20220915?access-key=${access-key}&secret-access-key=${secret-access-key}"
```

### TIUP 实战备份

> AWS参考格式: URL格式参考: <https://docs.pingcap.com/zh/tidb/stable/backup-and-restore-storages>

* 运行日志备份，持续不断备份数据库数据变更；
* 每隔两天在零点左右进行一次快照备份；
* 保存 30 天内的快照备份和日志备份数据，清理超过 30 天的备份数据。

**1、执行日志备份(必须)**

* 结合快照备份，可以恢复到历史指定时间点的用户数据
* 日志备份持续不断将数据库变更数据备份到 S3 中，(实测默认是间隔2分30秒左右)

```bash
# 启动日志备份任务后，日志备份进程会在 TiKV 集群运行，持续不断将数据库变更数据备份到 S3 中。
# task-name: 自定义名字

tiup br log start --task-name=${task-name} --pd="${PD_IP}:2379" \
--storage="s3://tidb-pitr-bucket/backup-data/log-backup?access-key=${access-key}&secret-access-key=${secret-access-key}"


# 查看所有任务
tiup br log status --pd="${PD_IP}:2379"

# 查看某一个任务
tiup br log status --task-name=${task-name} --pd="${PD_IP}:2379"
```

**2、执行快照备份(必须)**

* 可以借助 Contab 定时任务做备份

```bash
# PD_IP: PD 服务IP地址
# TIME_NOW_STR1: S3备份文件夹名字
# TIME_NOW_STR2: 时间点
# ACCESS_KEY: S3 access_key
# SECRET_ACCESS_KEY: S3 密钥

PD_IP="10.11.19.142"
TIME_NOW_STR1=`date +%Y%m%d%H%M%S`
TIME_NOW_STR2=`date +%F\ %T`
ACCESS_KEY="AKIASFD2HMQ7LSDXZ6H2"
SECRET_ACCESS_KEY="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"

tiup br backup full --pd="${PD_IP}:2379" \
--storage="s3://tidb-pitr-bucket/backup-data/snapshot-${TIME_NOW_STR1}?access-key=${ACCESS_KEY}&secret-access-key=${SECRET_ACCESS_KEY}" \
--backupts="${TIME_NOW_STR2}"


# 可根据 echo $? 做执行快照备份成功判断
```

### TIUP 恢复备份

* 恢复的时候需要先暂停日志备份任务

```bash
# 假如只有一个 pitr 日志备份任务正在运行, 先暂停，再执行恢复
tiup br log status  --pd="{PD_IP}:2379"
tiup br log stop --task-name=pitr --pd="{PD_IP}:2379"
```

**恢复指定快照日期**

```bash
# 快照日期
SNAPSHOT_TIME="202209150000"

tiup br restore full -u "${PD_IP}:2379" \
--storage "s3://tidb-pitr-bucket/backup-data/snapshot-${SNAPSHOT_TIME}?access-key=${access-key}&secret-access-key=${secret-access-key}"
```

**执行 PITR(恢复到指定时间位置)**

* 假设你接到需求，要准备一个(新)集群查询 2022/05/15 18:00:00 时间点的用户数据。
* 此时，你可以制定 PITR 方案，恢复 2022/05/14 的快照备份和该快照到 2022/05/15 18:00:00 之间的日志备份数据，从而收集到目标数据。

```bash
# 1、恢复 2022-05-14 00:00:00 快照备份
# 2、该快照到 2022-05-15 18:00:00 之间的日志备份数据，从而收集到目标数据
S3_DIR_TIME="20220514000000"
RESTORE_TIME="2022-05-15 18:00:00+0800"



tiup br restore point --pd="${PD_IP}:2379" \
--storage='s3://tidb-pitr-bucket/backup-data/log-backup' \
--full-backup-storage="s3://tidb-pitr-bucket/backup-data/snapshot-${S3_DIR_TIME}?access-key=${access-key}&secret-access-key=${secret-access-key}" \
--restored-ts ${RESTORE_TIME}
```

### TiDB 日志备份与 PITR 命令行手册

> 官网更详细: <https://docs.pingcap.com/zh/tidb/stable/br-pitr-manual#%E6%9F%A5%E8%AF%A2%E6%97%A5%E5%BF%97%E5%A4%87%E4%BB%BD%E4%BB%BB%E5%8A%A1>

### 日常巡检

> 官网更详细： <https://docs.pingcap.com/zh/tidb/stable/daily-check>

### MYSQL|TIDB 全量迁移

* 1、MYSQL|TIDB 把数据先全量备份导出，sql 结尾文件
* 2、sql 文件导入到 TIDB 集群中

**安装组件**

```bash
# 中控机
tiup install dumpling tidb-lightning
```

* dumpling： 可以把存储在 TiDB 或 MySQL 中的数据导出为 SQL 或 CSV 格式，用于逻辑全量备份
  * filetype: sql/csv 两种类型
  * B: 备份指定数据库
  * t: 线程数
  * o: 存储路径
  * r: 指定单个文件的最大行数
  * F: 指定单个文件的最大大小，单位为 MiB，可接受类似 5GiB 或 8KB 的输入。
  * 更多参考： <https://docs.pingcap.com/zh/tidb/stable/dumpling-overview>
* Lightning： 是用于从静态文件导入 TB 级数据到 TiDB 集群的工具，常用于 TiDB 集群的初始化数据导入。
  * 物理导入模式：快(100 \~ 500 GiB/小时)-->无法提供服务，常用于初始化导入
  * 逻辑导入模式：慢(10 \~ 50 GiB/小时)-->可提供服务，常用于生产环境线上有数据
  * 更多参考： <https://docs.pingcap.com/zh/tidb/stable/tidb-lightning-overview>

> 注意： 如果你想使用 TiDB Lightning 将该文件加载到 TiDB 实例中，建议将 -F 选项的值保持在 256 MiB 或以下 注意： 如果导出的单表大小超过 10 GB，强烈建议使用 -r 和 -F 参数。

**导出数据**

```bash
# 全量导出: 比如全量迁移 MYSQL 远程数据库的数据
tiup dumpling -h 10.11.19.247 -u root -p 123456 -P 3306  --filetype sql -t 8 -o /tmp/test -r 200000 -F256MiB


# 指定库导出: 比如远程服务器 MYSQL 数据库: fastapi ， 用户名/密码: fastapi/fastapi
tiup dumpling -h 10.11.19.247 -u fastapi -p fastapi -P 3306  -B fastapi  --filetype sql -t 8 -o /tmp/test -r 200000 -F256MiB


# 导出到 Amazon S3 云盘
export Bucket="s3_bucket"
export Folder="back-data"
export AWS_ACCESS_KEY_ID="xxxx"
export AWS_SECRET_ACCESS_KEY="xxxx"

tiup dumpling -h 10.11.19.247 -u root -p 123456 -P 3306 -r 200000 -o "s3://${Bucket}/${Folder}?access-key=${AWS_ACCESS_KEY_ID}&secret-access-key=${AWS_SECRET_ACCESS_KEY}"
```

**导入数据**

> /tmp/test/ 刚刚导出的 sql 目录地址

* 配置 tidb-lightning.toml

```ini
[lightning]
# 日志
level = "info"
file = "tidb-lightning.log"

[tikv-importer]
# 选择使用的导入模式, local 物理导入模式， tidb 逻辑导入模式
backend = "tidb"
# 设置排序的键值对的临时存放地址，目标路径需要是一个空目录
sorted-kv-dir = "/tmp/ssd/sorted-kv-dir"

[mydumper]
# 源数据目录。
data-source-dir = "/tmp/test/"

# 配置通配符规则，默认规则会过滤 mysql、sys、INFORMATION_SCHEMA、PERFORMANCE_SCHEMA、METRICS_SCHEMA、INSPECTION_SCHEMA 系统数据库下的所有表
# 若不配置该项，导入系统表时会出现“找不到 schema”的异常
filter = ['*.*', '!mysql.*', '!sys.*', '!INFORMATION_SCHEMA.*', '!PERFORMANCE_SCHEMA.*', '!METRICS_SCHEMA.*', '!INSPECTION_SCHEMA.*']
[tidb]
# 目标集群的信息
host = "10.11.19.142"
port = 4000
user = "root"
password = "rootroot"
# 表架构信息在从 TiDB 的“状态端口”获取。
status-port = 10080
# 集群 pd 的地址
pd-addr = "10.11.19.142:2379"
```

* 启动 tidb-lightning

```bash
#!/bin/bash
nohup tiup tidb-lightning -config tidb-lightning.toml > nohup.out &

# 导入完毕后，TiDB Lightning 会自动退出。若导入成功，日志的最后一行会显示 tidb lightning exit。
```

tiup dmctl --master-addr 10.11.19.141:8261 operate-source create source1.yaml

### MYSQL|TIDB 不停机迁移

> 部署参考: <https://docs.pingcap.com/zh/tidb-data-migration/v5.3/deploy-a-dm-cluster-using-tiup> 具体迁移参考: <https://docs.pingcap.com/zh/tidb-data-migration/v5.3/migrate-data-using-dm>

**DM 集群安装组件**

```bash
tiup install dm dmctl
```

**编辑初始化配置文件**

```bash
tiup dm template > dm.yaml


[admin@es1 ~]$ cat dm.yaml 
# 这里没有使用高可用集群方式
---
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/home/tidb/dm/deploy"
  data_dir: "/home/tidb/dm/data"
  # arch: "amd64"

master_servers:
  - host: 10.11.19.141

```

**执行部署命令**

```bash
# tiup list dm-master 来查看 TiUP 支持的最新版本。
tiup dm deploy dm-test ${version} ./dm.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]
# 预期日志结尾输出会有 Deployed cluster `dm-test` successfully 关键词，表示部署成功。
```

**检查**

```bash
tiup dm list               # 查看 TiUP 管理的集群情况
tiup dm display dm-test    # 检查部署的 DM 集群情况
tiup dm start dm-test      # 启动集群
tiup dm display dm-test    # 验证集群运行状态
```
