MySQLPump:利用并行参数高效备份数据库

前言

在MySQL数据库管理中,备份是保障数据安全与业务连续性的关键环节。随着数据量的不断增长,传统备份方式逐渐暴露出效率瓶颈。MySQL 5.7引入的mysqlpump工具,以其强大的多线程备份能力、丰富特性和灵活配置,为数据库备份工作带来了新的解决方案。

图片

核心特性

并行处理加速备份

mysqlpump支持并行备份多个数据库或表,显著提升备份速度。通过调整并行度参数,如--default-parallelism和--parallel-schemas,可以根据服务器资源灵活分配任务,充分利用多核CPU的优势,将备份时间大幅缩短。

实时进度一目了然

备份过程中,进度显示功能让管理员随时掌握备份状态,不再为漫长的备份过程感到焦虑。这一特性有助于及时发现潜在问题,比如备份停滞或速度过慢,从而及时调整策略。

压缩功能节省空间

它内置对LZ4和ZLIB算法的支持,在备份时直接压缩输出,有效减少备份文件体积,节省存储空间。这不仅降低了存储成本,还加快了备份文件的传输速度,方便异地存储和灾备。

权限与用户备份

能够选择性地备份用户账户和权限,确保在恢复数据时,用户的访问权限也能一并恢复,避免因权限丢失导致的访问问题,保障系统安全。

灵活过滤精准备份

提供了丰富的过滤选项,如--exclude-databases、--exclude-tables、--include-databases和--include-tables,可以精准选择需要备份的对象,排除不必要的数据,提高备份效率。

使用指南

连接选项配置

连接MySQL数据库时,常用选项包括--user(用户名)、--password(密码)、--host(主机名)、--port(端口号)和--socket(socket文件路径),确保与数据库建立正确连接。

备份选项设置并行度设置:--default-parallelism=N用于设置默认并行度,--parallel-schemas=[N:]db_list可针对特定数据库指定并行度。事务与索引处理:--single-transaction确保事务一致性,--defer-table-indexes则延迟索引创建,加快数据加载速度。数据筛选:利用--exclude-databases和--exclude-tables排除特定数据库和表,--include-databases和--include-tables选择备份特定对象。其他选项:--users备份用户账户,--skip-definer省略DEFINER子句,--skip-dump-rows只备份结构不备份数据。输出选项调整

--result-file=file_name指定备份输出文件,--set-gtid-purged=value控制是否添加SET @@GLOBAL.GTID_PURGED语句,影响数据恢复时的GTID处理。

使用示例

部分库表结构备份

假设业务中存在一些测试库,仅需备份其表结构用于后续开发环境搭建,可利用--include-databases和--skip-dump-rows选项。例如有test_dev1和test_dev2两个测试库:

复制
mysqlpump -u root -p --include-databases=test_dev1,test_dev2 --skip-dump-rows > test_dev_structure.sql1.

其中old_data_table数据稳定无需备份

复制
mysqlpump -u root -p test_dev1 --exclude-tables=old_data_table > test_dev_structure.sql1.

提高并行度可以显著加快备份速度

复制
mysqlpump -u root -p --default-parallelism=8 --parallel-schemas=4:test_dev1,test_dev2 > large_backup.sql1.

压缩备份

复制
mysqlpump -u root -p test_dev1 --compress-output=LZ4 > backup.lz41.

恢复备份

复制
mysql -u root -p < test_dev_structure.sql1.

对于压缩备份,先解压再恢复

复制
lz4_decompress backup.lz4 backup.sql mysql -u root -p < backup.sql1.2.

mysqlpump和mysqldump参数区别总汇:

功能

mysqldump

mysqlpump

说明

不导出表中的数据,只导出结构

-d, --no-data

-d, --skip-dump-rows

输出导入时的错误日志

--log-error=name

-log-error-file=name

导出用户和权限

无相关参数

--users

排除对象

无相关参数

--exclude-databases=name

--exclude-events=name 

--exclude-routines=name

--exclude-tables=name

--exclude-triggers=name

--exclude-users=name

指定包含的对象

无相关参数

--include-databases=name

--include-events=name

--include-routines=name

--include-tables=name

--include-triggers=name

--include-users=name

导出指定表

--tables

--include-databases=name --include-tables=name

mysqldump:使用--tables参数跟库名表名,表名之间空格隔开。mysqlpump:导出表需要同时使用--include-tables和--include-databases参数,如果只指定--include-tables=bm那么就会导出所有库中bm表,表名之间逗号隔开。

insert插入包含多个值

--extended-insert

--extended-insert=#

mysqlpump:定义一个insert语句包含多少个值,默认一个insert包含250个值。

导出时在CREATE TABLE前DROP TABLE IF EXISTS

--add-drop-table

--add-drop-table

备份脚本示例

复制
#!/bin/bash # MySQLpump备份脚本 # 基础配置 DB_HOST="192.168.0.1" DB_PORT=3306 DB_USER="backup_user" DB_PASS="xxxxxxxxxxx" DATABASES="testdb" BACKUP_DIR="/data/backup" TS=$(date +%Y_%m_%d) BACKUP_FILE="${BACKUP_DIR}/mysqlbak_${DATABASES}_${TS}.sql" LOG_FILE="${BACKUP_DIR}/backup_${TS}.log" PARALLEL_THREADS=4 # 设置并行线程数(根据CPU数,一般设置为CPU一半) # 记录开始时间 echo"[$(date +%F %T)] 备份开始,使用 ${PARALLEL_THREADS} 个线程" | tee -a ${LOG_FILE} # 执行备份命令 mysqlpump -h${DB_HOST} -u${DB_USER} -p"${DB_PASS}" -P${DB_PORT} \ --default-parallelism=${PARALLEL_THREADS} \ --parallel-schemas=${PARALLEL_THREADS}:${DATABASES} \ --single-transaction \ --set-gtid-purged=off \ --default-character-set=utf8mb4 \ --compress-output=LZ4 \ --defer-table-indexes \ --skip-definer \ --exclude-databases=mysql,sys,information_schema,performance_schema \ --log-error=${LOG_FILE} \ --result-file=${BACKUP_FILE} \ 2>> ${LOG_FILE} # 检查结果 if [ $? -eq 0 ] && [ -f ${BACKUP_FILE} ]; then # 获取压缩后的文件大小 BACKUP_SIZE=$(du -sh ${BACKUP_FILE} | awk {print $1}) echo"[$(date +%F %T)] 备份成功,文件:${BACKUP_FILE} (大小: ${BACKUP_SIZE})" | tee -a ${LOG_FILE} # 可选:解压备份文件验证完整性 # lz4_decompress ${BACKUP_FILE} ${BACKUP_FILE%.lz4} # echo "[$(date +%F %T)] 备份已解压验证" | tee -a ${LOG_FILE} else echo"[$(date +%F %T)] 备份失败!请检查日志:${LOG_FILE}" >&2 exit 1 fi1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.

阅读剩余
THE END