dumpling备份数据库并上传到oss上
参考文档:
https://docs.pingcap.com/zh/tidb/stable/dumpling-overview
一、介绍
通过数据导出工具 Dumpling,你可以把存储在 TiDB 或 MySQL 中的数据导出为 SQL 或 CSV 格式,用于逻辑全量备份。Dumpling 也支持将数据导出到 Amazon S3 中。
二、安装
你可以通过下列任意方式获取 Dumpling:
- TiUP 执行
tiup install dumpling
命令。获取后,使用tiup dumpling ...
命令运行 Dumpling。 - 下载包含 Dumpling 的 tidb-toolkit 安装包。
- https://docs.pingcap.com/zh/tidb/stable/download-ecosystem-tools
三、从 TiDB/MySQL 导出数据
1、备份用户需要的最小权限
- SELECT
- RELOAD
- LOCK TABLES
- REPLICATION CLIENT
- PROCESS
2、通过并发提高 Dumpling 的导出效率
默认情况下,导出的文件会存储到 ./export-<current local time>
目录下。常用选项如下:
-t
用于指定导出的线程数。增加线程数会增加 Dumpling 并发度提高导出速度,但也会加大数据库内存消耗,因此不宜设置过大。-r
选项用于指定单个文件的最大记录数,或者说,数据库中的行数。开启后 Dumpling 会开启表内并发,提高导出大表的速度。当上游为 TiDB 且版本为 v3.0 或更新版本时,设置-r
参数大于 0 表示使用 TiDB region 信息划分表内并发,具体取值不影响划分算法。对上游为 MySQL 且表的主键是 int 的场景,该参数也有表内并发效果。--compress gzip
选项可以用于压缩导出的数据。压缩可以显著降低导出数据的大小,同时如果存储的写入 I/O 带宽不足,可以使用该选项来加速导出。但该选项也有副作用,由于该选项会对每个文件单独压缩,因此会增加 CPU 消耗。
利用以上选项可以提高 Dumpling 的导出速度。
3、 Linux系统安装ossutil。
- 参考文档:https://help.aliyun.com/document_detail/120075.htm?spm=a2c4g.11186623.0.0.3bc021a1JRIE8S#concept-303829
-
运行以下命令下载ossutil。
wget https://gosspublic.alicdn.com/ossutil/1.7.14/ossutil64
注意 复制下载地址时会自动加上spm编码内容,使用wget命令下载时注意删除链接中
?spm=xxxx
的内容。 -
运行以下命令修改文件执行权限。
chmod 755 ossutil64
-
使用交互式配置生成配置文件。
-
输入配置命令。
./ossutil64 config
-
根据提示设置配置文件路径。
建议直接按回车使用默认配置文件的路径。
请输入配置文件名,文件名可以带路径(默认为:/home/user/.ossutilconfig,回车将使用默认路径。 如果用户设置为其它路径,在使用命令时需要将--config-file选项设置为该路径):
ossutil默认使用/home/user/.ossutilconfig作为配置文件,若您设置了配置文件的路径,则每次使用命令时需增加**-c选项指定配置文件。例如配置文件保存为/home/config,使用ls**时,命令格式如下:
./ossutil64 ls oss://examplebucket -c /home/config
-
根据提示设置工具的语言。
请输入语言CH或EN。工具使用的语言默认与操作系统保持一致。该配置项将在此次config命令设置成功后生效。
-
根据提示分别设置Endpoint、AccessKey ID、AccessKey Secret和STSToken参数。
参数说明如下:
参数 说明 endpoint 填写Bucket所在地域的Endpoint。关于各地域Endpoint的更多信息,请参见访问域名和数据中心。您也可以增加 http://
或https://
指定ossutil访问OSS使用的协议,默认使用HTTP协议。例如,使用HTTPS协议访问华东1(杭州)的Bucket,设置为https://oss-cn-hangzhou.aliyuncs.com
。accessKeyID 填写账号的AccessKey。使用阿里云账号或RAM用户访问时,AccessKey的获取方式,请参见创建AccessKey。使用STS临时授权账号访问时,AccessKey的获取方式,请参见使用STS临时访问凭证访问OSS。 accessKeySecret stsToken 使用STS临时授权账号访问OSS时需要配置该项,否则置空即可。关于stsToken的生成方式,请参见临时访问凭证。 说明 关于配置文件的更多信息,请参见config。
-
运行以下命令,验证是否已成功安装ossutil。
./ossutil64
如果屏幕中输出ossutil所有支持的命令,表明已成功安装ossutil。
-
4、导出脚本
backup-mysql-to-oss.sh
#!/bin/bash
db_host=IP
db_port=3306
db_user=root
db_password='Pass@w0rd'
BACKUPFILE_PATH=/data/selfbuit-tools-mysql-db-yearning-jumpserver-backup
Ding_Webhook_Token='**dingding_webhook**'
# 要导出的库名以逗号分割
databases=dbname1,dbname2
DATE=$(date +"%F-%H%M")
mkdir -p $BACKUPFILE_PATH/$DATE/databases-sql
echo "$(date +"%F %H:%M:%S") 1. 开始进行备份: $databases"
dumpling \
-c gzip \
-h $source_db_host \
-P $source_db_port \
-u $source_db_user \
-p $source_db_password \
-B $databases \
--filter "*.*" \
--filetype sql \
--threads 4 \
-o $BACKUPFILE_PATH/$DATE/databases-sql \
-F 256MiB \
--logfile $BACKUPFILE_PATH/$DATE/export-task.log >$BACKUPFILE_PATH/$DATE/dumpling-nohupout.log 2>&1
if [ $? -eq 0 ];then
echo "$(date +"%F %H:%M:%S") 2. 备份完成"
echo "$(date +"%F %H:%M:%S") 已备份Databases: $databases" > $BACKUPFILE_PATH/$DATE/backup-meta
rm -f $BACKUPFILE_PATH/$DATE/dumpling-nohupout.log $BACKUPFILE_PATH/$DATE/export-task.log
cd $BACKUPFILE_PATH/
tar -zcf backup-$DATE.tar.gz $DATE
echo "$(date +"%F %H:%M:%S") 3. 备份压缩已完成"
echo "$(date +"%F %H:%M:%S") 4. 正在上传备份压缩文件至OSS"
ossutil64 cp $BACKUPFILE_PATH/backup-$DATE.tar.gz oss://BucketName/db-backup/backup-$DATE.tar.gz 2>&1 > /dev/null
echo "$(date +"%F %H:%M:%S") 5. 已完成上传备份压缩文件至OSS"
curl -s https://oapi.dingtalk.com/robot/send?access_token="$Ding_Webhook_Token" \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "markdown",
"markdown": {
"title": "数据库备份",
"text": "'$DATE'\n MySQL已备份以下库并上传至OSS:\n> '$databases'"
},
"at": {
"isAtAll": true
}
}' 2>&1 > /dev/null
echo "$(date +"%F %H:%M:%S") 6. 已发送钉钉通知"
#rm -rf $BACKUPFILE_PATH/$DATE $BACKUPFILE_PATH/selfbuit-mysql-backup-$DATE.tar.gz
echo "$(date +"%F %H:%M:%S") 7. 已删除临时存储备份"
fi
5、参数介绍
-h
、-P
、-u
分别代表地址、端口、用户。如果需要密码验证,可以使用-p $YOUR_SECRET_PASSWORD
将密码传给 Dumpling。-o
用于选择存储导出文件的目录,支持本地文件路径或外部存储 URL 格式。-t
用于指定导出的线程数。增加线程数会增加 Dumpling 并发度提高导出速度,但也会加大数据库内存消耗,因此不宜设置过大。一般不超过 64。-r
用于指定单个文件的最大行数,指定该参数后 Dumpling 会开启表内并发加速导出,同时减少内存使用。当上游为 TiDB 且版本为 v3.0 或更新版本时,设置-r
参数大于 0 表示使用 TiDB region 信息划分表内并发,具体取值不影响划分算法。对上游为 MySQL 且表的主键是 int 的场景,该参数也有表内并发效果。-F
选项用于指定单个文件的最大大小,单位为MiB
,可接受类似5GiB
或8KB
的输入。如果你想使用 TiDB Lightning 将该文件加载到 TiDB 实例中,建议将-F
选项的值保持在 256 MiB 或以下。
如果导出的单表大小超过 10 GB,强烈建议使用 -r
和 -F
参数。
5、主要选项表
主要选项 | 用途 | 默认值 |
---|---|---|
-V 或 --version | 输出 Dumpling 版本并直接退出 | |
-B 或 --database | 导出指定数据库 | |
-T 或 --tables-list | 导出指定数据表 | |
-f 或 --filter | 导出能匹配模式的表,语法可参考 table-filter | *.* (导出所有库表) |
–case-sensitive | table-filter 是否大小写敏感 | false,大小写不敏感 |
-h 或 --host | 连接的数据库主机的地址 | “127.0.0.1” |
-t 或 --threads | 备份并发线程数 | 4 |
-r 或 --rows | 将 table 划分成 row 行数据,一般针对大表操作并发生成多个文件。 | |
-L 或 --logfile | 日志输出地址,为空时会输出到控制台 | “” |
–loglevel | 日志级别 {debug,info,warn,error,dpanic,panic,fatal} | “info” |
–logfmt | 日志输出格式 {text,json} | “text” |
-d 或 --no-data | 不导出数据,适用于只导出 schema 场景 | |
–no-header | 导出 csv 格式的 table 数据,不生成 header | |
-W 或 --no-views | 不导出 view | true |
-m 或 --no-schemas | 不导出 schema,只导出数据 | |
-s 或–statement-size | 控制 INSERT SQL 语句的大小,单位 bytes | |
-F 或 --filesize | 将 table 数据划分出来的文件大小,需指明单位(如 128B , 64KiB , 32MiB , 1.5GiB ) | |
–filetype | 导出文件类型(csv/sql) | “sql” |
-o 或 --output | 导出文件路径 | “./export-${time}” |
-S 或 --sql | 根据指定的 sql 导出数据,该选项不支持并发导出 | |
–consistency | flush: dump 前用 FTWRL snapshot: 通过 TSO 来指定 dump 某个快照时间点的 TiDB 数据 lock: 对需要 dump 的所有表执行 lock tables read 命令 none: 不加锁 dump,无法保证一致性 auto: MySQL 默认用 flush, TiDB 默认用 snapshot | “auto” |
–snapshot | snapshot tso,只在 consistency=snapshot 下生效 | |
–where | 对备份的数据表通过 where 条件指定范围 | |
-p 或 --password | 连接的数据库主机的密码 | |
-P 或 --port | 连接的数据库主机的端口 | 4000 |
-u 或 --user | 连接的数据库主机的用户名 | “root” |
–dump-empty-database | 导出空数据库的建库语句 | true |
–ca | 用于 TLS 连接的 certificate authority 文件的地址 | |
–cert | 用于 TLS 连接的 client certificate 文件的地址 | |
–key | 用于 TLS 连接的 client private key 文件的地址 | |
–csv-delimiter | csv 文件中字符类型变量的定界符 | ‘"’ |
–csv-separator | csv 文件中各值的分隔符 | ‘,’ |
–csv-null-value | csv 文件空值的表示 | “\N” |
–escape-backslash | 使用反斜杠 (\ ) 来转义导出文件中的特殊字符 | true |
–output-filename-template | 以golang template 格式表示的数据文件名格式 支持 DB Table、Index 三个参数 分别表示数据文件的库名、表名、分块 ID | {{.DB}}.{{.Table}}.{{.Index}} |
–status-addr | Dumpling 的服务地址,包含了 Prometheus 拉取 metrics 信息及 pprof 调试的地址 | “:8281” |
–tidb-mem-quota-query | 单条 dumpling 命令导出 SQL 语句的内存限制,单位为 byte,默认为 32 GB | 34359738368 |