MySQL根据binlog恢复数据

简介

本文介绍了使用mysqlbinlog导出数据,根据binlog恢复数据,和导出数据时报需要super权限的解决方法。

环境

MySQL: 5.7.40

说明

MySQL的binlog是数据库服务器在运行过程中产生的日志文件,记录了数据库增删改的操作,可用于恢复和故障排错,在使用binlog前,请确保mysql启用了binlog

正文

一、排查并查找binlog的日志的存储位置

在mysql中执行以下命令检查mysql是否启用binlog,若为 “ ON ” 则为开启,“ OFF ” 为未开启 

show variables like 'log_bin'

开启binlog日志,Linux中找my.cnf文件,默认在 “ /etc/my.cnf ” 路径下,Windows找my.ini文件,默认在安装目录下,我们是linux中,如下图

MySQL根据binlog恢复数据_第1张图片

“ log-bin ” 配置了路径就代表开启了binlog日志,mysql-bin的默认路径为/var/lib/mysql/目录下

“ innodb_data_home_dir = /www/server/data ”,这个是和innodb相关的数据的存储路径,也是mysql的数据主目录,我们的binlog日志文件就在这个下面

MySQL根据binlog恢复数据_第2张图片

二、查找mysqlbinlog命令存储位置

“ mysqlbinlog ” 命令的位置在安装目录的bin文件夹下,我们需要用此命令才能打开binlog

使用以下命令查看mysql安装位置 

which mysql

切换到/usr/bin/文件夹下使用“ ll ”查看mysql指向的文件夹,如下图

MySQL根据binlog恢复数据_第3张图片

“ mysqlbinlog ”命令存储位置 /www/server/mysql/bin/

MySQL根据binlog恢复数据_第4张图片


下面进入主题

一、为方便排查,我们导出文件sql文件

/www/server/mysql/bin/mysqlbinlog  
--database=xx --start-datetime="2023-11-23 19:00" 
--stop-datetime="2023-11-24 14:12"  
www/serser/data/mysql-bin.000022 > /root/000022.sql

说明:导出xx数据库,时间起点:2023-11-23 19:00,时间结束点:2023-11-24 14:12 的mysql-bin.000022的binlog日志转成000022.sql文件并存储到root目录下

还可以根据位置点的方式来导出,这种导出最精确

/www/server/mysql/bin/mysqlbinlog  
--database=xx --start-position=55079756
--stop-position=55081588
www/serser/data/mysql-bin.000022 > /root/000022.sql

注意:如果执行导出时发现报错需要super权限

you need (at least one of) the SUPER privilege(s) for this operation

解决办法,先查看登录数据库的账户权限

select user,Super_priv from mysql.user;

赋予super权限

update mysql.user set Super_priv='Y' where user='test_db_user';

刷新权限

flush privileges;

然后即可执行导出命令

打开下载到window后的000022.sql文件 

MySQL根据binlog恢复数据_第5张图片

我们恢复的方式就是找到错误操作的数据然后执行对应的sql进行还原,也可以根据位置点或时间区间还原,但一定要确保还原后的数据是正确的,特别要小心仔细别写错了

举个例子:

一、根据位置区间或时间区间批量恢复,以下恢复以位置区间为例

/www/server/mysql/bin/mysqlbinlog --start-position=55079756 --stop-position=55081557 --database=xx /www/server/data/mysql-bin.000022|mysql -u用户名 -p密码 -v 数据库名

解释:恢复数据库=xx,位置起始点=55079756,结束点=55079757 区间内的数据,-v 表示执行此命令,执行后的截图我就不发了,就是一条sql下面一条set

二、手动恢复

MySQL根据binlog恢复数据_第6张图片

通过上图我们发现在23-11-24 14:34:26秒,删除了ID为184的acc_business_bills数据,那我们就需要找到并执行acc_business_bills表的ID=184的这条数据的新增sql进行还原通过  

 MySQL根据binlog恢复数据_第7张图片

我们发现这条数据是在 23-11-24 12:19:56秒创建的,因此复制下来执行就还原了

注意:一定要确保这条sql在删除前是没有进行更新的(继续排查binlog,排查时间段就是 “ 23-11-24 12:19:56 至 23-11-24 14:34:26 ” 这个时间区间),否则新增后的数据也是不正确的

 

完成 

你可能感兴趣的:(MySQL,mysql,mysqlbinlog,mysql恢复数据)