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等修改数据的语句,那么会记录所有行的变更。任何情况都可以被复制,这对复制来说是最安全可靠的。多数情况下,从服务器上的表如果有主键的话,复制就会快了很多。

复制以下几种语句时的行锁更少:(1)INSERT ... SELECT;(2)包含 AUTO_INCREMENT 字段的 INSERT;(3)没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句

执行INSERT,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 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,两者差距不大。

2.3 通过mysqlbinlog命令解析

执行的命令分别如下指定路径/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin.000011指定路径/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin.000012

我们可以看到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.000012 | grep drop

可惜没有数据,这是什么情况呢?不应该啊!!!

会不会大小写的问题?那么命令修改如下:指定路径/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v 指定路径/mysql_log/mysql3306_bin.000012 | grep -i drop

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

这正是我们想要的,完美!

4. 其它知识补充

4.1 mysqlbinlog工具

此处主要讲解用于查看binglog日志的部分参数,用于还原binlog的参数在此不细讲。mysqlbinlog工具参数说明【用于查看的部分】

参数说明

-base64-outputinlog输出语句的base64解码 分为三类:

默认是值auto ,仅打印base64编码的需要的信息,如row-based 事件和事件的描述信息。

never 仅适用于不是row-based的事件

decode-rows 配合--verbose选项一起使用解码行事件到带注释的伪SQL语句

--verbose重新构建伪SQL语句的行信息输出, -v会增加列类型的注释信息。

--database=name列出数据库的名称(仅限binlog文件存储在本地)

4.2 grep 命令

grep是一个强大的文本搜索工具命令,用于查找文件中符合指定格式的字符串,支持正则表达式。grep命令常用参数说明

参数说明

-A除了显示符合条件的那一行之外,并显示该列之后的指定行的内容内容。

-B除了显示符合条件的那一行之外,并显示该列之前的指定行的内容内容。

-c计算符合结果的行数。

-i忽略字符大小写

-v反向查找

-e按指定字符串查找

-E按指定字符串指定的正则查找

-n在显示符合条件的那一行前,标识出该行的行数标号。

mysql binlog grep_通过mysqlbinlog和grep命令定位binlog文件中指定操作相关推荐

  1. mysql cmd grep_通过 mysqlbinlog 和 grep 命令定位binlog文件中指定操作

    1.binlog日志基本知识 MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗 ...

  2. python虚拟环境virtualenvwrapper workon命令在sh文件中无法生效的解决方法

    问题: workon在终端可以运行,可以看见找到了相关的虚拟环境 但是将workon命令写入sh文件后,如下图示,运行sh文件会提示workon: command not found 如何解决该问题: ...

  3. Linux中利用grep命令如何检索文件内容详解

    前言 Linux系统中搜索.查找文件中的内容,一般最常用的是grep命令,另外还有egrep命令,同时vi命令也支持文件内容检索.下面来一起看看Linux利用grep命令检索文件内容的详细介绍. 方法 ...

  4. mysql存储登录密码_当密码存储在选项文件中时,MySQL拒绝登录尝试

    第一: >我们正在运行MySQL 5.7.13. >操作系统是Red Hat Enterprise Linux 7.2. >首先使用Python / Connector 2.1.3发 ...

  5. 使用jar命令替换jar包中指定文件

    一.jar命令用法 -c 创建新的归档文件-t 列出归档目录和文件-x 解压缩已归档的指定(或所有)文件-u 更新现有的归档文件-v 在标准输出中生成详细输出 / 提供更详细输出信息-f 指定归档文件 ...

  6. Linux中通过命令直接删除文件中最后一行

    何谓Sed(Stream EDitor): Sed原为UNIX系统上的非交谈式文字编辑器(non-interactive stream editor).当Sed读入待编辑文件,会依编辑命令来进行文件的 ...

  7. 一行命令从 APK 文件中提取 Endpoint 及 URL

    做IoT的人免不了要接触Android,接触Android的人又免不了要研究别人的App应用. Diggy,一款能够从 apk 文件中提取 endpoint 及 URL 的工具,只要一行命令就可以帮大 ...

  8. Linux使用sed命令删除文件中指定内容

    因为日志文件太大,希望删除过早的一部分日志,虽然可以用vi或vim打开后删除,但是因为文件很大,打开就很耗时. 因此打算使用sed命令,在不打开文件的情况下删除,但是删除后需要把内容存入一个新文件中, ...

  9. linux命令解压文件到指定目录并覆盖,你不知道的Linux解压命令

    在桌面Linux发行版中解压.压缩都非常方便,直接右键文件就可以了, 但在服务器版的Linux中一般是没有桌面环境的,这时候就要用到命令了.下面我就介绍下等12种格式的压缩文件的压缩和解压的命令.本次 ...

最新文章

  1. 2个月精通Python爬虫——3大爬虫框架+6场实战+分布式爬虫,包教包会
  2. jQuery 遍历函数
  3. leetcode1007. 行相等的最少多米诺旋转(贪心)
  4. 颜宁:批评一下当年的「颜宁同学」
  5. 怎样高速读懂别人的项目
  6. nginx config的多个config配置
  7. 深入浅出 Python Descriptors / Properties
  8. distribute-list分发列表 转自 红茶三杯sina blog
  9. 决策树cart算法详解
  10. 褚霸:不要为了开源而开源
  11. 电脑连接手机热点频繁掉线问题
  12. 机动车号牌查询, 在线查询, api 查询
  13. 高通平台安卓手机开机
  14. centos7.6安装博通无线网卡驱动
  15. Codeforces Round #548 (Div. 2)C. Edgy Trees 并查集
  16. 2012年5月编程语言排行榜:C再次位居第一 Java 占有率持续下降
  17. 完全用Python工作
  18. [综述] 细粒度图像分析2019
  19. 职业经理人管理素养提升课程
  20. 东邪、西毒、南帝、北丐

热门文章

  1. 5 款程序员必备的 Chrome 插件!
  2. 每日一技:给女友用代码做一个3D旋转相册,每天亿遍忘记初恋~
  3. Sphinx武林秘籍(中)
  4. 这是什么在线客服系统?
  5. 【Zotero】与坚果云配合使用同步失败解决方法
  6. 什么是e人,MBTI中的E型人格是怎么样的
  7. 【数据清洗】数据清洗流程及经验
  8. PS和AI结合制作人物矢量图
  9. ionic 应用在iOS上打开相机拍照闪退、百度地图/高德地图定位失败(解决方案)
  10. java吸血鬼数字_[求助]吸血鬼数字