MySQL 备份恢复实战
时间:2026-10-7 07:09 作者:emer 分类: 无
MySQL 备份与恢复实战
数据库备份是运维的基本功,万一数据丢了,没有备份就完蛋了。这篇整理常用的备份恢复方法。
1. mysqldump 逻辑备份
最常用的备份工具,生成 SQL 文件。
备份整个数据库:
mysqldump -u root -p123456 blog > blog_$(date +%Y%m%d).sql
备份单张表:
mysqldump -u root -p123456 blog users > users.sql
备份所有数据库:
mysqldump -u root -p123456 --all-databases > all.sql
常用参数:
- --databases:指定多个数据库
- --single-transaction:InnoDB 一致性备份,不锁表
- --routines:备份存储过程和函数
- --triggers:备份触发器
2. 恢复数据
# 恢复整个数据库
mysql -u root -p123456 blog < blog_20261007.sql
# 登录后恢复
mysql -u root -p123456
mysql> use blog;
mysql> source /root/blog_20261007.sql;
3. 压缩备份
数据大的时候,直接存 SQL 太占空间,压缩一下:
# 备份并压缩
mysqldump -u root -p123456 blog | gzip > blog_$(date +%Y%m%d).sql.gz
# 恢复压缩备份
gunzip < blog_20261007.sql.gz | mysql -u root -p123456 blog
4. 全量+增量备份
大数据量不能每天全量备份,用 binlog 做增量。
全量备份:
mysqldump -u root -p123456 --single-transaction --master-data=2 blog > full.sql
增量恢复:
# 先恢复全量
mysql -u root -p123456 blog < full.sql
# 再按时间点恢复 binlog
mysqlbinlog --start-datetime="2026-10-07 10:00:00" \
--stop-datetime="2026-10-07 14:00:00" \
/var/lib/mysql/binlog.000001 | mysql -u root -p123456
5. 物理备份(冷备)
直接拷贝数据文件,速度快,但需要停库。
# 停库
systemctl stop mysqld
# 拷贝数据目录
cp -r /var/lib/mysql /backup/mysql_$(date +%Y%m%d)
# 启动
systemctl start mysqld
6. 定时备份脚本
写个脚本每天自动备份:
#!/bin/bash
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d)
USER="root"
PASS="123456"
# 创建目录
mkdir -p $BACKUP_DIR
# 备份并压缩
mysqldump -u$USER -p$PASS --single-transaction blog | gzip > $BACKUP_DIR/blog_$DATE.sql.gz
# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
加到 crontab:
0 3 * * * /bin/bash /root/mysql_backup.sh
7. 恢复注意事项
- 恢复前先测试备份文件能不能用,别等真出事了才发现备份坏了
- 大表恢复慢,别在线上高峰期操作
- 字符集要一致,恢复前先检查
- 恢复前先备份当前数据,防止恢复出错
总结
MySQL 备份三件事:
- 定期备份,别偷懒
- 备份后要测试能不能恢复
- 重要数据异地备份
数据无价,备份一定要做好。