MySQL通过 bin-log 恢复从备份点到灾难点之间数据

2024-06-03 17:58:24 浏览数 (1)

今天分享一期 mysql中 备份之后发生灾难造成数据丢失 那么如何恢复中间的数据呢?

数据库数据高于一切(任何数据是不能丢失的)

目录

1.准备测试数据库

2.备份数据库

观察备份细节

3.(模拟备份点到灾难点的数据)

4.恢复测试

1.拷贝所有二进制文件

2.停止数据库

3.清理环境(模拟丢失)

4.还原备份前的数据

5.恢复第3(模拟的数据)

6.测试查看


MySQL 数据库高于一切,是信息时代不可或缺的数据管理利器,为业务的成功和创新提供了坚实的基础。

普遍所使用的工具来备份mysql 但是都只能恢复备份之前数据

本期试验所使用的工具和文件:mysqldump binlog 二进制文件

1.准备测试数据库

代码语言:javascript复制
mysql> create database test;            创建库
Query OK, 1 row affected (0.00 sec)

mysql> create table t1(id int);        创建表
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(1),(2);        写入数据
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;        查看表
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
 ------ 
2 rows in set (0.00 sec)

2.备份数据库

代码语言:javascript复制
备份所有的数据库
[root@192 ~]# mysqldump -uroot -p" " --all-databases --single-transaction --master-data=2 --flush-logs > /backup/mysql-all.sql
   
-p'输入你的密码'
--all-databases
all所有数据库

--single-transaction
保证数据的可用性 就是指不关机的备份(备份的时候数据库还是正常使用的)

--master-data=2		
以注释的方式记录日志
参数有两个(1,2)2的话就是注释日志 日志里边都会加上#  1就是开启
二进制日志非常的重要 很强大 可以还原备份文件里没有备份上的数据(所以二进制日志一定要记录下来)

--flush-logs
切断日志 也就是日志轮转
观察备份细节
代码语言:javascript复制
vim/backup/备份的sql文件

你会发现里边很多   LOCK TABLES `test` WRITE	

LOCK TABLES 是 MySQL 中的一个语句,用于锁定一个或多个表,
以确保在执行特定操作时其他会话不能修改这些表。在 mysqldump 中,默认情况下,
备份操作会使用 --lock-tables 选项,这会导致在备份的整个过程中锁定要备份的表
。WRITE 关键字表示写锁,即其他会话不能写入被锁定的表。

这个锁机制确保了备份的一致性,因为在备份期间,数据库表的状态保持不变。
但是,这也意味着在备份过程中,其他会话可能会被阻塞,直到备份完成。
这可能对具有高并发的生产环境造成一些影响。

3.(模拟备份点到灾难点的数据)

代码语言:javascript复制
进入测试数据库
我进入test数据库 创建一个t2表
mysql> create table t2;
ERROR 1113 (42000): A table must have at least 1 column
mysql> create table t2(id int);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t2 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t2;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
|    3 |
 ------ 
3 rows in set (0.00 sec)

4.恢复测试

1.拷贝所有二进制文件
代码语言:javascript复制
[root@192 ~]# cp /var/lib/mysql/*bin* ~
[root@192 ~]# ls
192-bin.000001  192-bin.index    initial-setup-ks.cfg  模板  图片  下载  桌面
192-bin.000002  anaconda-ks.cfg  公共                  视频  文档  音乐
2.停止数据库
代码语言:javascript复制
systemctl stop mysqld
3.清理环境(模拟丢失)
代码语言:javascript复制
mysql> drop table t1;			删除表
Query OK, 0 rows affected (0.00 sec)

mysql> drop database test;			删除整个数据库test
Query OK, 1 row affected (0.00 sec)
mysql> show databases;		查看一下确实删掉了
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| mysql              |
| performance_schema |
| sys                |
 -------------------- 
4 rows in set (0.00 sec)
4.还原备份前的数据
代码语言:javascript复制
[root@192 ~]# mysql -uroot -p' ' < /backup/mysql-all.sql
查看test 中t1表		(数据都还原回来了)
mysql> select * from test.t1;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
 ------ 
2 rows in set (0.00 sec)

做到这里我们使用mysqldump还原数据库已经成功!!!!但是仅仅还原的是备份前的所有数据

第3.(模拟备份点到灾难点的数据)这些数据如何恢复?

我们在备份之后在test数据库创建了一个t2的表 里边插入了 1 2 3三条数据

代码语言:javascript复制
此刻我们查看test数据库
mysql> show tables;
 ---------------- 
| Tables_in_test |
 ---------------- 
| t1             |
 ---------------- 
1 row in set (0.00 sec)
因为备份之前test数据库中只有t1 表单
5.恢复第3(模拟的数据)

我们需要用到二进制文件来进行恢复

代码语言:javascript复制
[root@192 ~]# mysqlbinlog 192-bin.000002 --start-position=154 | mysql -uroot -p" "
192-bin.000002

还原备份之后的二进制 有多少个二进制跟多少个二进制(只要是备份后的二进制都行) 
 --start-position=154
 开始还原 从154这一行开始
 | mysql -uroot -p" "
 还原的数据给mysql	-p后边跟上你的密码
6.测试查看
代码语言:javascript复制
数据恢复成功
mysql> show tables;
 ---------------- 
| Tables_in_test |
 ---------------- 
| t1             |
| t2             |
 ---------------- 
mysql> select * from t2;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
|    3 |
 ------ 
3 rows in set (0.01 sec)

0 人点赞