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.sql
其中old_data_table数据稳定无需备份
mysqlpump -u root -p test_dev1 --exclude-tables=old_data_table > test_dev_structure.sql
提高并行度可以显著加快备份速度
mysqlpump -u root -p --default-parallelism=8 --parallel-schemas=4:test_dev1,test_dev2 > large_backup.sql
压缩备份
mysqlpump -u root -p test_dev1 --compress-output=LZ4 > backup.lz4
恢复备份
mysql -u root -p < test_dev_structure.sql
对于压缩备份,先解压再恢复
lz4_decompress backup.lz4 backup.sql
mysql -u root -p < backup.sql
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
fi