MySQL数据恢复之binlog2sql的安装和使用,很详细

MySQL数据恢复之binlog2sql的安装和使用,很详细

  • 一、前言
  • 二、binlog2sql的介绍
  • 三、安装binlog2sql
    • 1、安装git(已安装可以跳过)
      • (1)、正常安装
      • (2)、编译安装报错
        • ①、安装libcurl
      • (2)、编译安装报错2
        • ①、安装expat
    • 2、安装pip(已安装可以跳过)
      • (1)、安装Python
    • 3、安装 binlog2sql
  • 四、在MySQL中增加binlog2sql的相关配置
    • 1、增加MySQL配置
    • 2、创建用户并授予权限
      • (1)、创建用户
        • ①、正常创建
        • ②、创建用户报错1(没有报错可以不看)
        • ③、创建用户报错2(没有报错可以不看)
      • (2)、授予用户权限
  • 五、binlog2sql 使用案例
    • 1、查看日志是否打开
    • 2、定位误操作的数据库日志文件
    • 3、数据恢复
    • 4、踩坑(能正常执行命令可以不看)
      • (1)、坑一
      • (2)、坑二
      • (3)、坑三
      • (4)、坑四
      • (5)、坑五
      • (6)、坑六

一、前言

使用 binlog2sql 要求 日志是打开的 ON ,并且 binlog_format 要为 ROW 类型,如果不满足,则不能使用 binlog2sql 恢复数据,后面就不用看了。

查询日志命令如下:

show variables like 'log_bin';

在这里插入图片描述

查询当前MySQL服务器的二进制日志格式,命令如下:

show variables like 'binlog_format';

在这里插入图片描述

binlog_format:

是MySQL二进制日志的一个系统变量,它定义了二进制日志的格式。

binlog_format 可以设置为如下值:

STATEMENT:

在这个模式下,二进制日志记录的是SQL语句本身,而不是数据的更改。这种格式是最简单的,但可能存在一些限制和问题,比如对于同一个表的多个更新操作,可能会产生重复的日志记录。

ROW:

在这个模式下,二进制日志记录的是每一行数据的变化。这种格式提供了更高的精度和灵活性,但会产生更多的日志数据。

MIXED:

在这个模式下,MySQL会根据执行的SQL语句的类型和参数,选择使用STATEMENT或ROW格式来记录二进制日志。这种格式旨在平衡精度和性能。

二、binlog2sql的介绍

binlog2sql:

从MySQL binlog解析出你要的SQL。根据不同选项,你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。

作用:

数据快速回滚(闪回)
主从切换后新master丢数据的修复
从binlog生成标准SQL,带来的衍生功能

项目状态:

正常维护。应用于部分公司线上环境。
已测试环境
Python 2.7, 3.4+
MySQL 5.6, 5.7

这是官方文档的地址:

https://github.com/danfengcao/binlog2sql

个人觉得可以写的再详细点…

三、安装binlog2sql

1、安装git(已安装可以跳过)

安装 binlog2sql 需要 git ,安装也折腾了好久,这里做个记录。

(1)、正常安装

下载地址:

https://github.com/git/git/tags

在这里插入图片描述

我下载的是 2.43.0 版本,下载后上传到服务器目录,这里上传到 /usr/local/git 目录

在这里插入图片描述

解压,命令如下:

tar -zxvf 安装包名称

这是我的:

tar -zxvf git-2.43.0.tar.gz

在这里插入图片描述

在这里插入图片描述

进入git根目录

cd git-2.43.0/

在这里插入图片描述

编译安装,需要一点时间,注意 prefix 后面不是安装目录,直接复制黏贴即可。

make prefix=/usr/local/git all

在这里插入图片描述

中间太长就没截图

在这里插入图片描述

然后再执行如下命令:

make prefix=/usr/local/git install

在这里插入图片描述

在这里插入图片描述

查看git安装成功没有,命令如下:

git --version

在这里插入图片描述

安装成功!!

(2)、编译安装报错

如果安装报错:

git-curl-compat.h:3:10: fatal error: curl/curl.h: No such file or directory

原因:

这个错误是说没有找到 curl/curl.h 这个文件。这通常意味着你的系统上没有安装 libcurl,或者安装了但是其头文件没有在你的系统路径中。

在这里插入图片描述

①、安装libcurl

尝试安装对应 libcurl ,命令如下:

sudo apt-get install libcurl4-openssl-dev

如果报错:

sudo: apt-get: command not found

原因:

这通常意味着 apt-get 没有在你的系统路径中,或者你的系统可能不是基于 Debian 或 Ubuntu 的。

在这里插入图片描述

查看自己的系统版本,命令如下:

uname -a

在这里插入图片描述

嗯。。确实不是 Debian 或 Ubuntu 。

那就先下载curl

在这里插入图片描述

下载地址:

https://curl.se/download.html

我下载的是 8.4.0 版本,下载后上传到服务器目录,这里上传到 /usr/local/curl

在这里插入图片描述

解压,命令如下:

tar -zxvf 安装包

这是我的:

tar -zxvf curl-8.4.0.tar.gz

在这里插入图片描述

解压完成后进入根目录

在这里插入图片描述

增加如下配置指定安装目录,直接复制黏贴,命令如下:

./configure --prefix=/usr/local/curl

在这里插入图片描述

执行完毕在进行安装:

make

在这里插入图片描述

如果执行 make 命令报如下错:

在这里插入图片描述

如果执行结束时报错,这时执行如下命令:

./configure --prefix=/usr/local/curl-8.4.0/ --with-wolfssl

在这里插入图片描述

如果报如下错:

在这里插入图片描述

试着用如下命令:

./configure --with-openssl

在这里插入图片描述

在这里插入图片描述

成功!!

感谢这个老哥的博客,如果还没成功,只能说这个办法不适合所有人。

然后再进行 make ,需要点时间,命令如下:

make

在这里插入图片描述

在这里插入图片描述

make 成功!!

再使用如下命令:

make install

如果报错如下:

make: *** No rule to make target 'install'.  Stop.

在这里插入图片描述

更新一下 yum ,先执行如下命令:

yum update

需要点时间

在这里插入图片描述

然后再执行

make install

在这里插入图片描述

在这里插入图片描述

检测是否安装成功,就是查看 curl 版本号,命令如下:

curl --version

在这里插入图片描述

成功!!

测试是否可以使用,以测试百度为例,命令如下:

curl www.baidu.com

在这里插入图片描述

应该是没问题了。

(2)、编译安装报错2

http-push.c:27:10: fatal error: expat.h: No such file or directory

在这里插入图片描述

原因:

这通常是因为你的系统缺少一个名为expat的库。expat是一个C语言库,用于解析XML数据。git需要这个库来正常工作。

①、安装expat

安装expat库,命令如下:

yum install expat-devel

在这里插入图片描述

2、安装pip(已安装可以跳过)

安装pip之前,必须已经安装Python,并且版本必须为 Python 2.7, 3.4+,

在这里插入图片描述

查看没有安装Python,命令如下:

python --version

在这里插入图片描述

可以看到已经安装Python,版本为 3.6.8 ,符合 binlog2sql 对 Python 的版本要求。

然后安装pip,命令如下:

yum install python3-pip

在这里插入图片描述

这里也提示安装过了。

(1)、安装Python

这里安装的是Python3,命令如下:

yum install python3

在这里插入图片描述

我这里已经安装过了,所以提示已安装。

继续安装 binlog2sql ,命令如下:

pip install -r requirements.txt

但是使用时报错

-bash: pip: command not found

在这里插入图片描述

在这里插入图片描述

可能是命令不叫 pip ,查一下 pip ,命令如下:

whereis pip

在这里插入图片描述

前往 /usr/bin 目录看看:

cd /usr/bin

在这里插入图片描述

确实不叫 pip ,那用 pip-3.6 试试,对应命令为:

pip-3.6 --version

或者 pip3.6 ,对应命令为:

pip3.6 --version

在这里插入图片描述

可以看到版本号,那应该就是这样用了。

3、安装 binlog2sql

前面已经安装好了git好pip,这里安装 binlog2sql ,选好自己的安装目录,我是安装在 /usr/local 目录,安装命令如下:

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql

在这里插入图片描述

官方的命令为:

pip install -r requirements.txt

在一、2里面已经提到我的pip命令为 pip-3.6 或者 pip3.6 ,这里用 pip-3.6,所以命令如下:

pip-3.6 install -r requirements.txt

在这里插入图片描述

四、在MySQL中增加binlog2sql的相关配置

1、增加MySQL配置

进入MySQL的配置文件,命令如下:

vim /etc/my.cnf

在MySQL的配置文件 [mysqld] 中加入官方给出的配置,配置如下:

server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

我将 log_bin 改为 /opt/jeecg-boot/log/mysql/mysql-bin.log ,这是我的:

# binlog2sql需要
server_id = 1
log_bin = /opt/jeecg-boot/log/mysql/mysql-bin.index
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

加入之后保存退出,重启MySQL:

systemctl restart mysql

报错:

Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.

在这里插入图片描述

按照提示输入命令:

systemctl status mysql.service

在这里插入图片描述

报错日志在 /usr/local/mysql/mysql-8.0.35/data 目录下名为 iZf8z8qpzl0oqs4a6mc897Z 的文件中,打开查看:

在这里插入图片描述

说找不到 /opt/jeecg-boot/log/mysql/mysql-bin.index 文件,难道这个文件不能自己创建的?好吧,我到 /opt/jeecg-boot/log/mysql/ 这个目录手动创建一下,再次重启:

systemctl restart mysql

还是报错,打卡日志文件一看,跟前面的错一模一样,会不会是没有读写权限?那就给这个目录读写权限,命令如下:

chmod -R 777 /opt/jeecg-boot/log/mysql

在这里插入图片描述

再次重启

systemctl restart mysql

在这里插入图片描述

成功!!

这时再想:现在有了读写权限了,把文件删除了再次重启能不能启动成功?

试试吧,就把文件删除了

在这里插入图片描述

再次重启

在这里插入图片描述

看来是能自己创建的,不过就是不知道为什么没有 mysql-bin.log 文件,明明在 log_bin 上指定的文件名为 mysql-bin.log 。

2、创建用户并授予权限

官方文档中提到:

user需要的最小权限集合:select, super/replication client, replication slave
建议授权:GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO

权限说明:

select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
super/replication client:两个权限都可以,需要执行’SHOW MASTER STATUS’, 获取server端的binlog列表
replication slave:通过BINLOG_DUMP协议获取binlog内容的权限

在这里插入图片描述

(1)、创建用户

这里创建一个名为 binlog2sql 的用户。

①、正常创建

登录MySQL:

在这里插入图片描述

然后创建用户:

create user 'binlog2sql'@'%' identified by '123456';

在这里插入图片描述

注意这里

在这里插入图片描述

如果是云服务器就不要使用 127.0.0.1 或者 localhost ,我试了一下新创建的用户会登录不了,用 % 则可以登录成功。

②、创建用户报错1(没有报错可以不看)

假如创建用户的过程中报错:

ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.

在这里插入图片描述

这其实是因为之前设置过 wait_timeout 和 interactive_timeout ,之前设置为 120 秒,超过了这个时间就报错了

在这里插入图片描述

但虽然报这个错,但用户还是创建成功的,查看一下用户表,命令如下:

select Host, User from user;

在这里插入图片描述

可以适当增大 wait_timeout 和 interactive_timeout 参数的值,或者做一次查询唤醒连接,再次操作数据库就不会报这个错了。

③、创建用户报错2(没有报错可以不看)

假如创建用户报错:

ERROR 1396 (HY000): Operation CREATE USER failed for 'binlog2sql'@'127.0.0.1'

可能之前已经创建过同名用户,查询一下用户表,先切换到 mysql 数据库

use mysql;

再查询用户表

select Host, User from user;

在这里插入图片描述

可以看到确实已经创建了名为 binlog2sql 的用户,如果已经确定 binlog2sql 用户是之前误创的,可以先删除

drop user binlog2sql@'127.0.0.1';

在这里插入图片描述

再创建

create user 'binlog2sql'@'%' identified by '123456';

在这里插入图片描述

(2)、授予用户权限

执行如下sql:

grant select, insert, update on *.* to 'binlog2sql'@'%';

在这里插入图片描述

解释:

.:“.”前面代表数据库名,“.”后面代表表名,“.”代表所有数据库的所有表。

授权之后再刷新一下权限,命令如下:

flush privileges;

在这里插入图片描述

然后使用新创建的用户 binlog2sql 试试能不能登录

在这里插入图片描述

可以登录!!

补充一下,登录成功可以不看。

假如使用 binlog2sql 用户登录报错

在这里插入图片描述

这可能是创建用户时 @ 后使用的是 127.0.0.1 或者 localhost ,并且是本地连接远程的服务器。

解决办法:删了 binlog2sql 用户,在创建用户时 @ 后使用 % 重新创建即可。

五、binlog2sql 使用案例

1、查看日志是否打开

这里多啰嗦一下查看日志的过程,查询日志是否打开,命令如下:

show variables like 'log_bin';

在这里插入图片描述

查询当前MySQL服务器的二进制日志格式,命令如下:

show variables like 'binlog_format';

在这里插入图片描述

binlog_format:

是MySQL二进制日志的一个系统变量,它定义了二进制日志的格式。

binlog_format 可以设置为如下值:

STATEMENT:

在这个模式下,二进制日志记录的是SQL语句本身,而不是数据的更改。这种格式是最简单的,但可能存在一些限制和问题,比如对于同一个表的多个更新操作,可能会产生重复的日志记录。

ROW:

在这个模式下,二进制日志记录的是每一行数据的变化。这种格式提供了更高的精度和灵活性,但会产生更多的日志数据。

MIXED:

在这个模式下,MySQL会根据执行的SQL语句的类型和参数,选择使用STATEMENT或ROW格式来记录二进制日志。这种格式旨在平衡精度和性能。

2、定位误操作的数据库日志文件

这里先做个测试,例如:我在 2023-12-08 16:48:00 至 2023-12-08 16:49:00 的时间范围内误删了数据表 sys_user_depyq 中的所有数据。

注意!误操作的时间很重要,越精确越好,因为生成回滚sql比较慢,如果时间间隔比较长的话,生成sql的时间也会很长,我这里就删除了两条数据,执行命令不能立刻得到误操作的sql。

在这里插入图片描述

现在要恢复一下,先查询当前MySQL服务器的主日志文件信息,sql如下:

show master status;

在这里插入图片描述

这里提一嘴,不需要关注日志文件 mysql-bin.000002 的所在目录,只要知道查出来叫什么名就好了,在解析sql时只需要文件名,不需要知道绝对路径。

3、数据恢复

先前往 binlog2sql 安装的根目录,就是 binlog2sql.py 文件所在目录,这里安装在 /usr/local/binlog2sql/binlog2sql 目录,查看删除sql,命令如下:

python ./binlog2sql.py -h127.0.0.1 -P3306 -ubinlog2sql -p123456 -dyungong -t sys_user_depyq --start-file='mysql-bin.000002' --start-datetime="2023-12-08 16:48:00" --stop-datetime="2023-12-08 16:49:00"

在这里插入图片描述

记得把IP地址、用户名、密码改为自己的。生成执行sql会比较慢,耐心等待一下。

也可以用 binlog2sql.py 文件的绝对路径,就不用跑到 binlog2sql 根目录了,命令如下:

python /usr/local/binlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -ubinlog2sql -p123456 -dyungong -t sys_user_depyq --start-file='mysql-bin.000002' --start-datetime="2023-12-08 16:48:00" --stop-datetime="2023-12-08 16:49:00"

在这里插入图片描述

然后是生成回滚sql,就是在前面命令的基础上加上 --flashback 参数,命令如下:

python /usr/local/binlog2sql/binlog2sql/binlog2sql.py --flashback -h47.120.44.227 -P3306 -ubinlog2sql -pZnfGVcz6rCNT -dyungong -t sys_user_depyq --start-file='mysql-bin.000002' --start-datetime="2023-12-08 16:48:00" --stop-datetime="2023-12-08 16:49:00"

在这里插入图片描述

假如生成的回滚sql有很多,可以以写入到文件中,这里写入到根目录的 flashback.sql 文件中,命令如下:

python /usr/local/binlog2sql/binlog2sql/binlog2sql.py --flashback -h127.0.0.1 -P3306 -ubinlog2sql -p123456 -dyungong -t sys_user_depyq --start-file='mysql-bin.000002' --start-datetime="2023-12-08 16:48:00" --stop-datetime="2023-12-08 16:49:00" > /flashback.sql

在这里插入图片描述

如果误操作的时间记得比较泛,可以将日志文件导出到sql,再放到本地查找,我这里只是演示,还是使用前面的开始和结束时间,将日志文件导出到根目录的 test.sql 文件中,使用如下命令:

mysqlbinlog --no-defaults --database=yungong --start-datetime="2023-12-08 16:48:00" --stop-datetime="2023-12-08 16:49:00" /opt/jeecg-boot/log/mysql/mysql-bin.000002 > /test.sql

在这里插入图片描述

然后查找被删除的表,拿到两个删除表日志前后的 position ,就是表前后 ANONYMOUS 之间的 position ,如下图所示:

在这里插入图片描述

就是把前面的 start-datetime 、stop-datetime 分别改为 start-position 、stop-position,然后使用开始和结束的 position 执行 binlog2sql 命令,命令如下:

python /usr/local/binlog2sql/binlog2sql/binlog2sql.py -h47.120.44.227 -P3306 -ubinlog2sql -pZnfGVcz6rCNT -dyungong -t sys_user_depyq --start-file='mysql-bin.000002' --start-position=4964386 --stop-position=4964802

在这里插入图片描述

可以看到也能拿到误删除的sql。

然后是执行得到回滚的sql,命令如下:

python /usr/local/binlog2sql/binlog2sql/binlog2sql.py --flashback -h47.120.44.227 -P3306 -ubinlog2sql -pZnfGVcz6rCNT -dyungong -t sys_user_depyq --start-file='mysql-bin.000002' --start-position=4964386 --stop-position=4964802

在这里插入图片描述

4、踩坑(能正常执行命令可以不看)

在一次误操作线上的数据库 yungong ,在更新 ygj_task_ulist 表时没有加上 where 条件,导致全表更新,误操作的时间是 2023-12-05 10:29:28.468 ,那就选定开始时间为 2023-12-05 10:27:00,结束时间为:2023-12-05 10:30:00 。这里记录一下解析日志时报的错。

(1)、坑一

假如使用时报错:

Traceback (most recent call last):File "./binlog2sql.py", line 149, in <module>back_interval=args.back_interval, only_dml=args.only_dml, sql_type=args.sql_type)File "./binlog2sql.py", line 46, in __init__self.connection = pymysql.connect(**self.conn_setting)File "/usr/local/lib/python3.6/site-packages/pymysql/__init__.py", line 90, in Connectreturn Connection(*args, **kwargs)File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 706, in __init__self.connect()File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 931, in connectself._get_server_information()File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 1269, in _get_server_informationself.server_charset = charset_by_id(lang).nameFile "/usr/local/lib/python3.6/site-packages/pymysql/charset.py", line 38, in by_idreturn self._by_id[id]
KeyError: 255

在这里插入图片描述

原因:

该问题主要原因是MySQL8.0更新了很多字符集,但是这些字符集长度超过255了,所以旧版的PyMySQL不支持长度超过255的字符。

解决办法就是更新 pymysql ,前面已经提到我的pip命令为 pip-3.6 或者 pip3.6 ,记得把pip换成自己的,这是我的命令:

pip-3.6 install --upgrade PyMySQL

在这里插入图片描述

(2)、坑二

如果使用时报错:

Traceback (most recent call last):File "./binlog2sql.py", line 7, in <module>from pymysqlreplication import BinLogStreamReaderFile "/usr/local/lib/python3.6/site-packages/pymysqlreplication/__init__.py", line 23, in <module>from .binlogstream import BinLogStreamReaderFile "/usr/local/lib/python3.6/site-packages/pymysqlreplication/binlogstream.py", line 8, in <module>from pymysql.util import int2byte
ModuleNotFoundError: No module named 'pymysql.util'

在这里插入图片描述

先卸载 pymysql ,前面已经提到我的pip命令为 pip-3.6 或者 pip3.6 ,这里根据自己的情况修改,命令如下:

pip-3.6 uninstall pymysql

在这里插入图片描述

在这里插入图片描述

重新下载 pymysql ,也有说是MySQL8的版本问题,安装 binlog2sql 需要的 PyMySQL 版本,可以到 requirements.txt 文件中查看

在这里插入图片描述

可以看到 binlog2sql 要求 PyMySQL 版本为 0.7.11 ,我测试过下载 0.9.3 版本也可以满足,这里下载了 0.9.3 版本,我的命令如下:

pip-3.6 install pymysql==0.9.3

在这里插入图片描述

(3)、坑三

这时如果还报错:

Traceback (most recent call last):File "./binlog2sql.py", line 149, in <module>back_interval=args.back_interval, only_dml=args.only_dml, sql_type=args.sql_type)File "./binlog2sql.py", line 48, in __init__cursor.execute("SHOW MASTER STATUS")File "/usr/local/lib64/python3.6/site-packages/pymysql/cursors.py", line 170, in executeresult = self._query(query)File "/usr/local/lib64/python3.6/site-packages/pymysql/cursors.py", line 328, in _queryconn.query(q)File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 517, in queryself._affected_rows = self._read_query_result(unbuffered=unbuffered)File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 732, in _read_query_resultresult.read()File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 1075, in readfirst_packet = self.connection._read_packet()File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packetpacket.check_error()File "/usr/local/lib64/python3.6/site-packages/pymysql/protocol.py", line 220, in check_errorerr.raise_mysql_exception(self._data)File "/usr/local/lib64/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exceptionraise errorclass(errno, errval)
pymysql.err.InternalError: (1227, 'Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation')

在这里插入图片描述

这是没有 super 权限,使用 root 登录

mysql -uroot -p

在这里插入图片描述

给用户 binlog2sql 授权一下

grant super on *.* to 'binlog2sql'@'%';

在这里插入图片描述

然后再刷新一下权限

flush privileges;

在这里插入图片描述

(4)、坑四

再往下走,如果报错:

Traceback (most recent call last):File "./binlog2sql.py", line 149, in <module>back_interval=args.back_interval, only_dml=args.only_dml, sql_type=args.sql_type)File "./binlog2sql.py", line 53, in __init__raise ValueError('parameter error: start_file %s not in mysql server' % self.start_file)
ValueError: parameter error: start_file binlog.000019 not in mysql server

在这里插入图片描述

由于个人原因,在走到这一步时 binlog.000019 已经不是在生成当天了,当天生成的日志名为 mysql-bin.000002

show master status;

在这里插入图片描述

解决办法:只需要把文件名 binlog.000019 改为 mysql-bin.000002 再重新执行就可以了,为了出现意外,最好将原 mysql-bin.000002 文件先备份一下。

(5)、坑五

假如报错:

Traceback (most recent call last):File "./binlog2sql.py", line 150, in <module>binlog2sql.process_binlog()File "./binlog2sql.py", line 74, in process_binlogfor binlog_event in stream:File "/usr/local/lib/python3.6/site-packages/pymysqlreplication/binlogstream.py", line 408, in fetchonepkt = self._stream_connection._read_packet()File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packetpacket.check_error()File "/usr/local/lib64/python3.6/site-packages/pymysql/protocol.py", line 220, in check_errorerr.raise_mysql_exception(self._data)File "/usr/local/lib64/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exceptionraise errorclass(errno, errval)
pymysql.err.InternalError: (1227, 'Access denied; you need (at least one of) the REPLICATION SLAVE privilege(s) for this operation')

在这里插入图片描述

看报错提示是因为没有 REPLICATION SLAVE 权限,使用用户 root 登录MySQL查看用户 binlog2sql 的权限

show grants for 'binlog2sql'@'%';

在这里插入图片描述

可以看到确实没有 REPLICATION SLAVE 权限,那就给用户 binlog2sql 授权

grant replication slave on *.* to 'binlog2sql'@'%';

在这里插入图片描述

再刷新一下

flush privileges;

在这里插入图片描述

(6)、坑六

继续,假如报错:

Traceback (most recent call last):File "./binlog2sql.py", line 150, in <module>binlog2sql.process_binlog()File "./binlog2sql.py", line 74, in process_binlogfor binlog_event in stream:File "/usr/local/lib/python3.6/site-packages/pymysqlreplication/binlogstream.py", line 408, in fetchonepkt = self._stream_connection._read_packet()File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packetpacket.check_error()File "/usr/local/lib64/python3.6/site-packages/pymysql/protocol.py", line 220, in check_errorerr.raise_mysql_exception(self._data)File "/usr/local/lib64/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exceptionraise errorclass(errno, errval)
pymysql.err.InternalError: (1236, 'Could not open log file')

在这里插入图片描述

可能是因为改名后的 mysql-bin.000002 文件没有读写权限,授权一下

chmod -R 777 /opt/jeecg-boot/log/mysql/mysql-bin.000002

在这里插入图片描述

之后再执行 binlog2sql 的命令应该就没问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/268274.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Makefile语法

一、Makefile规则格式 Makefile 里面是由一系列的规则组成的&#xff0c;这些规则格式如下&#xff1a; 目标…... : 依赖文件集合…… 命令 1 命令 2 ……参考上一节gcc编译器与Makefile入门参考这条规则 1 main: main.o input.o calcu.o2 gcc -o main main.o input.o c…

19-数据结构-查找-散列查找

目录 一、散列查找结构思路图 二、哈希函数 三、解决冲突 1.开放地址法 1.1.线性探测法&#xff08;线性探测再散列法&#xff09; 1.2.平方探测法&#xff08;二次探测再散列&#xff09; 1.3.再散列法&#xff08;双散列法&#xff09; 2.拉链法 2.1简介 四、散列查…

蓝海彤翔元宇宙技术赋能非遗苏绣文化传播

12月8日&#xff0c;第十五届中国刺绣文化艺术节在苏州高新区正式开幕。本次大会旨在激活非遗传承高质量发展内生动力&#xff0c;以民间工艺发展助力乡村振兴&#xff0c;以传统文化创造性转化、创新性发展引领刺绣工艺文化推陈出新。 在项目启动环节&#xff0c;蓝海彤翔“元…

【hcie-cloud】【8】华为云Stack_LLD设计【部署设计、资源设计、服务设计、学习推荐、缩略语】【下】

设计概览、整体架构设计、网络设计 看下面-这篇文章 【hcie-cloud】【7】华为云Stack_LLD设计【设计概览、整体架构设计、网络设计、部署设计、资源设计、服务设计】【上】 部署设计 云平台整体部署架构 图中在Region下每个灰底都代表一个数据中心&#xff0c;AZ1可以跨数据…

LED 底层原理 和 GPIO引脚、寄存器操作

目录 LED 原理 LED 的驱动方式 普适的 GPIO 引脚操作方法 GPIO 寄存器操作 LED 原理 当我们学习 C 语言的时候&#xff0c;我们会写个 Hello 程序。 那当我们写 ARM 程序&#xff0c;也该有一个简单的程序引领我们入门&#xff0c;这个程序就是点亮 LED。 我们怎样去点亮…

书-选择排序法P156

#include<stdio.h> int main(){int b[5]{8,2,6,3,7};int i , j ,k ;for(i0;i<4;i){for(ji1;j<5;j)if(b[i]<b[j]){kb[i];b[i]b[j];b[j]k;} }for(i0;i<5;i)printf("%d ",b[i]); return 0; }选择排序&#xff1a;就是自己跟下一个比较&#xff0c;然后…

BH1750光照传感器——STM32驱动

———————实验效果——————— &#x1f384;硬件外观 &#x1f384; 接线 &#x1f388; VCC接 3.3V &#x1f388; GND接 GND &#x1f388; SCL接 PB2 &#x1f388; SDA接PB3 &#x1f388; ADDR 悬空不接 &#x1f384; 代码获取 &#x1f388; 查看下方 —…

gdb本地调试版本移植至ARM-Linux系统

移植ncurses库 本文使用的ncurses版本为ncurses-5.9.tar.gz 下载地址&#xff1a;https://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz 1. 将ncurses压缩包拷贝至Linux主机或使用wget命令下载并解压 tar-zxvf ncurses-5.9.tar.gz 2. 解压后进入到ncurses-5.9目录…

SD-WAN架构:优化连接以提升性能

SD-WAN架构主要分为三种类型&#xff0c;分别为本地架构、支持云的架构、支持云的骨干架构。每一种架构都基于它们利用广域网&#xff08;WAN&#xff09;的方式而有其独特的优势。本文将对三种SD-WAN架构进行简要介绍。 SD-WAN本地架构 SD-WAN本地架构是在现场使用SD-WAN盒或…

微信小程序:上传图片到别的域名文件下

效果 wxml <!-- 上传照片 --> <view class"addbtn"><view classpic name"fault_photo" wx:for"{{imgs}}" wx:for-item"item" wx:key"*this"><image classweui-uploader_img src"{{item}}"…

前期只用到审批流程,好用的OA软件有哪几个?

“前期只用到审批流程&#xff0c;需要五六个人层层审批&#xff0c;最好审批流程是免费的&#xff0c;后期会扩展到其它功能&#xff0c;有适合我的软件吗&#xff1f;” 先来总结一下题主的需求&#xff1a; OA系统中审批流程最好是免费的流程需要层层审批后期能够扩展到其…

给孩子选台灯什么标准好?精选高品质的护眼台灯

孩子的身心健康&#xff0c;永远是家长最关心的事情&#xff0c;但是现在的青少年近视率非常高&#xff0c;达到了52.7%&#xff0c;也就是说平均下来&#xff0c;每十个孩子当中就有五个是近视的&#xff01;面对这样的情况&#xff0c;我们又应该如何更好的保护孩子的眼睛呢&…