binlog2sql 离线安装与使用

安装

这里介绍 binlog2sql 的离线安装方法。

如果电脑服务器可以联网,则可以直接参考源码地址的安装方法。

源码地址: https://github.com/danfengcao/binlog2sql 

离线所需相关包如下:

argparse-1.4.0-py2.py3-none-any.whl
binlog2sql-master.zip
linecache2-1.0.0-py2.py3-none-any.whl
mysql-replication-0.9.tar.gz
PyMySQL-0.7.8-py2-none-any.whl
Python-2.7.18.tar.xz
six-1.10.0-py2.py3-none-any.whl
traceback2-1.4.0-py2.py3-none-any.whl
unittest2-1.1.0-py2.py3-none-any.whl
wheel-0.24.0-py2.py3-none-any.whl


python 下载地址:https://www.python.org/downloads/release/python-2718/
包下载地址:https://pypi.org/search/?q=python&page=2

PS:python 要用 2.6 以上的

安装准备环境

yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc libffi-devel xz unzip

解压 python 安装包并安装

tar xvf Python-2.7.18.tar.xz

cd Python-2.7.18

./configure --prefix=/usr --with-ensurepip --with-system-ffi

make && make install
检查是否安装成功

[root@test2 Python-2.7.18]# python --version
Python 2.7.18
[root@test2 Python-2.7.18]# pip --version
pip 19.2.3 from /usr/lib/python2.7/site-packages/pip (python 2.7)
[root@test2 Python-2.7.18]# 

安装其他包

cd /soft

pip install *.whl mysql-replication-0.9.tar.gz

 

添加别名

alias binlog2sql='python /soft/binlog2sql-master/binlog2sql/binlog2sql.py'

检查安装是否成功

binlog2sql --help,有帮助出现则成功
usage: binlog2sql.py [-h HOST] [-u USER] [-p [PASSWORD [PASSWORD ...]]]
                     [-P PORT] [--start-file START_FILE]
                     [--start-position START_POS] [--stop-file END_FILE]
                     [--stop-position END_POS] [--start-datetime START_TIME]
                     [--stop-datetime STOP_TIME] [--stop-never] [--help]
                     [-d [DATABASES [DATABASES ...]]]
                     [-t [TABLES [TABLES ...]]] [--only-dml]
                     [--sql-type [SQL_TYPE [SQL_TYPE ...]]] [-K] [-B]
                     [--back-interval BACK_INTERVAL]

Parse MySQL binlog to SQL you want

optional arguments:
  --stop-never          Continuously parse binlog. default: stop at the latest
                        event when you start.
  --help                help information
  -K, --no-primary-key  Generate insert sql without primary key if exists
  -B, --flashback       Flashback data to start_position of start_file
  --back-interval BACK_INTERVAL
                        Sleep time between chunks of 1000 rollback sql. set it
                        to 0 if do not need sleep

connect setting:
  -h HOST, --host HOST  Host the MySQL database server located
  -u USER, --user USER  MySQL Username to log in as
  -p [PASSWORD [PASSWORD ...]], --password [PASSWORD [PASSWORD ...]]
                        MySQL Password to use
  -P PORT, --port PORT  MySQL port to use

interval filter:
  --start-file START_FILE
                        Start binlog file to be parsed
  --start-position START_POS, --start-pos START_POS
                        Start position of the --start-file
  --stop-file END_FILE, --end-file END_FILE
                        Stop binlog file to be parsed. default: '--start-file'
  --stop-position END_POS, --end-pos END_POS
                        Stop position. default: latest position of '--stop-
                        file'
  --start-datetime START_TIME
                        Start time. format %Y-%m-%d %H:%M:%S
  --stop-datetime STOP_TIME
                        Stop Time. format %Y-%m-%d %H:%M:%S;

schema filter:
  -d [DATABASES [DATABASES ...]], --databases [DATABASES [DATABASES ...]]
                        dbs you want to process
  -t [TABLES [TABLES ...]], --tables [TABLES [TABLES ...]]
                        tables you want to process

type filter:
  --only-dml            only print dml, ignore ddl
  --sql-type [SQL_TYPE [SQL_TYPE ...]]
                        Sql type you want to process, support INSERT, UPDATE,
                        DELETE.

至此安装完毕

 

但是这时可能 yum 有问题,会出现如下提示:

[root@test2 soft]# yum install openssh
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.18 (default, Apr 23 2020, 01:24:55) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)]

If you cannot solve this problem yourself, please go to 
the yum faq at:
  http://yum.baseurl.org/wiki/Faq

如果有此提示,则可能是因为有 2 个 python 版本的导致,处理如下:

1.查看 yum 的文件
[root@test2 soft]# whereis yum
yum: /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8.gz

2.编辑 /usr/bin/yum
将第一行的 #!/usr/bin/python 修改为 #!/usr/bin/python2.6,然后保存退出即可

如果用的 python 2.6 ,则在执行 binlog2sql 名的时候就会出现如下错误。

# binlog2sql参数
[root@dba_test_002 binlog2sql]# /usr/bin/python /soft/binlog2sql/binlog2sql/binlog2sql.py --help
  File "/opt/binlog2sql/binlog2sql/binlog2sql.py", line 73
    with temp_open(tmp_file, "w") as f_tmp, self.connection as cursor:
                                          ^
SyntaxError: invalid syntax
[root@dba_test_002 binlog2sql]# 

# 出现上述提示,请更换python版本即可,不要使用python2.6版本

 

使用

使用前必须设置的参数及权限

MySQL server必须设置以下参数:
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

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内容的权限


限制(对比mysqlbinlog)
mysql server必须开启,离线模式下不能解析
参数 binlog_row_image 必须为FULL,暂不支持MINIMAL
解析速度不如mysqlbinlog

优点(对比mysqlbinlog)
纯Python开发,安装与使用都很简单
自带flashback、no-primary-key解析模式,无需再装补丁
flashback模式下,更适合闪回实战
解析为标准SQL,方便理解、筛选
代码容易改造,可以支持更多个性化解析

更详细的介绍可参考源码地址

建立表,如下:


mysql> show create table t;
+-------+----------------------------------------------------------------------------------------+
| Table | Create Table                                                                           |
+-------+----------------------------------------------------------------------------------------+
| t     | CREATE TABLE `t` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+----------------------------------------------------------------------------------------+


mysql> select * from t;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

模拟误删除操作

mysql> delete from t;
Query OK, 4 rows affected (0.01 sec)

查看当前日志并解析

mysql> show master status;
+------------+----------+--------------+------------------+-------------------------------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------+----------+--------------+------------------+-------------------------------------------+
| bin.000006 |     1379 |              |                  | ea27a55f-84b9-11ea-8c48-000c29dbfcd1:1-13 |
+------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)


mysql> mysql> show binlog events in 'bin.000006';
+------------+------+----------------+------------+-------------+--------------------------------------------------------------------+
| Log_name   | Pos  | Event_type     | Server_id  | End_log_pos | Info                                                               |
+------------+------+----------------+------------+-------------+--------------------------------------------------------------------+
| bin.000006 |    4 | Format_desc    | 1921686526 |         123 | Server ver: 5.7.26-log, Binlog ver: 4                              |
| bin.000006 |  123 | Previous_gtids | 1921686526 |         194 | ea27a55f-84b9-11ea-8c48-000c29dbfcd1:1-9                           |
| bin.000006 |  194 | Gtid           | 1921686526 |         259 | SET @@SESSION.GTID_NEXT= 'ea27a55f-84b9-11ea-8c48-000c29dbfcd1:10' |
| bin.000006 |  259 | Query          | 1921686526 |         329 | BEGIN                                                              |
| bin.000006 |  329 | Rows_query     | 1921686526 |         376 | # insert into t values(2)                                          |
| bin.000006 |  376 | Table_map      | 1921686526 |         418 | table_id: 108 (ty.t)                                               |
| bin.000006 |  418 | Write_rows     | 1921686526 |         458 | table_id: 108 flags: STMT_END_F                                    |
| bin.000006 |  458 | Xid            | 1921686526 |         489 | COMMIT /* xid=11 */                                                |
| bin.000006 |  489 | Gtid           | 1921686526 |         554 | SET @@SESSION.GTID_NEXT= 'ea27a55f-84b9-11ea-8c48-000c29dbfcd1:11' |
| bin.000006 |  554 | Query          | 1921686526 |         624 | BEGIN                                                              |
| bin.000006 |  624 | Rows_query     | 1921686526 |         671 | # insert into t values(3)                                          |
| bin.000006 |  671 | Table_map      | 1921686526 |         713 | table_id: 108 (ty.t)                                               |
| bin.000006 |  713 | Write_rows     | 1921686526 |         753 | table_id: 108 flags: STMT_END_F                                    |
| bin.000006 |  753 | Xid            | 1921686526 |         784 | COMMIT /* xid=15 */                                                |
| bin.000006 |  784 | Gtid           | 1921686526 |         849 | SET @@SESSION.GTID_NEXT= 'ea27a55f-84b9-11ea-8c48-000c29dbfcd1:12' |
| bin.000006 |  849 | Query          | 1921686526 |         919 | BEGIN                                                              |
| bin.000006 |  919 | Rows_query     | 1921686526 |         966 | # insert into t values(4)                                          |
| bin.000006 |  966 | Table_map      | 1921686526 |        1008 | table_id: 108 (ty.t)                                               |
| bin.000006 | 1008 | Write_rows     | 1921686526 |        1048 | table_id: 108 flags: STMT_END_F                                    |
| bin.000006 | 1048 | Xid            | 1921686526 |        1079 | COMMIT /* xid=16 */                                                |
| bin.000006 | 1079 | Gtid           | 1921686526 |        1144 | SET @@SESSION.GTID_NEXT= 'ea27a55f-84b9-11ea-8c48-000c29dbfcd1:13' |
| bin.000006 | 1144 | Query          | 1921686526 |        1214 | BEGIN                                                              |
| bin.000006 | 1214 | Rows_query     | 1921686526 |        1251 | # delete from t                                                    |
| bin.000006 | 1251 | Table_map      | 1921686526 |        1293 | table_id: 108 (ty.t)                                               |
| bin.000006 | 1293 | Delete_rows    | 1921686526 |        1348 | table_id: 108 flags: STMT_END_F                                    |
| bin.000006 | 1348 | Xid            | 1921686526 |        1379 | COMMIT /* xid=20 */                                                |
+------------+------+----------------+------------+-------------+--------------------------------------------------------------------+


直接用 mysqlbinlog 查看
mysqlbinlog --base64-output=DECODE-ROWS -vv bin.000006

# at 1144
#200423  3:58:52 server id 1921686526  end_log_pos 1214 CRC32 0x2864bad1 	Query	thread_id=2	exec_time=0	error_code=0
SET TIMESTAMP=1587585532/*!*/;
BEGIN
/*!*/;
# at 1214
#200423  3:58:52 server id 1921686526  end_log_pos 1251 CRC32 0x70480eb2 	Rows_query
# delete from t
# at 1251
#200423  3:58:52 server id 1921686526  end_log_pos 1293 CRC32 0xf7c3b49a 	Table_map: `ty`.`t` mapped to number 108
# at 1293
#200423  3:58:52 server id 1921686526  end_log_pos 1348 CRC32 0x33eeabf3 	Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `ty`.`t`
### WHERE
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
### DELETE FROM `ty`.`t`
### WHERE
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
### DELETE FROM `ty`.`t`
### WHERE
###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
### DELETE FROM `ty`.`t`
### WHERE
###   @1=4 /* INT meta=0 nullable=1 is_null=0 */
# at 1348
#200423  3:58:52 server id 1921686526  end_log_pos 1379 CRC32 0xcfaf7edc 	Xid = 20
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;




可以看到删除语句的点位是在 1144 ~ 1379

利用 binlog2sql 解析出误操作 sql

[root@test2 ~]# binlog2sql -h192.168.65.2 -P3306 -uroot -p123  -dty -tt --start-file='bin.000006' --start-position=1144 --stop-position=1379
DELETE FROM `ty`.`t` WHERE `id`=1 LIMIT 1; #start 1144 end 1348 time 2020-04-23 03:58:52
DELETE FROM `ty`.`t` WHERE `id`=2 LIMIT 1; #start 1144 end 1348 time 2020-04-23 03:58:52
DELETE FROM `ty`.`t` WHERE `id`=3 LIMIT 1; #start 1144 end 1348 time 2020-04-23 03:58:52
DELETE FROM `ty`.`t` WHERE `id`=4 LIMIT 1; #start 1144 end 1348 time 2020-04-23 03:58:52

这里得到的就是删除数据的语句

解析出恢复语句(-B 参数)

[root@test2 ~]# binlog2sql -h192.168.65.2 -P3306 -uroot -p123  -dty -tt --start-file='bin.000006' --start-position=1144 --stop-position=1379 -B
INSERT INTO `ty`.`t`(`id`) VALUES (4); #start 1144 end 1348 time 2020-04-23 03:58:52
INSERT INTO `ty`.`t`(`id`) VALUES (3); #start 1144 end 1348 time 2020-04-23 03:58:52
INSERT INTO `ty`.`t`(`id`) VALUES (2); #start 1144 end 1348 time 2020-04-23 03:58:52
INSERT INTO `ty`.`t`(`id`) VALUES (1); #start 1144 end 1348 time 2020-04-23 03:58:52

可直接输出道文件,然后在 mysql 执行即可。

也可以根据时间点来,例句:

binlog2sql -h127.0.0.1 -P3306 -uroot -p123  -dty -tt --start-file='bin.000006' --start-datetime='2020-05-23 15:35:59' --stop-datetime='2020-05-23 16:09:59'  -B

其他参数可参考帮助文档

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: binlog2sql是一种工具,用于将MySQLbinlog日志文件转换为可读的SQL语句,以便进行离线分析和查看。binlogMySQL数据库中的事务日志,记录了数据库中发生的所有数据变更操作。binlog2sql可以将这些变更操作还原成SQL语句,方便用户了解数据库的历史变更情况。 离线指的是在数据库不处于活动状态下进行操作,即在数据库停止或者不可用的情况下使用binlog2sql工具进行分析。这种方式可以避免对数据库正常运行造成影响,并且可以随时进行回溯和查询。 使用binlog2sql离线可以实现一些重要的功能。首先,可以恢复误删数据。当我们误删了一些重要的数据时,通过binlog2sql工具可以还原出删除数据的SQL语句,然后再执行这些SQL语句,就能够将数据恢复回来。其次,可以查看历史变更记录。通过解析binlog日志文件,可以得到所有数据的变更操作,包括插入、更新和删除等操作的SQL语句,方便我们了解数据库的演进和变化。最后,可以进行数据库迁移和同步。通过解析源数据库binlog日志文件,可以生成对应的SQL语句,然后将这些SQL语句执行在目标数据库上,从而实现数据库的迁移和同步。 总之,binlog2sql离线是一种方便的工具,可以帮助我们对数据库进行离线分析和查看。无论是恢复误删的数据、查看历史变更记录还是进行数据库迁移和同步,binlog2sql都可以帮助我们完成这些任务。 ### 回答2: binlog2sql 离线的意思是指在没有网络连接的情况下使用 binlog2sql 工具进行操作。 binlog2sql 是一个用于将 MySQL 数据库binlog 转化为 SQL 语句的工具,可以用于实时同步 MySQL 数据库的变更或者回放数据库的历史操作。一般情况下,binlog2sql 工具是在线工作的,即在数据库正常运行时实时监听 binlog,并将其转化为 SQL 语句。 然而,当没有网络连接时,我们仍然可以使用 binlog2sql 工具。这种情况下,我们需要手动将 MySQL 数据库binlog 文件复制到离线的环境中,并使用 binlog2sql 工具对这些离线的 binlog 文件进行解析和分析。这样,我们就可以获得离线环境下的 SQL 语句,用于还原数据库的操作历史。 离线使用 binlog2sql 的一个常见应用场景是进行数据库备份和恢复。我们可以将线上数据库binlog 文件复制到离线环境,使用 binlog2sql 工具解析生成对应的 SQL 语句,并创建一个新的数据库来还原原始数据库的状态。这对于故障恢复、数据迁移以及数据库版本升级等场景都非常有用。 总结起来,binlog2sql 离线的含义是指在没有网络连接的情况下,手动复制和解析 MySQL 数据库binlog 文件,使用 binlog2sql 工具生成 SQL 语句,从而进行数据库的备份、还原和迁移等操作。 ### 回答3: binlog2sql是一个用于将MySQL二进制日志(binlog)转换为SQL语句的工具。它可以在离线环境中使用,意味着可以在没有网络连接的情况下进行转换操作。 通过binlog2sql,我们可以将MySQL的二进制日志文件转换成可以被理解和查询的SQL语句文件。这对于分析数据库操作记录、恢复数据等任务非常有用。通常情况下,binlog文件是MySQL服务器在执行每个事务时记录的二进制日志文件,它包含了对数据库的所有更改操作。而binlog2sql可以将这些操作转化为SQL语句,以便我们进行进一步的分析和处理。 在离线环境中使用binlog2sql有几个好处。首先,离线环境意味着我们不需要与网络连接,可以在没有外部干扰的情况下进行转换工作。这可以提高转换的速度和准确性。其次,离线环境还可以提供更高的安全性,因为我们不需要将敏感的数据库信息传输到网络上。最后,离线环境也可以方便我们在本地进行数据恢复和分析工作。 总之,binlog2sql是一个功能强大的工具,它可以在离线环境中使用,将MySQL的二进制日志转换为SQL语句,方便我们进行数据分析和恢复工作。它的离线特性使得我们可以在没有网络连接的环境下进行转换操作,提高了效率和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ty_FFTQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值