引言:数据就是钱,备份就是存银行
想象一下,你每天辛苦赚的钱全放在家里保险柜,突然有一天家里失火,钱全烧没了------这就是没有备份的数据库!
MySQL的备份与恢复,本质就是给数据"存钱":
- 备份:定期把钱存银行(冷备)、用保险箱随身带(热备)。
- 恢复 :万一钱丢了,从银行取出来(备份文件还原)。
本文用最接地气的方式,教你如何像理财一样管理MySQL数据!
一、为什么要备份?
- 天灾人祸 :服务器宕机、磁盘损坏、误删数据(比如手滑
DROP TABLE
)。 - 业务需求:数据迁移、版本回滚(比如上线新功能出问题)。
- 合规要求:某些行业(如金融)强制要求数据备份。
⚠️ 血的教训 :
"之前没备份,运维误删了用户表,只能从日志里一点点拼数据,连续加班3天!" ------ 某程序员真实经历
二、MySQL备份的4种姿势
1. 冷备(Cold Backup):关店存钱
- 操作 :关闭MySQL,直接复制数据文件(
/var/lib/mysql
)。 - 优点:简单粗暴,适合小数据库。
- 缺点:服务得停,影响业务。
bash
# 1. 关闭MySQL
systemctl stop mysqld
# 2. 复制数据目录
cp -r /var/lib/mysql /backup/mysql_full_20231101
# 3. 启动MySQL
systemctl start mysqld
2. 热备(Hot Backup):边营业边存钱
- 操作 :不停止MySQL,用工具备份(如
mysqldump
、XtraBackup
)。 - 优点:不影响业务,主流方案。
- 缺点:需要工具支持,可能锁表。
3. 全量备份 vs 增量备份
- 全量备份:每周一把所有数据存一遍(像每月工资全存银行)。
- 增量备份:只存每天新增的数据(像每天存零花钱,省时间省空间)。
三、手把手实战:3种常用备份工具
1. mysqldump(SQL语句备份)
- 适用场景:小数据量(<10GB),需要灵活恢复单表。
- 原理:生成一堆SQL语句(建表+插入数据),恢复时直接执行。
bash
# 备份整个数据库
mysqldump -u root -p --all-databases > full_backup.sql
# 备份单个数据库
mysqldump -u root -p mydb > mydb_backup.sql
# 备份单张表
mysqldump -u root -p mydb mytable > mytable_backup.sql
# 恢复数据(像执行脚本一样)
mysql -u root -p < full_backup.sql
2. Percona XtraBackup(物理备份神器)
- 适用场景:大数据量(TB级),InnoDB引擎,支持热备。
- 原理:直接复制数据文件,同时记录备份期间的redo日志。
bash
# 全量备份
xtrabackup --backup --target-dir=/backup/full
# 增量备份(基于上一次全量)
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full
# 恢复步骤
xtrabackup --prepare --apply-log-only --target-dir=/backup/full
xtrabackup --prepare --target-dir=/backup/full
cp -r /backup/full /var/lib/mysql
3. 二进制日志备份(Binlog):后悔药
- 作用:记录所有数据变更操作,用于"时间点恢复"(比如误删数据后恢复)。
- 配置 :在
my.cnf
中开启binlog
ini
[mysqld]
server-id=1
log-bin=mysql-bin # 开启binlog
expire_logs_days=7 # 保留7天日志
四、数据恢复:从"存钱"到"取钱"
场景1:误删了一张表
sql
-- 手滑执行了
DROP TABLE users;
恢复步骤:
- 从备份中找到最近的全量备份文件(
mydb_backup.sql
)。 - 恢复该表:
bash
# 提取单表备份(如果备份了整个库)
sed -n '/^-- Table structure for table `users`/,/^-- Table structure/p' mydb_backup.sql > users.sql
# 恢复表
mysql -u root -p mydb < users.sql
- 用binlog恢复后续操作(如果需要):
bash
mysqlbinlog --start-datetime="2023-11-01 14:00:00" mysql-bin.000001 | mysql -u root -p
场景2:硬盘炸了,全库恢复
- 安装新MySQL,确保版本一致。
- 如果是
mysqldump
备份:
bash
mysql -u root -p < full_backup.sql
- 如果是XtraBackup物理备份:
bash
cp -r /backup/full /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
五、备份策略:像定投基金一样规律
-
全量+增量组合拳:
- 每周日全量备份。
- 每天凌晨增量备份。
-
多地存储:本地硬盘+云存储(阿里云OSS、AWS S3)。
-
自动化脚本:用crontab定时执行备份。
bash
# 每天凌晨2点全量备份
0 2 * * 7 mysqldump -u root -p mydb > /backup/full_$(date +%Y%m%d).sql
# 每天凌晨1点增量备份
0 1 * * 1-6 xtrabackup --backup --target-dir=/backup/inc_$(date +%Y%m%d)
六、避坑指南
- 备份≠安全:定期验证备份文件是否能恢复(像定期检查存折余额)。
- 注意版本兼容:XtraBackup备份的文件不能跨大版本恢复(如MySQL 5.7备份不能恢复到8.0)。
- 锁表问题 :
mysqldump
默认会锁表,用--single-transaction
避免(仅限InnoDB)。 - 权限管理:备份文件别放数据库服务器上,避免被黑客一锅端。
七、面试技巧:如何回答"备份与恢复"问题?
- 分类清晰 :
"MySQL备份分为物理备份和逻辑备份,物理备份如XtraBackup适合大数据量,逻辑备份如mysqldump适合小数据量。" - 结合场景 :
"如果误删数据,先用最近的全量备份恢复,再通过binlog恢复到误操作前的时间点。" - 强调策略 :
"我们会采用全量+增量备份,每天自动上传到云存储,并定期做恢复演练。"