今天分享一期 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)