# 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    # 验证集群运行状态
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://close.gitbook.io/yun-wei-bi-ji/centos/mysql/14-tiup-tidb.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
