TiDB 安装与性能测试实践(下)

网友投稿 638 2024-03-24



第六部分 数据备份及数据迁移

一、TiDB Data Migration (DM)安装部署

TiDB Data Migration (DM) 是一款便捷的数据迁移工具,支持从与 MySQL 协议兼容的数据库(MySQL、MariaDB、Aurora MySQL)到 TiDB 的全量数据迁移和增量数据同步

TiDB 安装与性能测试实践(下)

1.解压DM包

在TOOLS的文件夹中,找到dm-master-v6.5.2-linux-amd64.tar.gz包,解压到本地

# tar zxvf dm-master-v6.5.2-linux-amd64.tar.gz

2.配置文件

编写安装配置拓扑文件

# vim dmtopo.yaml

编辑如下内容,注意格式,这里测试时只用单节点来部署。

注意事项:要和TIDB的数据库拓扑IP区分开,否则会造成TIDB集群的granafa和dashboard监控因IP冲突而导致访问失效。

---

global:

  user: "tidb"

  ssh_port: 22

  deploy_dir: "/home/tidb/dm/deploy"

  data_dir: "/home/tidb/dm/data"

  # arch: "amd64"

master_servers:

  - host: 21.72.124.42

worker_servers:

  - host: 21.72.124.42

monitoring_servers:

- host: 21.72.124.42

grafana_servers:

  - host: 21.72.124.42

alertmanager_servers:

  - host: 21.72.124.42

3.安装

安装DM组件

# tiup dm deploy dm-test v6.5.2 ./dmtopo.yaml --user tidb

4.查看状态

# tiup dm display dm-test

二、DM任务设置

1.配置数据源

(1)加密数据源密码

# tiup dmctl encrypt abc!@#123

(2)编写数据源配置文件

source-id: "mysql-01"    # 数据源 ID,在数据迁移任务配置和 dmctl 命令行中引用该 source-id 可以关联到对应的数据源

from:

  host: "127.0.0.1"

  port: 3306

  user: "root"

  password: "MKxn0Qo3m3XOyjCnhEMtsUCm83EhGQDZ/T4=" # 推荐使用 dmctl 对上游数据源的用户密码加密之后的密码

  security:                                        # 上游数据源 TLS 相关配置。如果没有需要则可以删除

    ssl-ca: "/path/to/ca.pem"

    ssl-cert: "/path/to/cert.pem"

ssl-key: "/path/to/key.pem"

2.创建数据源

# tiup dmctl --master-addr 21.72.124.42:8261 operate-source create

source-mysql-01.yaml

3.配置任务

# vim dm-task.yaml

#注意文件格式

name: testdm

task-mode: all

target-database:

  host: "127.0.0.1"

  port: 4000

  user: "root"

  password: "" # 如果密码不为空,则推荐使用经过 dmctl 加密的密文

# 填写一个或多个所需同步的数据源信息

mysql-instances:

- source-id: "mysql-01"

    block-allow-list:  "ba-rule1"

block-allow-list:

  ba-rule1:

do-dbs: ["testdm"]

任务配置文件分为以下几部分:

    # 全局配置

## 基本信息配置

## 功能配置集

# 实例配置

完整配置文件实例请参考https://docs.pingcap.com/zh/tidb/v6.5/task-configuration-file-full

4.创建数据迁移任务

# tiup dmctl --master-addr 127.0.0.1:8261 start-task testdm-task.yaml

结果如下:

tiup is checking updates for component dmctl ...

Starting component `dmctl`: /root/.tiup/components/dmctl/v7.3.0/dmctl/dmctl --master-addr 127.0.0.1:8261 start-task testdm-task.yaml

{

    "result": true,

    "msg": "",

    "sources": [

        {

            "result": true,

            "msg": "",

            "source": "mysql-01",

            "worker": "dm-192.168.80.201-8262"

        }

    ],

"checkResult": "pre-check is passed. "

}

5.任务相关

(1)查询状态

query-status

示例:

# tiup dmctl --master-addr 127.0.0.1:8261 query-statustestdm

(2)暂停任务

pause-task [-s "mysql-replica-01"] task-name

示例:

# tiup dmctl --master-addr 127.0.0.1:8261 pause-task  testdm

(3)恢复任务

resume-task [-s "mysql-replica-01"] task-name

示例:

# tiup dmctl --master-addr 127.0.0.1:8261 resume-task testdm

(4)停止任务

stop-task [-s "mysql-replica-01"] task-name

示例:

# tiup dmctl --master-addr 127.0.0.1:8261 stop-task testdm

6.非常规数据迁移

(1)分库分表数据迁移

(2)上下游列数量不一致

(3)增量数据校验、迁移

三、Dumpling数据导出工具

使用数据导出工具 Dumpling,你可以把存储在 TiDB 或 MySQL 中的数据导出为 SQL 或 CSV 格式,用于逻辑全量备份。

1.安装Dumpling

[tidb@localhost] #cd  /home/tidb_install/tidb-enterprise-server-v6.5.2-linux-amd64

[tidb@localhost] #tar -zxvf dumpling-v6.5.2-linux-amd64.tar.gz

会解压出一个dumpling文件

2.导出数据

导出某库到本地文件夹语句如下:

[tidb@localhost]#tiup dumpling  -uroot  -P13390  -h21.72.124.42  -o /home/dump -B P6ODS

参数解释:

-u 导出数据库的用户名

-P 导出数据库的端口号

-h 导出数据库的IP地址

-o 要导入的文件夹,需有相应权限

-B 导出的数据库名称schema

3.Dumpling 主要选项表

-V 或 --version

输出 Dumpling 版本并直接退出

-B 或 --database

导出指定数据库

-T 或 --tables-list

导出指定数据表

-f 或 --filter

导出能匹配模式的表,语法可参考 table-filter

--case-sensitive

table-filter 是否大小写敏感

-h 或 --host

连接的数据库主机的地址

-t 或 --threads

备份并发线程数

-r 或 --rows

用于开启表内并发加速导出。默认值是 0,表示不开启。取值大于 0 表示开启,取值是 INT 类型。当数据源为 TiDB 时,设置 -r 参数大于 0 表示使用 TiDB region 信息划分区间,同时减少内存使用。具体取值不影响划分算法。对数据源为 MySQL 且表的主键是 INT 的场景,该参数也有表内并发效果。

-L 或 --logfile

日志输出地址,为空时会输出到控制台

--loglevel

日志级别 {debug,info,warn,error,dpanic,panic,fatal}

--logfmt

日志输出格式 {text,json}

-d 或 --no-data

不导出数据,适用于只导出 schema 场景

--no-header

导出 csv 格式的 table 数据,不生成 header

-W 或 --no-views

不导出 view

-m 或 --no-schemas

不导出 schema,只导出数据

-s 或--statement-size

控制 INSERT SQL 语句的大小,单位 bytes

-F 或 --filesize

将 table 数据划分出来的文件大小,需指明单位(如 128B, 64KiB, 32MiB, 1.5GiB)

--filetype

导出文件类型(csv/sql)

-o 或 --output

导出本地文件路径或外部存储 URL 格式

-S 或 --sql

根据指定的 sql 导出数据,该选项不支持并发导出

--consistency

flush: dump 前用 FTWRLsnapshot: 通过 TSO 来指定 dump 某个快照时间点的 TiDB 数据lock: 对需要 dump 的所有表执行 lock tables read 命令none: 不加锁 dump,无法保证一致性auto: 对 MySQL 使用 --consistency flush;对 TiDB 使用 --consistency snapshot

--snapshot

snapshot tso,只在 consistency=snapshot 下生效

--where

对备份的数据表通过 where 条件指定范围

-p 或 --password

连接的数据库主机的密码

-P 或 --port

连接的数据库主机的端口

-u 或 --user

连接的数据库主机的用户名

--dump-empty-database

导出空数据库的建库语句

--ca

用于 TLS 连接的 certificate authority 文件的地址

--cert

用于 TLS 连接的 client certificate 文件的地址

--key

用于 TLS 连接的 client private key 文件的地址

--csv-delimiter

csv 文件中字符类型变量的定界符

--csv-separator

csv 文件中各值的分隔符,如果数据中可能有逗号,建议源文件导出时分隔符使用非常见组合字符

--csv-null-value

csv 文件空值的表示

--escape-backslash

使用反斜杠 (\) 来转义导出文件中的特殊字符

--output-filename-template

以 golang template 格式表示的数据文件名格式支持 {{.DB}}、{{.Table}}、{{.Index}} 三个参数分别表示数据文件的库名、表名、分块 ID

--status-addr

Dumpling 的服务地址,包含了 Prometheus 拉取 metrics 信息及 pprof 调试的地址

--tidb-mem-quota-query

单条 dumpling 命令导出 SQL 语句的内存限制,单位为 byte。对于 v4.0.10 或以上版本,若不设置该参数,默认使用 TiDB 中的 mem-quota-query 配置项值作为内存限制值。对于 v4.0.10 以下版本,该参数值默认为 32 GB

--params

为需导出的数据库连接指定 session 变量,可接受的格式: "character_set_client=latin1,character_set_connection=latin1"

-c 或 --compress

压缩 Dumpling 导出的 CSV、SQL 数据与表结构文件为指定格式,支持 "gzip"、"snappy" 和 "zstd" 压缩算法

四、TiDB Lightning数据导入工具

TiDB Lightning 是用于从静态文件导入 TB 级数据到 TiDB 集群的工具,常用于 TiDB 集群的初始化数据导入。

1.安装部署

下载 TiDB Lightning 安装包

解压 Lightning 压缩包即可获得 tidb-lightning 可执行文件。

tar -zxvf tidb-lightning-${version}-linux-amd64.tar.gz

chmod +x tidb-lightning

2.导入前准备

(1)检查目标数据库

特性

作用域

所需权限

备注

必需

基本功能

目标 table

CREATE,SELECT,INSERT,UPDATE,DELETE,DROP,ALTER

DROP 仅 tidb-lightning-ctl 在执行 checkpoint-destroy-all 时需要

目标 database

CREATE

必需

Logical Import Mode

information_schema.columns

SELECT

Physical Import Mode

mysql.tidb

SELECT

-

SUPER

-

RESTRICTED_VARIABLES_ADMIN,RESTRICTED_TABLES_ADMIN

当目标 TiDB 开启 SEM

推荐

冲突检测,max-error

lightning.task-info-schema-name 配置的 schema

SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

如不需要,该值必须设为""

可选

并行导入

lightning.meta-schema-name 配置的 schema

SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

如不需要,该值必须设为""

可选

checkpoint.driver = "mysql"

checkpoint.schema 设置

SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

使用数据库而非文件形式存放 checkpoint 信息时需要

(2)目标数据库所需空间

目标 TiKV 集群必须有足够空间接收新导入的数据。除了标准硬件配置以外,目标 TiKV 集群的总存储空间必须大于 数据源大小 × 副本数量 × 2。例如集群默认使用 3 副本,那么总存储空间需为数据源大小的 6 倍以上。公式中的 2 倍可能难以理解,其依据是以下因素的估算空间占用:

索引会占据额外的空间

RocksDB 的空间放大效应

目前无法精确计算 Dumpling 从 MySQL 导出的数据大小,但你可以用下面 SQL 语句统计信息表的 data_length 字段估算数据量:

统计所有 schema 大小,单位 MiB,注意修改 ${schema_name}

SELECT table_schema, SUM(data_length)/1024/1024 AS data_length, SUM(index_length)/1024/1024 AS index_length, SUM(data_length+index_length)/1024/1024 AS sum FROM information_schema.tables WHERE table_schema = "${schema_name}" GROUP BY table_schema;

统计最大单表,单位 MiB,注意修改 ${schema_name}

SELECT table_name, table_schema, SUM(data_length)/1024/1024 AS data_length, SUM(index_length)/1024/1024 AS index_length, SUM(data_length+index_length)/1024/1024 AS sum FROM information_schema.tables WHERE table_schema = "${schema_name}" GROUP BY table_name,table_schema ORDER BY sum  DESC LIMIT 5;

3.数据源

TiDB Lightning 支持从多种类型的文件导入数据到 TiDB 集群。

通过以下配置为 TiDB Lightning 指定数据文件所在位置。

[mydumper]

# 本地源数据目录或 S3 等外部存储 URL

data-source-dir = "/data/my_database"

TiDB Lightning 运行时将查找 data-source-dir 中所有符合命令规则的文件。

数据源命名规则如下:

${db_name}.${table_name}-schema.sql

${db_name}-schema-create.sql

${db_name}.${table_name}.${csv|sql|parquet}

${db_name}.${table_name}.001.${csv|sql|parquet}

${db_name}.${table_name}.${csv|sql|parquet}.{compress}

CSV格式的数据

CSV 格式可在 tidb-lightning.toml 文件中 [mydumper.csv] 下配置。大部分设置项在 MySQL [LOAD DATA] 语句中都有对应的项目。

SQL格式的数据

TiDB Lightning 在处理 SQL 文件时,由于无法对单个文件进行快速分割,因此无法通过增加并发提高单个文件的导入速度。鉴于此,导出数据为 SQL 文件时应尽量避免单个 SQL 文件过大,通常单文件在 256MiB 左右可以达到最佳性能。

4.导入模式

(1)Physical Import Mode

Physical Import Mode 不经过 SQL 接口,而是直接将数据以键值对的形式插入 TiKV 节点,是一种高效、快速的导入模式。使用 Physical Import Mode 时,单个 Lightning 实例可导入的数据量为 10 TiB

Physical Import Mode 对应的后端模式为 local。

使用限制:

B Lightning 实例向同一 TiDB 集群导入数据,而应考虑使用并行导入特性。

不可同时使用 Physical Import Mode 和 Logical Import Mode 导入同一 TiDB 集群。

(2)Logical Import Mode

在 Logical Import Mode 下,TiDB Lightning 先将数据编码成 SQL,然后直接运行这些 SQL 语句进行数据导入。对于已有数据、对外提供服务的 TiDB 集群,推荐使用 Logical Import Mode 导入数据。Logical Import Mode 的行为与正常执行 SQL 并无差异,可保证 ACID。

Logical Import Mode 对应的后端模式为 tidb。

使用限制:

5.配置文件

(1)使用 Physical Import Mode的配置文件示例如下:

[lightning]

# 日志

level = "info"

file = "tidb-lightning.log"

max-size = 128 # MB

max-days = 28

max-backups = 14

# 启动之前检查集群是否满足最低需求。

check-requirements = true

[mydumper]

# 本地源数据目录或外部存储 URL

data-source-dir = "/data/my_database"

[tikv-importer]

# 导入模式配置,设为 local 即使用 Physical Import Mode

backend = "local"

# 冲突数据处理方式

duplicate-resolution = remove

# 本地进行 KV 排序的路径。

sorted-kv-dir = "./some-dir"

# 限制 TiDB Lightni

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:云原生数据库前景,再造数据库时代的未来
下一篇:TiDB 实现读写分离的内部机制探究
相关文章