本文介绍了使用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中,如下图
“ log-bin ” 配置了路径就代表开启了binlog日志,mysql-bin的默认路径为/var/lib/mysql/目录下
“ innodb_data_home_dir = /www/server/data ”,这个是和innodb相关的数据的存储路径,也是mysql的数据主目录,我们的binlog日志文件就在这个下面
二、查找mysqlbinlog命令存储位置
“ mysqlbinlog ” 命令的位置在安装目录的bin文件夹下,我们需要用此命令才能打开binlog
使用以下命令查看mysql安装位置
which mysql
切换到/usr/bin/文件夹下使用“ ll ”查看mysql指向的文件夹,如下图
“ mysqlbinlog ”命令存储位置 /www/server/mysql/bin/
下面进入主题
一、为方便排查,我们导出文件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文件
举个例子:
一、根据位置区间或时间区间批量恢复,以下恢复以位置区间为例
/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
二、手动恢复
通过上图我们发现在23-11-24 14:34:26秒,删除了ID为184的acc_business_bills数据,那我们就需要找到并执行acc_business_bills表的ID=184的这条数据的新增sql进行还原通过
我们发现这条数据是在 23-11-24 12:19:56秒创建的,因此复制下来执行就还原了
注意:一定要确保这条sql在删除前是没有进行更新的(继续排查binlog,排查时间段就是 “ 23-11-24 12:19:56 至 23-11-24 14:34:26 ” 这个时间区间),否则新增后的数据也是不正确的