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

news2024/11/10 15:58:18

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 Connect
    return 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 connect
    self._get_server_information()
  File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 1269, in _get_server_information
    self.server_charset = charset_by_id(lang).name
  File "/usr/local/lib/python3.6/site-packages/pymysql/charset.py", line 38, in by_id
    return 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 BinLogStreamReader
  File "/usr/local/lib/python3.6/site-packages/pymysqlreplication/__init__.py", line 23, in <module>
    from .binlogstream import BinLogStreamReader
  File "/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 execute
    result = self._query(query)
  File "/usr/local/lib64/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)
  File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 517, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 732, in _read_query_result
    result.read()
  File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 1075, in read
    first_packet = self.connection._read_packet()
  File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packet
    packet.check_error()
  File "/usr/local/lib64/python3.6/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "/usr/local/lib64/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise 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_binlog
    for binlog_event in stream:
  File "/usr/local/lib/python3.6/site-packages/pymysqlreplication/binlogstream.py", line 408, in fetchone
    pkt = self._stream_connection._read_packet()
  File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packet
    packet.check_error()
  File "/usr/local/lib64/python3.6/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "/usr/local/lib64/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise 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_binlog
    for binlog_event in stream:
  File "/usr/local/lib/python3.6/site-packages/pymysqlreplication/binlogstream.py", line 408, in fetchone
    pkt = self._stream_connection._read_packet()
  File "/usr/local/lib64/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packet
    packet.check_error()
  File "/usr/local/lib64/python3.6/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "/usr/local/lib64/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise 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.coloradmin.cn/o/1304463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win11专业版,eNSP启动失败,错误代码40 解决方法

微软Win11系统默认开启的 Virtualization-based Security &#xff08;VBS&#xff09;“基于虚拟化的安全性”会导致游戏、跑分性能下降。VBS 基于虚拟化的安全性&#xff0c;通常称为内核隔离。使用硬件虚拟化在内存中创建安全区域&#xff0c;为其他安全功能提供了一个安全平…

DNSLog漏洞探测(五)之XXE漏洞实战

DNSLog漏洞探测(五)之XXE漏洞实战 本文我们来学习如何利用DNSLog平台探测目标网站是否存在RCE漏洞&#xff0c;接下来我们还是利用Pikachu的靶场作为演示。首先我们先进入Pikachu靶场的XXE漏洞界面。 如果此时网站的界面存在着无回显的XXE漏洞&#xff0c;这种情况下&#xff…

JMeter直连数据库

JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名&#xff0c;密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单&#xff0c;检查接口返回的订单号&#xff0c;是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后&#xff…

美团P3-2大佬写给初中级前端的《高级进阶面试指南》

都说金9银10&#xff0c;节前自己也去面试了几家公司&#xff0c;幸而都收到了offer。如今已经入职美团两月有余&#xff0c;最近闲来有空&#xff0c;整理一番&#xff0c;希望对各位找工作有帮助。 说在前面&#xff0c;我的答案仅供参考。答案有不全或有偏颇之处&#xff0…

Linux 搭建 gitlab

目录 前言安装依赖项添加GitLab存储库安装GitLab CE创建新存储目录编辑GitLab配置文件,例如更改默认域名或端口:重新配置并启动GitLab服务以应用更改:前言 centos搭建gitlab代码仓库 安装依赖项 在安装GitLab之前,您需要先安装一些必要的依赖项: yum install -y curl …

Clique expension和star expension

Clique expension&#xff08;团扩展&#xff09;&#xff0c;也叫连通分量扩展。 其含义是&#xff1a;将超边中所有顶点都连接在一起&#xff0c;比如有3个顶点的超边&#xff0c;扩展成普通图时两两相连就会有3条边。以此类推。连接和n个顶点的超边拓展后有条边。同一个超边…

keil生成bin文件(通用型)

有些时候需要在keil里面生成bin文件&#xff0c;但找到的各种方式五花八门&#xff0c;特别是要填写文件路径等没有通用性&#xff0c;搞个不同的工程就得改下&#xff0c;找到这个跟路径无关的代码&#xff0c;进行记录下。 首先还是点开keil的设置&#xff1a; 按照上面的图…

前沿技术|张磊:RR22 Blazing Fast PSI 实现介绍

“隐语”是开源的可信隐私计算框架&#xff0c;内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择&#xff0c;提供丰富的联邦学习算法和差分隐私机制 开源项目 github.com/secretflow gitee.com/secretflow ​ 11月25日&#xff0c;「隐语开源社区 Meetup西安站」顺利举…

node 版本管理与镜像源

工作中使用node&#xff0c;不同的前端项目可能依赖不同的版本&#xff0c;就需要对node进行版本管理&#xff0c;我们可以使用n来进行node版本的管理&#xff0c;而且n也可以用于安装指定版本的node。 在安装n之前&#xff0c;我们先来确定一下我们的npm是否配置有国内镜像源…

当 Sealos 遇上区块链

当 Sealos 遇上区块链 拿着区块链技术不一定是去发币&#xff0c;很多业务系统也适合用这些技术&#xff0c;比如做个统一支付系统&#xff0c;积分系统等&#xff0c;可以做为一家公司的金融基础设施&#xff0c;或支付中台。拿链的技术去做有很多好处&#xff1a; 高可用&a…

linux(5):linux基础命令第五弹

在linux基础命令第四弹中http://t.csdnimg.cn/tvuNl我们了解了echo、tail命令、管道符和vim文本编辑器的相关内容。这一篇我们会了解关于命令选项的说明 我们在之前的学习中&#xff0c;发现命令中的选项是非常多的&#xff0c;比如-l -c -m -r -w 等等&#xff0c;命令有很多&…

BH1750光照传感器——STM32驱动

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

『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用

App自动化测试之Appium基础篇』| Desired Capabilities详解与使用 1 关于appium driver2 安装appium driver3 安装Appium Python Client4 安装测试对象5 获取测试对象信息5.1 使用dumpsys5.2 使用AndroidKiller5.3 使用aapt 6 Capabilities详解6.1 Capabilities介绍6.2 automat…

【VTK】VTK中的光标样式

很高兴在雪易的CSDN遇见你 前言 本文分享VTK中的光标设置相关内容技术&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点赞就是我的动力(&#xff3e;&#xff35;&#…

DNSLog漏洞探测(六)之SSRF漏洞实战

DNSLog漏洞探测(六)之SSRF漏洞实战 本文我们来学习如何利用DNSLog平台探测目标网站是否存在SSRF漏洞&#xff0c;接下来我们还是利用Pikachu的靶场作为演示。首先我们先进入Pikachu靶场的SSRF漏洞界面。SSRF漏洞更多的可以称之为服务端的请求伪造。 像是原本探测漏洞的手段&am…

契约锁电子签章让合同起草、审查不再难

起草、审查合同是签约过程中最繁琐的环节之一。 小到筛选合同范本、确认并填写签署方信息、计算工资、服务费用或产品价格&#xff0c;大到合同条款审查、修改…总之想要呈现一份合规、双方满意的合同文书常常消耗大量时间和精力&#xff0c;事倍功半。 销售刚刚和客户确认订单…

二百一十四、Linux——Linux系统时间比电脑时间慢5分钟

一、目的 服务器重启后&#xff0c;发现Linux的系统时间比电脑时间慢5分钟&#xff0c;于是看了些博客&#xff0c;终于找到了解决方法&#xff0c;记录一下&#xff0c;以防止后面出现同样的问题 二、问题 通过date查看&#xff0c;Linux系统时间比电脑时间慢5分钟 &#…

源码级详解Spring的三级缓存,循环依赖的处理流程

一.什么是三级缓存 1.一级缓存&#xff1a;存放已经初始化完成的Bean 2.二级缓存&#xff1a;存放半成品Bean&#xff0c;既实例化完成未初始化的Bean。 3.三级缓存&#xff1a;存放bean工厂 二.为什么是三级缓存 一级缓存是必须的&#xff0c;这个我们没有什么疑问。那为…

等保2.0的变化

1法律地位得到确认 《中华人民共和国网络安全法》第21条规定“国家实行网络安全等级保护制度”&#xff0c;要求“网络运营者应当按照网络安全等级保护制度要求&#xff0c;履行安全保护义务”&#xff1b;第31条规定“对于国家关键信息基础设施&#xff0c;在网络安全等级保护…

时序数据库TDengine安装及c#连接读写数据

物联网数据采集&#xff0c;需写入大量数据&#xff0c;这时就用到时序数据库来存储和快速读取 我个人使用感觉国产的开源项目TDengine&#xff0c;比InfluxDB操作方便很多&#xff0c;容易上手&#xff0c;支持使用SqlSugar进行数据操作&#xff0c;跟操作mysql数据库一样的体…