通过 mysqlbinlog 和 grep 命令定位binlog文件中指定操作
1.binlog日志基本知识
MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间。
binlog有三种格式:Statement、Row以及Mixed。分别是:基于SQL语句的复制(statement-based replication,SBR)、 基于行的复制(row-based replication,RBR)和混合模式复制(mixed-based replication,MBR)。
| 格式 | 说明 | 优点 | 缺点 |
| Statement模式 | 每一条会修改数据的sql语句都会记录到binlog中。 | 不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。 | 缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数,last_insert_id(),以及user-defined functions(udf)等会出现问题)。 |
| Row模式 |
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。 而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。 新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么会记录所有行的变更。 |
任何情况都可以被复制,这对复制来说是最安全可靠的。多数情况下,从服务器上的表如果有主键的话,复制就会快了很多。 |
binlog 大了很多 复杂的回滚时 binlog 中会包含大量的数据 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,这会导致频繁发生 binlog 的并发写问题 UDF 产生的大 BLOB 值会导致复制变慢 无法从 binlog 中看到都复制了写什么语句 |
| MIXED模式 | 实际上就是前两种模式的结合,在mixed模式下,mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在statement和row之间选一种。 | 在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。 | |
2.查看Row模式和Statement模式的binlog
为了加深印象,下面我们看看两者模式下的binlog到底长什么样子。
2.1 测试案例
分别在Row模式 和 Statement模式 下执行以下语句。
创建一张表
CREATE TABLE IF NOT EXISTS `tt` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`sex` enum('m','w') NOT NULL DEFAULT 'm',
`age` tinyint(3) unsigned NOT NULL,
`classid` char(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
向表中insert 5笔数据
insert into zyyshop.tt(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6');
用一条SQL语句修改前两笔数据
update tt set name ='XXX' where id in (1,2);
在Row模式下形成的binlog文件为:mysql3306_bin.000011
在Statement模式下生成的binlog文件为:mysql3306_bin.000012。
2.2 用 show binlog events in 命令去查看分析2各个文件
查询Row模式记录如下:

查询Statement模式记录如下:

通过这个命令查看log,两者差距不大。
官网知识:https://dev.mysql.com/doc/refman/8.0/en/show-binlog-events.html
2.3 通过mysqlbinlog命令解析
执行的命令分别如下
指定路径/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin.
指定路径/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin.
我们可以看到Row模式下的binlog记录丰富的多,例如针对update的那条语句。
Row模式记录如下:

Statement模式记录如下:

总结:通过 show binlog events in 命令,查看 Row模式下记录 和 Statement模式下的记录,两者基本一致。通过 mysqlbinlog 可以查看binlog具体的信息。Row模式下的binlog记录比 Statement模式下丰富的多。
3. 通过 mysqlbinlog 和 grep 命令定位binlog文件中指定操作
既然binlog文件中有详细的操作信息,如果有人误操作,我们是否可以快速定位到对应操作信息呢?
快速定位可以帮助我们找到当时具体的操作是什么,也可以找到POS(position)点,方便精准恢复。
例如,书接上回,我们发现表 tt 不在了,被人删除了。ERROR 1146 (42S02): Table 'TestBinlog2.tt' doesn't exist。
那么我们就可以在binlog查找drop相关的操作,命令如下:
指定路径/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin. | grep drop
可惜没有数据,这是什么情况呢?不应该啊!!!
会不会大小写的问题?那么命令修改如下:
指定路径/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin. | grep -i drop

找到了,但是信息不是很完整,我们可不可以找到,这条命令的更信息信息呢?例如,drop 前后各10条数据。
指定路径/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin. | grep -i -A -B drop

这正是我们想要的,完美!
4. 其它知识补充
4.1 mysqlbinlog工具
此处主要讲解用于查看binglog日志的部分参数,用于还原binlog的参数在此不细讲。
| mysqlbinlog工具参数说明【用于查看的部分】 | |
| 参数 | 说明 |
| -base64-output |
inlog输出语句的base64解码 分为三类: |
| --verbose | 重新构建伪SQL语句的行信息输出, -v会增加列类型的注释信息。 |
| --database=name | 列出数据库的名称(仅限binlog文件存储在本地) |
4.2 grep 命令
grep是一个强大的文本搜索工具命令,用于查找文件中符合指定格式的字符串,支持正则表达式。
| grep命令常用参数说明 | |
| 参数 | 说明 |
| -A | 除了显示符合条件的那一行之外,并显示该列之后的指定行的内容内容。 |
| -B | 除了显示符合条件的那一行之外,并显示该列之前的指定行的内容内容。 |
| -c | 计算符合结果的行数。 |
| -i | 忽略字符大小写 |
| -v | 反向查找 |
| -e | 按指定字符串查找 |
| -E | 按指定字符串指定的正则查找 |
| -n | 在显示符合条件的那一行前,标识出该行的行数标号。 |
通过 mysqlbinlog 和 grep 命令定位binlog文件中指定操作的更多相关文章
- Linux 如何用命令查看binlog文件的创建时间
目录 背景 分析 方法 注意 背景 MySQL在26日 16:23:49产生了大量的慢查询,在这段时间内,binlog文件刷新的很快(查看慢日志是mysql DML并发比较多),想知道写完一个binl ...
- 【Linux】命令写在文件中并调用awk -f
我们在使用awk命令的时候,有时候命令特别长,在终端写出来格式太乱,难以阅读,以下是一个将命令写在文件中,并使用awk调用的具体案例 1.现在有文件file3.txt,内容如下: 2.ak2.awk脚 ...
- Java查找指定文件中指定字符的个数
package lwl.youweb2.test; import java.io.BufferedReader; import java.io.FileReader; import java.io.I ...
- Linux中利用grep命令如何检索文件内容详解
前言 Linux系统中搜索.查找文件中的内容,一般最常用的是grep命令,另外还有egrep命令,同时vi命令也支持文件内容检索.下面来一起看看Linux利用grep命令检索文件内容的详细介绍. 方法 ...
- Linux下执行的java命令重定向到文件中的方法
在Linux下通常会执行如:java -version 的命令, 但是,命令只是打印到了屏幕上不能重定向到文件中或标准输出流中. 此时需要将错误输出流重定向到标准输出流中就可以得到了. 比如:java ...
- grep和sed替换文件中的字符串
sed -i s/"str1"/"str2"/g `grep "str1" -rl --include="*.[ch]" ...
- grep和sed替换文件中的字符串【转】
sed -i s/"str1"/"str2"/g `grep "str1" -rl --include="*.[ch]" ...
- Linux中通过命令直接删除文件中最后一行
何谓Sed(Stream EDitor):Sed原为UNIX系统上的非交谈式文字编辑器(non-interactive stream editor).当Sed读入待编辑文件,会依编辑命令来进行文件的编 ...
- linux命令-查找所有文件中包含某个字符串
查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xar ...
随机推荐
- socket和webService的区别
网络七层协议为:物理层.数据链路层.网络层.传输层.会话层.表示层.应用层 socket 只是 java在网络层定义的类,用来实现网络层.上面的各层需要我们自己在程序里实现. 例如端口可以自己定义 . ...
- capwap学习笔记——初识capwap(三)(转)
2.5.6 CAPWAP状态机详解 2.5.6.1 Start to Idle 这个状态变迁发生在设备初始化完成. ¢ WTP: 开启CAPWAP状态机. ¢ AC: 开启CAPWAP状态机. ...
- Java如何获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
1 下载安装sigar-1.6.4.zip 使用java自带的包获取系统数据,容易找不到包,尤其是内存信息不够准确,所以选择使用sigar获取系统信息. 下载地址:http://sourceforge ...
- .Net Core微服务系列--理论篇
微服务的由来 微服务最早由Martin Fowler与James Lewis于2014年共同提出来的,但是微服务也不是一个全新的概念,它是由一系列在实践中获得成功并流行起来的概念中总结出来的一种模式, ...
- Python实现猜数字游戏1.0版
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=702 """ 功能: 随机生成一个数字,最多有3次猜测机会,如果第一次没有猜对,则从第 ...
- Day3 《机器学习》第三章学习笔记
这一章也是本书基本理论的一章,我对这章后面有些公式看的比较模糊,这一会章涉及线性代数和概率论基础知识,讲了几种经典的线性模型,回归,分类(二分类和多分类)任务. 3.1 基本形式 给定由d个属性描述的 ...
- 基于E-R模型的关系型数据库设计方法
摘要 在管理信息系统开发中,数据库设计的目标是建立DBMS能识别的关系数据模型.而关系数据模型建立的基础是首先建立E-R模型,通过E-R模型才能转换为关系数据模型.如何建立E-R模型以及如何将E-R模 ...
- js文件引用的问题顺带复习css引用
js文件包含在<script>块中用scr引用,css在link和@import来引用,css不是本篇的重点,直接引用一个博主的总结: “ 区别1:link是XHTML标签,除了加载CSS ...
- nodejs中处理回调函数的异常
如果是使用nodejs+express3这个经典的组合,那么有一种很方面的处理回调函数异常的方法: 1. 安装模块:express-domain-middleware 2. 加入如下的代码: app. ...
- CSS布局-圣杯布局
圣杯布局 圣杯布局很完美(兼容所有浏览器,包括IE6),但是使用了相对定位,布局有局限性,宽度控制要改的地方也多. 第一种方法公用部分: .lgyz, .lzrg, .lrzcg, .lcgrz, . ...