MySQL 备份恢复 (二)
模拟故障案例并恢复
(1)每天全备
(2)binlog日志是完整
(3)模拟白天的数据变化
(4)模拟下午两点误删除数据库
需求: 利用全备+binlog回复数据库误删除之前。
模拟全备
mysqldump -uroot -pKlvchen_123 -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql
模拟白天的数据变化
create database day1 charset utf8mb4;
use day1;
create table t1(id int);
insert into t1 values(1),(2),(3);
use klvchen;
insert into t1 values (999,'kl');
模拟磁盘损坏
pkill mysqld
rm -rf /var/lib/mysql
初始化数据库
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql
systemctl start mysqld
获取备份数据
grep "\-- CHANGE MASTER TO MASTER_LOG_FILE=" /data/backup/full.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=194;
# sql_log_bin 日志为 mysql-bin.000003
mysqlbinlog --skip-gtids --start-position=194 /data/mysql-bin/mysql-bin.000003 >/data/backup/bin.sql
恢复数据
select @@sql_log_bin;
set sql_log_bin=0;
source /data/backup/full.sql;
source /data/backup/bin.sql;
set sql_log_bin=1;
模拟误删数据库故障案例并恢复
思路
1、停业务,避免数据的二次伤害
2、找一个临时库,恢复全备
3、截取误删除之间的binlog,恢复到临时库
4、测试可用性和完整性
5、
5.1 方法一:直接使用临时库顶替原生产库,前端应用割接到新库
5.2 方法二:将误删除的表导出,导入到原生产库
6、开启业务
准备数据
create database backup;
use backup
create table t1 (id int);
insert into t1 values(1),(2),(3);
进行全备
mysqldump -uroot -pKlvchen_123 -A -R --triggers --set-gtid-purged=OFF --master-data=2 --single-transaction|gzip > /data/backup/full_$(date +%F).sql.gz
模拟全备后的数据变化
use backup
insert into t1 values(11),(22),(33);
create table t2 (id int);
insert into t2 values(11),(22),(33);
模拟删库故障
drop database backup;
准备临时数据库进行恢复
# 把全备的 sql 和 binlog 日志放恢复临时的数据库上
gunzip full_2020-01-11.sql.gz
# 截取二进制日志
grep "\-- CHANGE MASTER TO MASTER_LOG_FILE=" /data/backup/full_2020-01-11.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=753;
# 通过查看二进制文件,发现 GTID 为 f75f8c02-3423-11ea-b5f7-00155d1f4002:7 是 drop database backup;语句应该排除,binlog 起始位置为 753
mysqlbinlog --start-position=753 --skip-gtids --exclude-gtids='e4b4a809-3445-11ea-abe9-00155d1f4002:7' /data/mysql-bin/mysql-bin.000002 >/data/backup/bin.sql
恢复数据
set sql_log_bin=0;
source /data/backup/full_2020-01-11.sql;
source /data/backup/bin.sql;
set sql_log_bin=1;
此时临时数据库已恢复,接下来可把数据库 backup 备份出来恢复到生产mysql数据库中。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库