
数据库备份是运维工作中最重要的环节之一。本文介绍MySQL数据库的备份与恢复方法,从基础的mysqldump到自动化备份脚本,帮你建立完善的备份策略。
一、mysqldump基础用法
# 备份单个数据库 mysqldump -u root -p 数据库名 > backup.sql # 备份多个数据库 mysqldump -u root -p --databases db1 db2 db3 > multi_backup.sql # 备份所有数据库 mysqldump -u root -p --all-databases > all_backup.sql # 备份指定表 mysqldump -u root -p 数据库名 表名1 表名2 > tables_backup.sql
二、常用备份参数
# 完整备份(推荐参数)mysqldump -u root -p \
--single-transaction \
--routines \
--triggers \
--events \
--flush-logs \
--master-data=2 \
数据库名 > full_backup.sql参数说明:
--single-transaction InnoDB一致性备份,不锁表
--routines 包含存储过程和函数
--triggers 包含触发器
--events 包含定时事件
--flush-logs 刷新日志(用于增量备份)
--master-data=2 记录binlog位置(注释形式)
三、恢复数据库
# 恢复单个数据库
mysql -u root -p 数据库名 < backup.sql恢复所有数据库
mysql -u root -p < all_backup.sql
恢复到新数据库
mysql -u root -p -e "CREATE DATABASE new_db;"
mysql -u root -p new_db < backup.sql压缩备份恢复
gunzip < backup.sql.gz | mysql -u root -p 数据库名
四、压缩备份节省空间
# 压缩备份
mysqldump -u root -p 数据库名 | gzip > backup_$(date +%Y%m%d).sql.gz压缩备份并显示进度
mysqldump -u root -p 数据库名 | pv | gzip > backup.sql.gz
对比大小
ls -lh backup.sql backup.sql.gz
压缩后通常能减少70%-90%的文件大小。
五、自动化备份脚本
#!/bin/bashmysql_backup.sh - MySQL自动备份脚本
配置
DB_USER="backup_user"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=7创建备份目录
mkdir -p $BACKUP_DIR
执行备份
mysqldump -u$DB_USER -p$DB_PASS \
--single-transaction \
--routines \
--triggers \
$DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz检查备份是否成功
if [ $? -eq 0 ]; then
echo "[$(date)] 备份成功: ${DB_NAME}_${DATE}.sql.gz"
else
echo "[$(date)] 备份失败!" >&2
# 可以在这里发送告警邮件
fi删除N天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
echo "[$(date)] 已清理${KEEP_DAYS}天前的备份"
六、配置定时任务
# 给脚本执行权限
chmod +x /opt/scripts/mysql_backup.sh编辑crontab
crontab -e
每天凌晨2点执行备份
0 2 * /opt/scripts/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
每周日凌晨3点全量备份
0 3 0 /opt/scripts/mysql_full_backup.sh >> /var/log/mysql_backup.log 2>&1
七、binlog增量备份
# 开启binlog(my.cnf)
[mysqld]
log-bin=mysql-bin
binlog_format=ROW
server-id=1查看当前binlog
mysql> SHOW BINARY LOGS;
刷新binlog(开始新的日志文件)
mysql> FLUSH BINARY LOGS;
从binlog恢复数据
mysqlbinlog --start-datetime="2026-06-15 00:00:00" \
--stop-datetime="2026-06-15 12:00:00" \
mysql-bin.000001 | mysql -u root -p从binlog恢复指定位置
mysqlbinlog --start-position=154 --stop-position=1024 \
mysql-bin.000001 | mysql -u root -p
八、备份验证
# 验证备份文件完整性
mysqlcheck -u root -p --check --all-databases恢复到测试环境验证
mysql -u root -p test_db < backup.sql
mysql -u root -p -e "SELECT COUNT(*) FROM test_db.重要表;"检查备份文件是否可读
gunzip -t backup.sql.gz && echo "文件完整" || echo "文件损坏"
九、备份策略建议
| 场景 | 策略 | 频率 |
|---|---|---|
| 小型数据库(<1GB) | 全量备份 | 每天 |
| 中型数据库(1-100GB) | 全量+binlog增量 | 全量每周,增量每天 |
| 大型数据库(>100GB) | xtrabackup物理备份 | 全量每周,增量每天 |
| 核心业务 | 主从复制+定时备份 | 实时同步+每天备份 |
备份不验证等于没备份。建议定期在测试环境恢复备份,确保备份可用。
评论