本文主要介绍的binlog 4的格式,下面使用的均是binlog4的情况, 然后使用python解析该格式与mysqlbinlog做对比.解析binlog的工具有: mysqlbinlog, binlog2sql binlog文件 由开头的 4字节(0xFE 'bin’) 加上一些列的 event 组成. event结构FORMAT_DESCRIPTION_EVENT每个Binlog文件的第一个event, 这个event记录如下数据名字大小(字节)描述binlog_versionint<2>记录binlog 后数据为(2,'ddcw update')然后使用mysqlbinlog 解析对比一下, 发现对的上, 说明没有解析错图片总结1. binlog文件由开头固定4字节和 各个event组成 (relay 比如TABLE_MAP_EVENT = 8 (table_id:6 + flag:2) #记录其它event的post header的长度return {'binlog_version':binlog_version
log-bin-index指定的是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录,不用进行更改,默认即可。 : 在线配置: 配置文件:expire_logs_days = 7 relay-log|relay-log-index relay-log在从上指定从主那里同步过来的binlog文件存放位置。 查询: 在线配置: 配置文件:max_relay_log_size = 512M binlog-ignore-db|replicate-ignore-db binlog-ignore-db无需开启二进制日志文件的数据库 max_binlog_size 超过这个数值,将会把日志写到一个新的文件中。 查询: 在线配置: 配置文件:max_binlog_size = 512M max_binlog_cache_size 表示的是binlog 能够使用的最大cache 内存大小,默认是1M。
如题: 需要本地安装mysqlbinlog 命令 mysql-bin.000046 binlog 文件 lzerp 数据库名称 /home/46.sql 导出sql 文件的目录 mysqlbinlog
SHOW BINLOG EVENTS mysql> use testxxx; Reading table information for completion of table and column names select * from test; +------+----------+ | id | name | +------+----------+ | 1 | hello1 | | 2 | hello2 | | 3 | hello3 | | 4 | hello4 | | 5 | hello5 | ... ... | 97 | hello97 | | 99 | hello99 | | 100 | hello100 | +------+----------+ 99 rows in set (0.01 sec) mysql> SHOW BINLOG ReceivedAt, InfoUnitID, SysLogTag) values (' Accepted password for root from 192.168.100.1 port 51286 ssh2'
这是学习笔记的第 1895 篇文章 今天看了下binlog2sql的代码,总体来说是代码质量是很高的。 通过阅读好的开源项目,也能够让自己多沉淀些学习经验。 binlog2sql的工程主要包含两个Python文件,一个是binlog2sql.py,这个文件是对外统一使用的脚本入口,另外一个是工具类binlog2sql_util.py ? 这部分逻辑是相对通用的,而不是只局限于使用binlog2sql 通读源代码后,发现有一个潜在的瓶颈点就是在处理binlog的时候,使用了开源项目python-my-replication来模拟从库 ? ,格式是相对比较规范的,但是这种方式的一个明显问题就是性能,如果文件在50M以内,解析效果还能接受,如果binlog超过了200M,解析性能就很差了,如果是1G的规模,基本上就没有反应了。 所以明确了binlog2sql的代码逻辑后,我们需要做的一些改进就可以主要在BinLogStreamReader的方案思路上进行改进。 ?
大数据那边有个需求,希望能知道上游的MySQL的binlog文件的文件名和开始时间,用于偶尔出现的cdc的修数据用(PS:如果CDC时候用了GTID的模式话就不需要用到这里的方法了)。 简单写个脚本,如下: user='dts' passwd='123456' host='192.168.31.181' mysql -u${user} -p${passwd} -h ${host} 2> /dev/null -BNe 'show master logs;' > binlog_list_tmp cat binlog_list_tmp | awk '{print $1}' > binlog_list read-from-remote-server ${line} -vv --base64-output=decode-rows --start-position=4 --stop-position=123 2> /dev/null | egrep 'Start: binlog' | awk '{print $1 " " $2}' done < binlog_list 注意上面的--stop-position的值随便填个就行
使用专业的binlog监听工具例如,使用Canal或Oscar等工具,这些工具通常提供了丰富的功能,如过滤特定的事件、保存到文件或数据库等。 监听,但你可以通过轮询的方式检查 binlog 文件的变化。 -- 使用最新的版本 --></dependency>编写代码来检查和解析 binlog 文件。 try (Connection connection = getMySQLConnection()) { // 检查 binlog 文件 if (isBinlogFileChanged (connection, binlogFilePath)) { // 处理 binlog 文件变化 } } catch (SQLException
二进制日志包括两类文件: 二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件 二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件 ---- binlog2sql:https://github.com/danfengcao/binlog2sql binlog2sql是大众点评开源的一款用于解析binlog的工具 依赖包 PyMySQL 文件是mysql-bin.000052,我们再定位误操作SQL的binlog位置。 首先我们安装binlog2sql: shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql shell (注:如果有多个sql误操作,则生成的binlog可能分布在多个文件,需解析多个文件) shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306
对于误操作数据的闪回,我们一般推荐 binlog2sql 或者MyFlash(美团点评开源的) 本篇文章, 我们介绍下 binlog2sql的用法: binlog2sql 【首级推荐使用】 官网:https ://github.com/danfengcao/binlog2sql 注意: binlog必须是row格式,并且是FULL类型的记录。 文件及位移点,然后使用下面命令解析: python /root/binlog2sql/binlog2sql/binlog2sql.py -h192.168.11.20 -P3306 -uflashback /binlog2sql/binlog2sql.py --flashback -h192.168.11.20 -P3306 -uflashback -p'admin' -d testdb -t t_stud --stop-file/--end-file 末尾解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。
若操作本身并没有导致数据库发生变化,那么该操作不会被写入binlog。binlog日志文件的主要作用:可以完成主从复制。 # log_bin_basename:binlog日志的基本文件名,最终生成的binlog文件会追加标识来表示每一个文件# log_bin_index:指定的是binlog文件的索引文件,这个文件管理了所有的 binlog文件的目录 。 (2)将binlog的格式设置为STATEMENT,即:每条改变数据的语句都被记录到binlog中。 -11ec-9a32-000c298c28d2:1-1763841 row in set (0.00 sec)(4)创建测试表,并插入测试数据。
如果是实时备份或者需要分析Binlog的时候 咋办呢? PYTHON模拟binlog文件损坏 我们只需要修改event_header的某些值, 那么这个binlog文件就会被认为已经损坏了. 关于binlog的结构, 可以看我之前写的 BINLOG文件解析 这里就不再介绍了 老规矩, 本文提供的脚本在文末 拷贝一个Binlog过来 本文是模拟环境, 所以不要去修改真实环境, 就拷贝一个文件意思意思 图片 执行脚本,破坏Binlog 本次只修改event_type即可, 因为多数报错都是报这个错 import binlog_tool aa = binlog_tool.listevent('m3308.001014 ') #参数为binlog文件路径 aa[14] #查看第14个event信息 binlog_tool.mevent_type('m3308.001014',1676,66) #binlog文件名 不过本次有问题的event是gtid, 所以不会丢数据 2. sync_binlog设置为1很重要. 起码你最多就丢一个事务. 3. 会一门编程语言,对dba运维好处很大. 能解决很多问题.
Binlog分析工具-binlog_analysisshell> chmod 755 binlog_analysis用途:高峰期排查哪些表TPS比较高usage: binlog_analysis [-h > [-P <port>] -u <user> -p <password> -d <database> [-c <charset>] -s <start_index> [-e <end_index>]Binlog (default: utf8) -s <start_index>, --start <start_index> the start index of binlog files, e.g. mysql-bin.000001 -e <end_index>, --end <end_index> the end index of binlog /binlog_analysis -H 192.168.188.197 -u admin -p '123456' -d test -s mysql-bin.049622 -e mysql-bin.049628
当然还有其他的一些操作方法,binlog2sql使用。 用途 数据回滚 主从切换后数据不一致的修复 从 binlog 生成标准 SQL,带来的衍生功能 闪回原理简析 开始之前,先说说闪回。 binlog 有三种可选的格式: statement:基于 SQL 语句的模式,binlog 数据量小,但是某些语句和函数在复制过程可能导致数据不一致甚至出错; mixed:混合模式,根据语句来选用是 安全,但 binlog 会比其他两种模式大很多; 利用 binlog 做闪回,需要将 binlog 格式设置为 row,因为我们需要最详尽的信息来确定操作之后数据不会出错。 既然 binlog 以 event 形式记录了所有的变更信息,那么我们把需要回滚的 event,从后往前回滚回去即可。 到使用 binlog2sql 工具来生成标准和回滚 SQL,来剖析整个运行过程。
-----------+-------+ 2.安装binlog2sql工具 3.在mysql的主服务器上,创建闪回操作账号的权限 mysql> GRANT SELECT, REPLICATION SLAVE 工具 1)解析出标准的SQL python binlog2sql.py -h192.168.1.21 -P30136 -uglon -p'123456' -d xcrm -t edai_binlog2sql :表名 –start-file: 通俗的来讲就是,要解析sql的所在的binglog文件 –flashback: 闪回,逆向解析sql语句 cat edai_binlog2sql.sql 可以看到 -tedai_binlog2sql --start-file=mysql-bin.000001 --start-position=6159262 --stop-pos=6159823 > edai_binlog2sql-new.sql [root@soft binlog2sql]# cat edai_binlog2sql-new.sql INSERT INTO `xcrm`.
2. Statement 每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。 其他参考信息 除以下几种情况外,在运行时可以动态改变 binlog 的格式: 1. 存储流程或者触发器中间; 2. 启用了 NDB; 3. 当 DML 语句更新一个 NDB 表时; 2. 当函数中包含 UUID() 时; 3. 2 个及以上包含 AUTO_INCREMENT 字段的表被更新时; 4. 视图中必须要求运用 row 时,例如建立视图时使用了 UUID() 函数; 在配置文件my.ini设定主从复制模式: log-bin=mysql-bin #binlog_format=STATEMENT 优点 历史悠久,技术成熟; 产生的 binlog 文件较小; binlog 中包含了所有数据库修改信息,可以据此来审核数据库的安全等情况; binlog 可以用于实时的还原,而不仅仅用于复制;
binlog2sql-master.zipcd binlog2sql-masterpip install -r requirements.txt #这里面的pymysql版本是0.7cd binlog2sqlpython pyinstaller打包(主要是自己熟悉一点), 也可以使用其它打包工具执行如下命令打包pyinstaller -F binlog2sql.py打包好的二进制文件在 dist目录下面使用打包好的二进制文件测试下报错了 No module named 'binlog2sql_util'图片说没得binlog2sql_util模块, 我们修改下binlog2sql.py文件的第9行如下from binlog2sql.binlog2sql_util 但用的人还是不少的.使用pyinstaller打包之前在 binlog2sql.py中修改下包的路径即可 from binlog2sql_util ==> from binlog2sql.binlog2sql_util 如果你经常使用pyinstaller还会遇到一些其它问题, 比如文件太长, 解决办法: 在xxx.spec添加sys.setrecursionlimit(5000) py不建议文件内容太长,不方便阅读又比如在当前目录导入自己的包
/前滚 SQL 进行数据恢复/补偿 MyFlash:C 语言编写(需要动态编译成二级制脚本后执行),用于生成反向 binlog 文件(二进制)进行数据恢复 my2sql:Go 语言编写(可直接下载 linux 文件 -start-pos:指定 binlog 文件中开始的点位 -start-datetime:指定开始的时间 -stop-datetime:指定结束的时间 -output-dir:指定文件生成目录 开始的位置,实例中后续执行的DML事务也都会被记录 ## 另外2个文件分别是从binlog中获取到的binlog状态和事务信息,之后的案例会详细展示说明,此处略过 -- 查看生成的回滚SQL文本文件 -- 查看生成文件的内容 11:32 AM dmp1 /tmp/my2sql_test# cat binlog_status.txt binlog starttime ),作者号称能达到 50-60 倍左右,有兴趣的朋友可进行一轮性能对比测试 MyFlash 解析 binlog 的效率也比 binlog2sql 高,但生成的回滚文件仍然是二进制格式的,需要依赖 mysqlbinlog
一、binlog2sql介绍 binlog2sql是国内MySQL大佬danfengcao使用python开发,许多MySQL爱好者参与改进的一款MySQL binlog解析软件。 && cd binlog2sql shell> pip install -r requirements.txt 三、使用前提 基于最小侵入原则,我们一般在管理节点执行操作,只需把binlog2sql ]# python binlog2sql.py --help usage: binlog2sql.py [-h HOST] [-u USER] [-p [PASSWORD [PASSWORD ...]] 范围控制参数: --start-file :起始解析文件,只需文件名,无需全路径。必需参数。 市面上也有一些其他开源工具,原理都差不多,但使用效率上binlog2sql更胜一筹,通过binlog2sql可以很容易搞定: python binlog2sql.py -h ip
项目地址: https://github.com/liuhr/my2sql 参数和说明 # . /my2sql --help my2sql V2.0 -U prefer to use unique key instead of primary key to build where condition -v print version -work-type string valid options are: 2sql,rollback,stats. 2sql: convert binlog to 使用示例 1、分析本地离线binlog文件模式 1 账号 需要有查看表结构的权限 2 密码策略必须是 mysql_native_password 模式 # 提取当时的操作记录 mkdir - 指定的binlog文件模式 1 需要连接数据库的用户有SELECT, REPLICATION SLAVE, REPLICATION CLIENT权限 2 使用rollback功能时,要解析的binlog
mysql的binlog是多文件存储,定位一个LogEvent需要通过binlog filename + binlog position,进行定位。 ,MySQL调用文件系统的刷新操作刷新binlog到磁盘中。 = 'ROW'; #新会话有效,mysql重启无效 mysql> SET GLOBAL binlog_format = 'ROW'; 5、binlog的分析 binlog文件的目录在my.cnf配置文件中 (https://github.com/danfengcao/binlog2sql ),从MySQL binlog解析出你要的SQL。 master logs before '2019-03-15 09:35:00'; #删除指定日志文件的日志索引中binlog日志文件 mysql> purge master logs to 'binlog