博客 MySQL——通过binlog恢复数据

MySQL——通过binlog恢复数据

   数栈君   发表于 2023-08-18 10:33  513  0

1.binlog基本概念

二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。
binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE、DROP等)以及表数据修改(INSERT、UPDATE、DELETE、TRUNCATE等)的二进制日志。不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但可以通过查询通用日志来查看MySQL执行过的所有语句。


binlog有两个常用的使用场景:

    ●主从复制:master节点开启binlog,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的(详见MySQL实操(二)——MySQL主从同步实战_醉酒的戈多的博客-CSDN博客)。

    ●数据恢复:通过mysqlbinlog工具来恢复数据(本文主要讲解功能)。

2.MySQL开启binlog

MySQL安装完成后,MySQL5.7版本binlog默认不开启,MySQL8默认开启binlog;登录MySQL后,查看binlog状态sql如下:

show variables like '%log_bin%';
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/8487488aad263e38049acec32a4b7aa1..png
  

如未开启binlog日志,则可按以下步骤开启binlog日志

开启binlog日志

修改MySQL配置文件,linux中配置文件为my.conf,window下问my.ini,下面以centos为例演示

    ●编辑配置文件
vim /etc/my.cnf
    ●添加配置项
log-bin=mysql-bin
server-id=1

    ●重启MySQL服务

systemctl restart mysqld
    ●进入MySQL查看binlog日志是否开启成功

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/1d5bd2cb69e3d45e8d8b146016260a05..png
  

log_bin为ON说明这个参数是开启的,就是说系统是记录了bin log的
log_bin_basename配置了bin log的文件路径及文件前缀名
log_bin_index配置了bin log索引文件的路径

    ●查看日志列表
show master logs;
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/c9a177e563e179256660df87b33fae21..png
  

    ●根据log_bin_basename的路径查看binlog具体文件

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/224b395a94007a495d91eff849d574c9..png
  

3.使用binlog日志恢复数据

原理:当数据库发生变化时,binlog会记录数据库中的所有变化;需要恢复的时候可以根据binlog中的开始位置和结束位置还原本部分操作;结束位置一般是数据被破坏或删除之前的位置。

3.1.恢复前准备工作

开启binlog之后,创建测试数据库,在测试数据库中创建测试表,并写入数据:

create database test;
use test;
CREATE TABLE `testuser` (
    `id` int(11) NOT NULL,
    `name` varchar(255) DEFAULT NULL,
    `age` decimal(18,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into `testuser`(`id`,`name`,`age`) values (1,'张三',24.00);
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/b08ff51c84601c16dba84058263c6c53..png
  

此时假如误删了test数据库,就可以用binlog来进行回复数据库、库中的表及表中的数据;

drop database test;

3.2.数据恢复

当需要恢复数据时,为了防止恢复数据后影响最新业务,需要执行flush logs,产生一个新的binlog文件,此时旧的binlog文件不会再有写入;

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/634a0ef54a8bff20547dcbb5b2878de2..png
  

下面具体通过mysql-bin.000001来进行数据恢复

恢复时需要在binlog中找到两个位置:

    ●数据恢复的起始位置

    ●数据恢复的结束位置

如在数据准备中的drop操作,需要在binlog中找到该位置,并将该位置作为数据恢复的结束位置

3.2.1.通过mysqlbinlog将binlog转为sql,以方便查询具体位置

mysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql-bin.000001>backuptmp.sql
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/f8efa8349a9e9333a3c6b49007a666db..png
  

3.2.2.查看生成的backuptmp.sql,最终确定需要恢复的起始位置为219,结束位置为982

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/2cb8cbc6c37972bb99db831b047c9a8a..png
  

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/2cb8cbc6c37972bb99db831b047c9a8a..png
  

3.2.3.通过mysqlbinlog执行恢复操作

mysqlbinlog -v /var/lib/mysql/mysql-bin.000001 --start-position=219 --stop-position=982 | mysql -uroot -p123456
/var/lib/mysql/mysql-bin.000001       要操作binlog文件

--start-position=219                          数据恢复的起始位置

--stop-position=982                          数据恢复的结束位置

mysql -uroot -p123456                     数据恢复需要登录数据库
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/9cf73b33f345d4396f57b1de78a0c40b..png
  




免责申明:


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群