MySQL 数据库高于一切,是信息时代不可或缺的数据管理利器,为业务的成功和创新提供了坚实的基础。
普遍所使用的工具来备份mysql 但是都只能恢复备份之前数据
本期试验所使用的工具和文件:mysqldump+binlog 二进制文件
1.准备测试数据库
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.备份数据库
备份所有的数据库 [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 切断日志 也就是日志轮转
观察备份细节
vim/backup/备份的sql文件 你会发现里边很多 LOCK TABLES `test` WRITE LOCK TABLES 是 MySQL 中的一个语句,用于锁定一个或多个表, 以确保在执行特定操作时其他会话不能修改这些表。在 mysqldump 中,默认情况下, 备份操作会使用 --lock-tables 选项,这会导致在备份的整个过程中锁定要备份的表 。WRITE 关键字表示写锁,即其他会话不能写入被锁定的表。 这个锁机制确保了备份的一致性,因为在备份期间,数据库表的状态保持不变。 但是,这也意味着在备份过程中,其他会话可能会被阻塞,直到备份完成。 这可能对具有高并发的生产环境造成一些影响。
3.(模拟备份点到灾难点的数据)
进入测试数据库 我进入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.拷贝所有二进制文件
[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.停止数据库
systemctl stop mysqld
3.清理环境(模拟丢失)
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.还原备份前的数据
[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三条数据
此刻我们查看test数据库 mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | t1 | +----------------+ 1 row in set (0.00 sec) 因为备份之前test数据库中只有t1 表单
5.恢复第3(模拟的数据)
我们需要用到二进制文件来进行恢复
[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.测试查看
数据恢复成功 mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | t1 | | t2 | +----------------+ mysql> select * from t2; +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.01 sec)