MySQL数据库备份&恢复(备份恢复)【通过binlog进行增量恢复】

素材

#创建库
create database it DEFAULT CHARACTER SET utf8;

/*=======================================================*/
/*创建学生表:Student(Sno,Sname,Ssex,Ssage,Ssdept)
-------------------(学号-主键,姓名,性别,年龄,所在系)*/
/*=======================================================*/
CREATE TABLE `Student` (
  `Sno` int(10) NOT NULL COMMENT '学号',  `Sname` varchar(16) NOT NULL COMMENT '姓名',
  `Ssex` char(2) NOT NULL COMMENT '性别',  `Sage` tinyint(2) NOT NULL DEFAULT '0' COMMENT '学生年龄',
  `Sdept` varchar(16) DEFAULT 'NULL' COMMENT '学生所在系别',  PRIMARY KEY (`Sno`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

#表中插入数据
INSERT INTO `Student` VALUES (1, '陆亚', '男', 24, '计算机网络'),(2, 'tom', '男', 26, '英语'),(3, '张阳', '男', 21, '物流管理'), (4, 'alex', '女', 22, '电子商务');

#模拟半夜零点手工全备
mysqldump -uroot -pMySql@123  -F -B it --single-transaction > /backup/mysql_full.sql
#注:备份文件名以及路径自定义

#备份后继续插入数据:
INSERT INTO Student values(0005,'xumubin','男',29,'中文专业'),(0006,'wangzhao','男',21,'导弹专业');

#模拟用户破坏数据:
drop database it;

恢复过程

  1. 检查凌晨完全备份
[root@localhost ~]# ll /backup/mysql_full.sql 
-rw-r--r-- 1 root root 2328 May  1 11:25 /backup/mysql_full.sql
  1. 检查完全备份后的所有binlog
[root@localhost ~]# ll /var/lib/mysql/mysql-bin.*
-rw-r----- 1 mysql mysql  177 May  1 11:09 /var/lib/mysql/mysql-bin.000001
-rw-r----- 1 mysql mysql  177 May  1 11:09 /var/lib/mysql/mysql-bin.000002
-rw-r----- 1 mysql mysql 1392 May  1 11:24 /var/lib/mysql/mysql-bin.000003
-rw-r----- 1 mysql mysql  341 May  1 11:24 /var/lib/mysql/mysql-bin.000004
-rw-r----- 1 mysql mysql  341 May  1 11:25 /var/lib/mysql/mysql-bin.000005
-rw-r----- 1 mysql mysql  674 May  1 11:27 /var/lib/mysql/mysql-bin.000006
-rw-r----- 1 mysql mysql  224 May  1 11:27 /var/lib/mysql/mysql-bin.index
  1. 立即刷新并备份出binlog
mysql> FLUSH LOGS;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#通过查看刷新之后的当前使用二进制日志基本可以确定增量数据部分在上一个日志“mysql-bin.000006”中
[root@localhost ~]# ls -lrt /var/lib/mysql/mysql-bin.*
-rw-r----- 1 mysql mysql  177 May  1 11:09 /var/lib/mysql/mysql-bin.000001
-rw-r----- 1 mysql mysql  177 May  1 11:09 /var/lib/mysql/mysql-bin.000002
-rw-r----- 1 mysql mysql 1392 May  1 11:24 /var/lib/mysql/mysql-bin.000003
-rw-r----- 1 mysql mysql  341 May  1 11:24 /var/lib/mysql/mysql-bin.000004
-rw-r----- 1 mysql mysql  341 May  1 11:25 /var/lib/mysql/mysql-bin.000005
-rw-r----- 1 mysql mysql  674 May  1 11:27 /var/lib/mysql/mysql-bin.000006
-rw-r----- 1 mysql mysql  224 May  1 11:27 /var/lib/mysql/mysql-bin.index
-rw-r----- 1 mysql mysql 2104 May  1 11:42 /var/lib/mysql/mysql-bin.000007
//通过比对时间(按时间排序)可以确定增量数据部分在上一个日志“mysql-bin.000006”中
  1. 恢复binlog生成sql语句
    具体操作在下方
  2. 恢复凌晨完全备份
mysql> source /backup/mysql_full.sql

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| it                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use it;
Database changed
mysql> show tables;
+--------------+
| Tables_in_it |
+--------------+
| Student      |
+--------------+
1 row in set (0.00 sec)

mysql> select * from Student;
+-----+--------+------+------+-----------------+
| Sno | Sname  | Ssex | Sage | Sdept           |
+-----+--------+------+------+-----------------+
|   1 | 陆亚   ||   24 | 计算机网络      |
|   2 | tom    ||   26 | 英语            |
|   3 | 张阳   ||   21 | 物流管理        |
|   4 | alex   ||   22 | 电子商务        |
+-----+--------+------+------+-----------------+
4 rows in set (0.00 sec)
#可以看到完全备份已恢复,但增量的两条数据仍未恢复(需要binlog进行增量恢复)
  1. 恢复增量备份
    具体操作在下方

mysqlbinlog增量恢复方式

基于时间点恢复

1)指定开始时间到结束时间

myslbinlog mysqlbin.000008 --start-datetime=2014-10-45 01:10:46--stop-datetime=2014-10-45 03:10:46-r time.sql

2)指定开始时间到文件结束

myslbinlog mysqlbin.000008 --start-datetime=2014-10-45 01:10:46-d esen -r time.sql

3)从文件开头到指定结束时间

myslbinlog mysqlbin.000008 --stop-datetime=2014-10-45 03:10:46-d esen -r time.sql

基于位置点的增量恢复

1)指定开始位置到结束位置

myslbinlog mysqlbin.000008 --start-position=510 --stop-position=1312 -r pos.sql

2)指定开始位置到文件结束

myslbinlog mysqlbin.000008 --start-position=510 -r pos.sql

3)从文件开始位置到指定结束位置

myslbinlog mysqlbin.000008 --stop-position=1312 -r pos.sql

恢复示例(时间点)

[root@localhost ~]# mysqlbinlog --base64-output=DECODE-ROWS -vv /var/lib/mysql/mysql-bin.000006		//通过解密查看mysql-bin.000006日志内容(解密之后可查看具体插入语句)
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#220501 11:25:15 server id 133  end_log_pos 123 CRC32 0x9c15ad70 	Start: binlog v 4, server v 5.7.37-log created 220501 11:25:15
# at 123
#220501 11:25:15 server id 133  end_log_pos 154 CRC32 0x815224b5 	Previous-GTIDs
# [empty]
# at 154
#220501 11:25:52 server id 133  end_log_pos 219 CRC32 0x110c54f1 	Anonymous_GTID	last_committed=0	sequence_number=1	rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#220501 11:25:52 server id 133  end_log_pos 289 CRC32 0xa019fadb 	Query	thread_id=2	exec_time=0	error_code=0
SET TIMESTAMP=1651375552/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 289
#220501 11:25:52 server id 133  end_log_pos 347 CRC32 0x54be952d 	Table_map: `it`.`Student` mapped to number 114
# at 347
#220501 11:25:52 server id 133  end_log_pos 445 CRC32 0xa4079c86 	Write_rows: table id 114 flags: STMT_END_F
### INSERT INTO `it`.`Student`
### SET
###   @1=5 /* INT meta=0 nullable=0 is_null=0 */
###   @2='xumubin' /* VARSTRING(48) meta=48 nullable=0 is_null=0 */
###   @3='男' /* STRING(6) meta=65030 nullable=0 is_null=0 */
###   @4=29 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @5='中文专业' /* VARSTRING(48) meta=48 nullable=1 is_null=0 */
### INSERT INTO `it`.`Student`
### SET
###   @1=6 /* INT meta=0 nullable=0 is_null=0 */
###   @2='wangzhao' /* VARSTRING(48) meta=48 nullable=0 is_null=0 */
###   @3='男' /* STRING(6) meta=65030 nullable=0 is_null=0 */
###   @4=21 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @5='导弹专业' /* VARSTRING(48) meta=48 nullable=1 is_null=0 */
# at 445
#220501 11:25:52 server id 133  end_log_pos 476 CRC32 0x57599106 	Xid = 112
COMMIT/*!*/;
# at 476
#220501 11:26:40 server id 133  end_log_pos 541 CRC32 0x724266e9 	Anonymous_GTID	last_committed=1	sequence_number=2	rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 541
#220501 11:26:40 server id 133  end_log_pos 627 CRC32 0x1fd6ce85 	Query	thread_id=2	exec_time=0	error_code=0
SET TIMESTAMP=1651375600/*!*/;
drop database it
/*!*/;
# at 627
#220501 11:27:40 server id 133  end_log_pos 674 CRC32 0x16ef9fb3 	Rotate to mysql-bin.000007  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
//思路一:通过观察上方日志信息,可以看到插入语句被属于同一个事务中(BEGIN ··· COMMIT/*!*/),因此需要选择BEGIN后的第一个时间点以及COMMIT/*!*/后的第一个时间点才能包含此段插入语句

//思路二:同时可以发现“drop database it”语句的时间点为“220501 11:26:40”,因此为了跳过此步骤,需要往上挑取时间点

//思路三:最后综合考虑,开始时间点选取为“220501 11:25:52”,结束时间点选取为“220501 11:26:40”
mysqlbinlog /var/lib/mysql/mysql-bin.000006 --start-datetime='22-05-01 11:25:52' --stop-datetime='2022-05-01 11:26:40' > /backup/time.sql

[root@localhost ~]# ll /backup/time.sql 	//查看备份结果
-rw-r--r-- 1 root root 2125 May  1 11:42 /backup/time.sql
#数据库在完成恢复完全备份的情况下进行增量恢复
mysql> source /backup/time.sql

mysql> select * from Student;
+-----+----------+------+------+-----------------+
| Sno | Sname    | Ssex | Sage | Sdept           |
+-----+----------+------+------+-----------------+
|   1 | 陆亚     ||   24 | 计算机网络      |
|   2 | tom      ||   26 | 英语            |
|   3 | 张阳     ||   21 | 物流管理        |
|   4 | alex     ||   22 | 电子商务        |
|   5 | xumubin  ||   29 | 中文专业        |
|   6 | wangzhao ||   21 | 导弹专业        |
+-----+----------+------+------+-----------------+
6 rows in set (0.00 sec)
#可以看到剩余增量的两条数据也已恢复成功

恢复示例(位置点)

[root@localhost ~]# mysqlbinlog --base64-output=DECODE-ROWS -vv /var/lib/mysql/mysql-bin.000006		//通过解密查看mysql-bin.000006日志内容(解密之后可查看具体插入语句)
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#220501 11:25:15 server id 133  end_log_pos 123 CRC32 0x9c15ad70 	Start: binlog v 4, server v 5.7.37-log created 220501 11:25:15
# at 123
#220501 11:25:15 server id 133  end_log_pos 154 CRC32 0x815224b5 	Previous-GTIDs
# [empty]
# at 154
#220501 11:25:52 server id 133  end_log_pos 219 CRC32 0x110c54f1 	Anonymous_GTID	last_committed=0	sequence_number=1	rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#220501 11:25:52 server id 133  end_log_pos 289 CRC32 0xa019fadb 	Query	thread_id=2	exec_time=0	error_code=0
SET TIMESTAMP=1651375552/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 289
#220501 11:25:52 server id 133  end_log_pos 347 CRC32 0x54be952d 	Table_map: `it`.`Student` mapped to number 114
# at 347
#220501 11:25:52 server id 133  end_log_pos 445 CRC32 0xa4079c86 	Write_rows: table id 114 flags: STMT_END_F
### INSERT INTO `it`.`Student`
### SET
###   @1=5 /* INT meta=0 nullable=0 is_null=0 */
###   @2='xumubin' /* VARSTRING(48) meta=48 nullable=0 is_null=0 */
###   @3='男' /* STRING(6) meta=65030 nullable=0 is_null=0 */
###   @4=29 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @5='中文专业' /* VARSTRING(48) meta=48 nullable=1 is_null=0 */
### INSERT INTO `it`.`Student`
### SET
###   @1=6 /* INT meta=0 nullable=0 is_null=0 */
###   @2='wangzhao' /* VARSTRING(48) meta=48 nullable=0 is_null=0 */
###   @3='男' /* STRING(6) meta=65030 nullable=0 is_null=0 */
###   @4=21 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @5='导弹专业' /* VARSTRING(48) meta=48 nullable=1 is_null=0 */
# at 445
#220501 11:25:52 server id 133  end_log_pos 476 CRC32 0x57599106 	Xid = 112
COMMIT/*!*/;
# at 476
#220501 11:26:40 server id 133  end_log_pos 541 CRC32 0x724266e9 	Anonymous_GTID	last_committed=1	sequence_number=2	rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 541
#220501 11:26:40 server id 133  end_log_pos 627 CRC32 0x1fd6ce85 	Query	thread_id=2	exec_time=0	error_code=0
SET TIMESTAMP=1651375600/*!*/;
drop database it
/*!*/;
# at 627
#220501 11:27:40 server id 133  end_log_pos 674 CRC32 0x16ef9fb3 	Rotate to mysql-bin.000007  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
//思路一:通过观察上方日志信息,可以看到插入语句被属于同一个事务中(BEGIN ··· COMMIT/*!*/),因此需要选择BEGIN后的第一个位置点以及COMMIT/*!*/后的第一个位置点才能包含此段插入语句

//思路二:同时可以发现“drop database it”语句的位置点为“541”,因此为了跳过此步骤,需要往上挑取位置点

//思路三:最后综合考虑,开始位置点选取为“289”,结束位置点选取为“476”
[root@localhost ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000006 --start-position='289' --stop-position='476' > /backup/pos.sql

[root@localhost ~]# ll /backup/pos.sql		//查看备份结果
-rw-r--r-- 1 root root 1224 May  1 17:04 /backup/pos.sql
#数据库在完成恢复完全备份的情况下进行增量恢复
mysql> source /backup/time.sql

mysql> select * from Student;
+-----+----------+------+------+-----------------+
| Sno | Sname    | Ssex | Sage | Sdept           |
+-----+----------+------+------+-----------------+
|   1 | 陆亚     ||   24 | 计算机网络      |
|   2 | tom      ||   26 | 英语            |
|   3 | 张阳     ||   21 | 物流管理        |
|   4 | alex     ||   22 | 电子商务        |
|   5 | xumubin  ||   29 | 中文专业        |
|   6 | wangzhao ||   21 | 导弹专业        |
+-----+----------+------+------+-----------------+
6 rows in set (0.00 sec)
#可以看到剩余增量的两条数据也已恢复成功
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值