实验内容:模拟mysql通过全量备份+binlog日志恢复数据
1、数据准备
sql
mysql> create database backup;
mysql> use backup
mysql> create table t1(id int );
mysql> insert into t1 values(1),(2),(3);
mysql> commit;
[root@oracle backup]# rm -rf /backup/*
2、模拟周二 23:00 全备
sql
mysqldump -uroot -S /data/3307/mysql.sock -A -R --triggers --set-gtid-purged=OFF
--master-data=2 --single-transaction | gzip > /backup/full_$(date +%F).sql.gz
参数说明:
• --single-transaction
:保证备份一致性(InnoDB 表)
• --flush-logs
:备份后刷新二进制日志,生成新的日志文件
• --master-data=2
:记录备份时的二进制日志位置(在备份文件中以注释形式存在)
bash
[root@oracle backup]# ll
总用量 1004
-rw-r--r-- 1 root root 1024907 8月 30 15:29 full_2025-08-30.sql.gz
解压
bash
[root@oracle backup]# gunzip full_2025-08-30.sql.gz
[root@oracle backup]# ll
总用量 4392
-rw-r--r-- 1 root root 4495985 8月 30 15:29 full_2025-08-30.sql
[root@oracle backup]#
3、模拟周二 23:00 到周三10点之间的数据变化
sql
mysql> insert into t1 values(4),(5),(5),(11);
mysql> commit;
mysql> create table t2(id int );
mysql> insert into t2 values(4),(5),(5),(11);
mysql> commit;
4、模拟故障,删除表(只是模拟,不代表生产)
sql
mysql> drop backup;
5、恢复过程
5.1 准备临时数据库(多实例3308,3307为生产主库)
bash
[root@oracle ~]# systemctl start mysqld3308
5.2 准备备份
(1)准备全备
bash
[root@oracle backup]# cd /backup/
[root@oracle backup]# gunzip full_2025-08-30.sql.gz
(2)截取二进制日志binlog
bash
vim full_2025-08-30.sql.gz
查看事务ID ,940为起点
sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=940;
sql
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 1815 | | | dba0d530-774a-11f0-928d-0050562cf0d9:1-8 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
查看终点,在binlog事务中查看
sql
mysql> show binlog events in 'mysql-bin.000001';

确定终点号:1716,drop不需要,
所有最终二进制范围:940------1716
sql
mysqlbinlog --skip-gtids --start-position=940 --stop-position=1716 /data//3307/mysql-bin.000001 > /backup/bin.sql
6、恢复备份到临时库 3308
登陆到临时库3308
bash
mysql -uroot -S /data/3308/mysql.sock
关闭二进制记录
sql
mysql> set sql_log_bin=0;
恢复全备
sql
mysql> source /backup/full_2025-08-30.sql
恢复二进制
sql
mysql> source /backup/bin.sql
开启二进制记录
mysql> set sql_log_bin=1;
7、将临时库里面恢复后的数据库导出,再导入到生产库
bash
mysqldump -S /data/3308/mysql.sock -B backup > /backup/bak.sql
登陆到生产库
bash
[root@oracle ~]# mysql -uroot -S /data/3307/mysql.sock
关闭二进制记录
sql
mysql> set sql_log_bin=0;
恢复数据
sql
source /backup/bak.sql
再次开启二进制记录
sql
mysql> set sql_log_bin=1;
查看数据是否全部恢复,确认数据全部恢复