MySQL逻辑备份是通过导出数据库的结构定义和数据内容,生成可执行的SQL语句或者结构化文本文件,后续可以通过执行这些文件恢复数据库状态。这种方式不依赖底层存储文件,兼容性更强,是日常数据备份的常用方案。

常用逻辑备份工具
MySQL生态中最常用的逻辑备份工具是官方自带的mysqldump,此外还有mydumper等第三方多线程备份工具,适合大数据量场景。下面重点介绍mysqldump的实现方式。
mysqldump基础备份实现
备份单个数据库
如果需要备份名为test_db的数据库,基础命令如下:
# 备份test_db数据库,输出到test_db_backup.sql文件 mysqldump -u root -p --databases test_db > test_db_backup.sql
执行命令后会提示输入数据库密码,备份完成后会在当前目录生成test_db_backup.sql文件,文件内容包含创建数据库的语句、创建表的语句以及插入数据的INSERT语句。
备份所有数据库
如果需要备份MySQL实例中的所有数据库,可以使用--all-databases参数:
# 备份所有数据库 mysqldump -u root -p --all-databases > all_db_backup.sql
常用备份参数说明
为了提升备份的可靠性和适配不同场景,可以搭配以下常用参数:
- --single-transaction:对InnoDB引擎表开启事务一致性备份,备份过程中不会锁表,适合线上业务场景
- --routines:备份存储过程和函数
- --triggers:备份触发器
- --events:备份事件
- --lock-tables=false:禁用表级锁,配合
--single-transaction使用避免影响业务写入
带参数的完整备份命令示例:
# 备份test_db数据库,包含存储过程、触发器、事件,使用事务一致性备份 mysqldump -u root -p --databases test_db --single-transaction --routines --triggers --events --lock-tables=false > test_db_full_backup.sql
备份文件恢复实现
逻辑备份生成的SQL文件可以通过mysql命令直接执行恢复,步骤如下:
恢复单个数据库备份
如果备份时使用了--databases参数,备份文件中已经包含创建数据库的语句,直接执行即可:
# 恢复test_db的备份 mysql -u root -p < test_db_backup.sql
恢复所有数据库备份
全量备份的恢复命令和单库类似:
# 恢复所有数据库备份 mysql -u root -p < all_db_backup.sql
恢复到指定数据库
如果备份时没有加--databases参数,备份文件中没有创建数据库的语句,需要先手动创建数据库再恢复:
# 先登录MySQL创建目标数据库 mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS new_test_db;" # 执行恢复命令 mysql -u root -p new_test_db < test_db_backup.sql
逻辑备份注意事项
- 备份前确认磁盘空间充足,避免备份过程中磁盘写满导致备份失败
- 线上业务备份建议选择业务低峰期,即使使用
--single-transaction参数,也尽量减少对业务的影响 - 备份完成后建议校验备份文件的完整性,可以查看文件末尾是否有
-- Dump completed on标识,或者尝试在测试环境恢复验证 - 对于数据量超过50G的大库,
mysqldump备份效率较低,可以考虑使用mydumper多线程备份工具提升速度
备份脚本示例
可以编写简单的Shell脚本实现定时自动备份,示例脚本如下:
#!/bin/bash
# 定义备份目录
BACKUP_DIR="/data/mysql_backup"
# 定义备份文件名,包含日期
BACKUP_FILE="${BACKUP_DIR}/test_db_$(date +%Y%m%d_%H%M%S).sql"
# 定义数据库用户和密码
DB_USER="root"
DB_PASS="your_password"
DB_NAME="test_db"
# 创建备份目录(如果不存在)
mkdir -p ${BACKUP_DIR}
# 执行备份命令
mysqldump -u${DB_USER} -p${DB_PASS} --databases ${DB_NAME} --single-transaction --routines --triggers --events --lock-tables=false > ${BACKUP_FILE}
# 压缩备份文件
gzip ${BACKUP_FILE}
# 删除7天前的旧备份文件
find ${BACKUP_DIR} -name "test_db_*.sql.gz" -mtime +7 -delete
将上述脚本保存为mysql_backup.sh,添加执行权限后,可以通过crontab设置定时执行,实现自动化逻辑备份。