Mysql 5.7 使用备份+日志进行时间点还原
![b8ec08dcf5e3783dcb62460640353e08.png](https://img-blog.csdnimg.cn/img_convert/b8ec08dcf5e3783dcb62460640353e08.png)
环境
Mysql5.7 两个实例
10.106.216.182:3306
10.106.216.182:3307
这里我们使用3306实例来操作数据,并产生日志,还原及时间点操作在3307上进行,因为生产环境一般别再生产实例上操作,这些都比较危险
3306原始库进行数据操作
先初始化日志:
reset master ;
show master status;
![273215b5888749ebf57122bda8ae508f.png](https://img-blog.csdnimg.cn/img_convert/273215b5888749ebf57122bda8ae508f.png)
创建一个表 并插入一些数据
CREATE TABLE `test`.`test` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
insert into test.test(name) values('a'),('b'),('c')
![b382694f3d3204cb2b9c3f8b90b38f6e.png](https://img-blog.csdnimg.cn/img_convert/b382694f3d3204cb2b9c3f8b90b38f6e.png)
备份3306 上的test库
mysqldump -S /data/3306/mysql.sock --master-data --single-transaction --user=root --password=123456 --databases test> 3306test.db
重启3306 上的test库
flush logs;
show binary logs;
![a5a8431f6b0c1052cf587b43105ff355.png](https://img-blog.csdnimg.cn/img_convert/a5a8431f6b0c1052cf587b43105ff355.png)
操作数据
insert into test.test(name) values('a'),('b'),('c')
![cbbf7c0a9fc57ed60ed1fe206839c1d3.png](https://img-blog.csdnimg.cn/img_convert/cbbf7c0a9fc57ed60ed1fe206839c1d3.png)
update test.test
set name= concat(name,'-h')
where id =3
![2f304932c0832900c9a85762ed7f4074.png](https://img-blog.csdnimg.cn/img_convert/2f304932c0832900c9a85762ed7f4074.png)
delete from test.test
where id in (3,5);
![bbff5b141fcbac0786a3c7033dd96c1a.png](https://img-blog.csdnimg.cn/img_convert/bbff5b141fcbac0786a3c7033dd96c1a.png)
还原及利用二进制日志操作
我们现在利用的3306的备份文件和相应的日志进行操作
将备份文件和 日志都拷贝到要恢复的服务器上(这里我们是一台服务器),
文件夹为 /root/bak
![b6e79f4b876f394c49ed5bf657e9697c.png](https://img-blog.csdnimg.cn/img_convert/b6e79f4b876f394c49ed5bf657e9697c.png)
登陆3307 先初始化日志为还原做准备
reset master ;
show master status;
![e68a64cc912d635a95d055cf9f80dbfd.png](https://img-blog.csdnimg.cn/img_convert/e68a64cc912d635a95d055cf9f80dbfd.png)
使用3306备份还原库
mysql -S /data/3307/mysql.sock -u root -p
source /root/bak/3306test.db
对比3306 和 3307 中test表
![ee262fef4cc984ab84183b1e4ed0d181.png](https://img-blog.csdnimg.cn/img_convert/ee262fef4cc984ab84183b1e4ed0d181.png)
![90fba2b54881993db9685d854fb9567d.png](https://img-blog.csdnimg.cn/img_convert/90fba2b54881993db9685d854fb9567d.png)
通过查询binlog 日志,找出需要恢复的时间点
mysqlbinlog mysql3306-bin.000002| more
![66dc44cdcb986d813fce55acb2033e39.png](https://img-blog.csdnimg.cn/img_convert/66dc44cdcb986d813fce55acb2033e39.png)
为了更好的查找要恢复的节点,我们将日志打印出sql语句来
mysqlbinlog --start-datetime='2019-11-23 01:01:01' --stop-datetime='2019-11-23 16:38:00' /root/bak/mysql3306-bin.000002 -v
并且使用时间来进行限定, 另外在二进制日志中,时间是使用时间戳,我们要把时间戳转换成时间
select from_unixtime(1574454464)
2019-11-23 04:27:44
使用二进制日志进行还原数据
![1ec7e29cd246e388db19f6bfd19ed7bc.png](https://img-blog.csdnimg.cn/img_convert/1ec7e29cd246e388db19f6bfd19ed7bc.png)
mysqlbinlog --stop-position="443" --start-position="296" /root/bak/mysql3306-bin.000002 | mysql -S /data/3307/mysql.sock -u root -p test
![181f40ed32f19a6240a2fd8e00bcd089.png](https://img-blog.csdnimg.cn/img_convert/181f40ed32f19a6240a2fd8e00bcd089.png)
还原完后我们看下数据对比
SELECT * FROM test.test;
![f13b339ef34b291bcc951873ce27fc87.png](https://img-blog.csdnimg.cn/img_convert/f13b339ef34b291bcc951873ce27fc87.png)
![be2d23a9c15af8c7253d54efb90b8b99.png](https://img-blog.csdnimg.cn/img_convert/be2d23a9c15af8c7253d54efb90b8b99.png)
mysqlbinlog --start-position="443" /root/bak/mysql3306-bin.000002 | mysql -S /data/3307/mysql.sock -u root -p test
最后进行对比
![9bb6b5322aac0645baf711ec2b718e0d.png](https://img-blog.csdnimg.cn/img_convert/9bb6b5322aac0645baf711ec2b718e0d.png)
![a45ae8a04faf9201828bac03bea2cb32.png](https://img-blog.csdnimg.cn/img_convert/a45ae8a04faf9201828bac03bea2cb32.png)