介绍

简介

MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景:
其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。

binlog日志概念

binlog全称为:binary,翻译就是二进制文件,主要记录了MySQL在进行DML(数据操作语言)过程中的操作日志。在执行SQL语句的过程中,作为使用者,无需关注程序执行的过程,但是当数据库数据丢失,或者需要搭建数据库主从复制时,则此时的binlog日志文件的重要性就展现出来了。

二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

binlog本身是一类二进制文件。二进制文件更省空间,写入速度更快,是无法直接打开来查看的。
因此mysql提供了命令mysqlbinlog进行查看。

一般的statement格式的二进制文件,用下面命令就可以(后面会讲到什么是statement格式)

mysqlbinlog mysql-bin.000001

如果是row格式,加上-v或者-vv参数就行,如

mysqlbinlog -vv mysql-bin.000001

使用场景

以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。binlog 的主要目的是复制和恢复。

  • MySQL主从复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致的目的
  • 数据恢复:通过使用 mysqlbinlog工具来使恢复数据
  • 查看数据更改记录

数据库操作类型:

在对数据库的日常操作中,MySQL的操作语法,经常使用的几种MySQL指令类型如下

DQL:数据查询语言,例如 where 、group by 、 orderby
DML:数据操作语言,例如 insert、delete、update等
DPL:事务处理语言,例如begin transaction、commit、rollback
DCL:数据控制语言,例如grant 、revoke控制用户访问权限等
DDL:数据定义语言,例如create、drop删除表、索引添加类等

binlog三种模式

format 定义 优点 缺点
statem ent 记录的是修改SQL语句 日志文件小,节约I0,提高性能 准确性差,对一些系统函数不能准确复制或不能复制,如now0.uuid0等
row 记录的是每行实际数据的变更 准确性强,能准确复制数据的变更 日志文件大,较大的网络10和磁盘lO
mixed statement和row模式的混合 准确性强,文件大小适中 有可能发生主从不一致问题

业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。

那么,大家一定想问,为什么不推荐使用mixed模式,理由如下
假设master有两条记录,而slave只有一条记录。
master的数据为

+----+------------------------------------------------------+
| id | n |
+----+------------------------------------------------------+
| 1 | d24c2c7e-430b-11e7-bf1b-00155d016710 |
| 2 | ddd |
+----+------------------------------------------------------+

slave的数据为

+----+-------------------------------------------------------+
| id | n |
+----+-------------------------------------------------------+
| 1 | d24c2c7e-430b-11e7-bf1b-00155d016710 |
+----+-------------------------------------------------------+

当在master上更新一条从库不存在的记录时,也就是id=2的记录,你会发现master是可以执行成功的。而slave拿到这个SQL后,也会照常执行,不报任何异常,只是更新操作不影响行数而已。并且你执行命令show slave status,查看输出,你会发现没有异常。但是,如果你是row模式,由于这行根本不存在,是会报1062错误的。

在 MySQL 5.7.7 之前,默认的格式是 STATEMENT,在 MySQL 5.7.7 及更高版本中,默认值是 ROW。

开启binlog

一般来说开启binlog日志大概会有1%的性能损耗。

需要先输入mysql 进入mysql命令行模式

mysql> show variables like 'log_%'; #注意有分号
+----------------------------------------+---------------------------------------+
| Variable_name                          | Value                                 |
+----------------------------------------+---------------------------------------+
| log_bin                                | ON                                    | ------> ON表示已经开启binlog日志
| log_bin_basename                       | /usr/local/mysql/data/mysql-bin       |
| log_bin_index                          | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators        | OFF                                   |
| log_bin_use_v1_row_events              | OFF                                   |
| log_error                              | /usr/local/mysql/data/martin.err      |
| log_output                             | FILE                                  |
| log_queries_not_using_indexes          | OFF                                   |
| log_slave_updates                      | OFF                                   |
| log_slow_admin_statements              | OFF                                   |
| log_slow_slave_statements              | OFF                                   |
| log_throttle_queries_not_using_indexes | 0                                     |
| log_warnings                           | 1                                     |
+----------------------------------------+---------------------------------------+

如果没有开启

启用binlog,通过配置 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 或mysql\bin\my.ini 配置文件的 log-bin 选项:

在配置文件中加入 log-bin 配置,表示启用binlog,如果没有给定值,写成 log-bin=,则默认名称为主机名。(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)

[mysqld]
log-bin=my-binlog-name

log-bin后面是binlog的文件名,譬如 log-bin=mysql-bin, 则生成的文件名为:

然后需要重启mysql

也可以通过 SET SQL_LOG_BIN=1 命令来启用 binlog,通过 SET SQL_LOG_BIN=0 命令停用 binlog。启用 binlog 之后须重启MySQL才能生效。

binlog文件介绍

binlog日志包括两类文件:

二进制日志索引文件(文件名后缀为.index)用于记录所有有效的的二进制文件

二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML语句事件

binlog是一个二进制文件集合,每个binlog文件以一个4字节的魔数开头,接着是一组Events:

魔数:0xfe62696e对应的是0xfebin;

Event:每个Event包含header和data两个部分;header提供了Event的创建时间,哪个服务器等信息,data部分提供的是针对该Event的具体信息,如具体数据的修改;

第一个Event用于描述binlog文件的格式版本,这个格式就是event写入binlog文件的格式;

其余的Event按照第一个Event的格式版本写入;

最后一个Event用于说明下一个binlog文件;

binlog的索引文件是一个文本文件,其中内容为当前的binlog文件列表

当遇到以下3种情况时,MySQL会重新生成一个新的日志文件,文件序号递增:

  • MySQL服务器停止或重启时

  • 使用 flush logs 命令;

  • 当 binlog 文件大小超过 max_binlog_size 变量的值时;

max_binlog_size 的最小值是4096字节,最大值和默认值是 1GB (1073741824字节)。事务被写入到binlog的一个块中,所以它不会在几个二进制日志之间被拆分。
因此,如果你有很大的事务,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的日志都记录到当前日志文件中,直到事务结束,你可能会看到binlog文件大于 max_binlog_size 的情况。

binlog日志内容查看

binlog日志有二种查看方式,具体如下:

1、mysql查看binlog

这种方法相当于执行sql语句 在图形化工具中也可直接执行

mysql> show binlog events; #只查看第一个binlog文件的内容(全部的 怎么只看部分呢)
mysql> show binlog events ``in 'mysql-bin.000002'``;#查看指定binlog文件的内容
mysql> show binary logs; #获取binlog文件列表
mysql> show master status; #查看当前正在写入的binlog文件
mysql> show binary logs; #获取binlog文件列表
参数名 含义
log bin = (on off base name)
sql log bin =( on off )
expire logs days 指定自动删除二进制日志的时间,即日志过期时间
log bin index 指定mysql-bin.index文件的路径
binlog format = [ mixed | row | statement ] 指定二进制日志基于什么模式记录
max binlog size 指定二进制日志文件最大值
binlog cache size 指定事务日志缓存区大小
max binlog cache size 指定二进制日志缓存最大大小
sync binlog = { 0 | n } 指定写缓冲多少次,刷一次盘
SHOW BINLOG EVENTS[IN 'log_name'][FROM pos][LIMIT [offset,] row_count]
在二进制日志中显示事件。如果未指定,则显示第一个二进制日志。需要特权。'log_name'SHOW BINLOG EVENTSREPLICATION SLAVE该LIMIT子句与该语句具有相同的语法SELECT。请参见“ SELECT语句”。mysql> show binlog events limit 10;
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
| Log_name         | Pos   | Event_type     | Server_id | End_log_pos | Info                                                |
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
| mysql-bin.000001 |     4 | Format_desc    |         1 |         123 | Server ver: 5.7.27-log, Binlog ver: 4               |
| mysql-bin.000001 |   123 | Previous_gtids |         1 |         154 |                                                     |
| mysql-bin.000001 |   154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                |
| mysql-bin.000001 |   219 | Query          |         1 |         300 | BEGIN                                               |
| mysql-bin.000001 |   300 | Table_map      |         1 |         412 | table_id: 392 (cactus_000510.360exthost_examinemgr) |
| mysql-bin.000001 |   412 | Delete_rows    |         1 |        8617 | table_id: 392                                       |
| mysql-bin.000001 |  8617 | Delete_rows    |         1 |       12732 | table_id: 392 flags: STMT_END_F                     |
| mysql-bin.000001 | 12732 | Xid            |         1 |       12763 | COMMIT /* xid=530 */                                |
| mysql-bin.000001 | 12763 | Anonymous_Gtid |         1 |       12828 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                |
| mysql-bin.000001 | 12828 | Query          |         1 |       12917 | BEGIN                                               |
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
10 rows in set (0.13 sec)

Binlog Event 简要分析
从一个最简单的实例来分析Event,包括创建表,插入数据,更新数据,删除数据;

CREATE TABLE `test` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`age` int(11) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into test values(1,22,"小旋锋");
update test set name='whirly' where id=1;
delete from test where id=1;

日志格式为STATEMENT,查看所有的Event

日志格式为ROW时是下面这样,可以发现又有一些不同

2、使用mysqlbinlog工具

以下为普通bash命令 非mysql模式下的了

发出SHOW BINLOG EVENTS with no LIMIT子句可能会启动一个非常耗时和资源消耗的过程,因为服务器将二进制日志的完整内容(包括服务器修改数据的所有语句)返回给客户端。作为替代SHOW BINLOG EVENTS,使用mysqlbinlog实用程序将二进制日志保存到文本文件中,以供以后检查和分析。
而且 show event命令查看了binlog的简单信息,如何查看执行时间、执行花费的时间等详细信息需要使用工具包中的mysqlbinlog命令。

mysqlbinlog是一个查看mysql二进制日志的工具,可以把mysql上面的所有操作记录从日志里导出,这个工具默认的安装路径为:/usr/local/mysql/bin/mysqlbinlog

可以通过find / -name "mysqlbinlog"或者which mysqlbinlog命令查找mysqlbinlog的工具路径。

至于日志文件,参照前面的开启binlog章

基于开始/结束时间:

/usr/local/mysql/bin/mysqlbinlog --start-datetime=``"2013-03-01 00:00:00" --stop-datetime=``"2014-03-21 23:59:59" /usr/local/mysql/``var``/mysql-bin.000007 -r test2.sql
# mysqlbinlog 的执行格式
mysqlbinlog [options] log_file ...# 查看bin-log二进制文件(shell方式)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003# 查看bin-log二进制文件(带查询条件)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003 \--start-datetime="2019-03-01 00:00:00"  \--stop-datetime="2019-03-10 00:00:00"   \--start-position="5000"    \--stop-position="20000"

截取结果其中的一段进行分析:

# at 21019
#190308 10:10:09 server id 1  end_log_pos 21094 CRC32 0x7a405abc     Query   thread_id=113   exec_time=0 error_code=0
SET TIMESTAMP=1552011009/*!*/;
BEGIN
/*!*/;

上面输出包括信息:

position: 位于文件中的位置,即第一行的(# at 21019),说明该事件记录从文件第21019个字节开始
timestamp: 事件发生的时间戳,即第二行的(#190308 10:10:09)
server id: 服务器标识(1)
end_log_pos 表示下一个事件开始的位置(即当前事件的结束位置+1)
thread_id: 执行该事件的线程id (thread_id=113)
exec_time: 事件执行的花费时间
error_code: 错误码,0意味着没有发生错误
type:事件类型Query


发现BINLOG 处的内容我们看不明白。。。_

增加 --base64-output=decode-rows –v 选项解析

(base64-output,可以控制输出语句输出base64编码的BINLOG语句;decode-rows:选项将把基于行的事件解码成一个SQL语句)

/mysql/app/mariadb/bin/mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 | more


变成人类可以读懂的SQL语句了;

PS: 可以把binlog解析后的内容放到一个文件后,在分析,利用如下脚本

/mysql/app/mariadb/bin/mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 >/tmp/binlog007.sql
mysqlbinlog --no-defaults --base64-output=decode-rows -v   mysql-bin.000002

怎么删binlog

删binlog的方法很多,有三种是常见的
(1) 使用reset master,该命令将会删除所有日志,并让日志文件重新从000001开始。
(2) 使用命令

PURGE { BINARY | MASTER } LOGS { TO ‘log_name’ | BEFORE datetime_expr }
1
例如

purge master logs to “binlog_name.00000X”
1
将会清空00000X之前的所有日志文件.
(3) 使用–expire_logs_days=N选项指定过了多少天日志自动过期清空。

Mysql-binlog的查看相关推荐

  1. mysql binlog日志查看及解码

    mysql bin log日志导出 mysqlbinlog  mysql-bin.000005 > /home/17bin.log 需要添加参数(--base64-output=decode-r ...

  2. mysql-bin 查看_Mysql Binlog数据查看的方法详解

    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 ...

  3. mysqlbinlog查看日志_一个分布式 MySQL Binlog 存储系统的架构设计

    1. kingbus简介 1.1 kingbus是什么? kingbus是一个基于raft强一致协议实现的分布式MySQL binlog 存储系统.它能够充当一个MySQL Slave从真正的Mast ...

  4. mysql binlog查看_MySQL--17 配置binlog-server 及中间件

    配置binlog-server 修改mha配置文件 [root@mysql-db03 ~]# vim /etc/mha/app1.cnf[binlog1]no_master=1hostname=10. ...

  5. mysql binlog查看工具_数据同步工具otter(一)谈谈binlog和canal

    之前因为懒,没有针对otter做更多的解释和说明,在使用过程中,也发现了一些问题,此次补上一个完整的文档,方便大家使用. Otter是基于cannal开源的,canal又是基于mysql binlog ...

  6. Mysql binlog日志及binlog恢复数据库操作

    初识MySQL 日志binlog MySQL重要log,二进制日志文件,记录所有DDL和DML语句(除select),事件形式记录,包含语句所执行的消耗时间,事务安全型. DDL(数据库定义语言),主 ...

  7. MySQL Binlog解析

    概述 MySQL的安装可以参考:Linux(CentOS)中常用软件安装,使用及异常--MySQL, VmTools MySQL关于Binlog的官方文档:The Binary Log 基于Binlo ...

  8. Mysql binlog应用场景与原理深度剖析

    1 基于binlog的主从复制 Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制.复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他M ...

  9. mysql binlog的查询

    查mysql bin-log binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中: 作用:MySQL的作用类似于Oracle的归 ...

  10. 好文推荐 | MySQL binlog应用场景与原理深度剖析

    作者:田守枝 来自:田守枝的博客(公众号) 本文深入介绍Mysql Binlog的应用场景,以及如何与MQ.elasticsearch.redis等组件的保持数据最终一致.最后通过案例深入分析binl ...

最新文章

  1. python爬虫网络请求超时_6、web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...
  2. 我在犹豫是不是该收集这几首MP3
  3. 前台传String日期格式后台用Date类型接收
  4. cassandra随机获取数据_从数据库随机获取数据库
  5. 【网络安全工程师面试合集】—谈一谈什么是网络安全?
  6. (C语言)最长公共子串
  7. JAVA day20、21 双列集合Map<K,V>:HashMap,LinkedHashMap,TreeMap,Hashtable, ConcurrentHashMap;JDK1.9新特性
  8. php 翻译接口,翻译接口整理
  9. java 取色器_Arava: 用 swing 写一个取色器
  10. Couldn't find leader offsets for Set news_topic
  11. 【TED ON FLEX】支持flashplayer的RIBBIT系统
  12. Python 实现斐波那契数列中的前50个
  13. unity 开发EasyAR发布IOS和安卓坑记录
  14. 【文献学习】海上信道系统知识体系详解--附思维导图
  15. 案例:谷歌人工智能算法Dropout申请专利
  16. BIOS知识枝桠—— Library
  17. 2018面试的-5分钟自我介绍建议
  18. 基石为勤能补拙的迷宫之旅——第一天(计算机硬件和操作系统)
  19. C#编程学习35:对MDB数据库的操作
  20. 想进入黑马程序员——传智播客学习

热门文章

  1. HSSFCellStyle相关属性报错
  2. BeautifulSoup安装
  3. 一文搞懂 php 中的 DI 依赖注入
  4. linux压缩文件恢复,Linux文件误删恢复
  5. UDP通信——使用python实现简单的UDP通信
  6. Codeforces 161 B. Discounts (贪心)
  7. Spark教程——(10)Spark SQL读取Phoenix数据本地执行计算
  8. 对于Linux基础网络设置
  9. 保研面试中常见的英语问题有哪些?
  10. 安装指定版本Kubernetes