mysql打开、查看、清理binlog

1.开启日志
log_bin=/var/lib/mysql/mysql-bin
mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/ON |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+--------------------------------+
rows in set (0.00 sec)

log_bin=ON 打开binlog日志
log_bin_basename=/var/lib/mysql/mysql-bin binlog日志的基本文件名,后面会追加标识来表示每一个文件
log_bin_index=/var/lib/mysql/mysql-bin.index binlog文件的索引文件,这个文件管理了所有的binlog文件的目录

2.binlog日志模式

默认如下:

mysql> show variables like '%binlog_format%';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
row in set (0.00 sec)
  • 复制模式一:基于SQL语句的复制(statement-based replication,SBR)
  • 复制模式二:基于行的复制(row-based replication,RBR)
  • 复制模式三:以上两种模式的混合模式(mixed-based replication,MBR)

分别对应binlog三种模式:

  • statement(SBR) 记录每一条修改数据的sql语句到binlog中
    优点: 不需要记录每一条sql语句和每一行的数据变化,减少binlog日志量,节省IO,提高性能
    缺点:需要记录上下文信息;某些存储过程、函数无法正确复制

  • ROW(RBR)
    优点:不记录上下文信息,仅记录哪条数据被修改成什么样子,可以正确复制存储过程、函数、触发器
    缺点:每一条数据记录都记录,占用空间、消耗IO性能

  • MIXED(MBR)
    以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

3.保留时间,默认永远不删除
mysql> show variables like '%expire_logs%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | |
+------------------+-------+
row in set (0.00 sec)
4.查看当前使用的binlog和position
mysql> show master status\G
*************************** . row ***************************
File: mysql-bin.
Position:
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
row in set (0.00 sec)
6.查看binlog的内容
  • mysql命令直接查看,不指定就是第一个binlog日志文件
mysql> show binlog events;
+------------------+-----+-------------+-----------+-------------+-----------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+-----------------------------------------+
| mysql-bin. | | Format_desc | | | Server ver: 5.6.-log, Binlog ver: |
| mysql-bin. | | Query | | | BEGIN |
| mysql-bin. | | Query | | | use `db1`; insert into t1(id) values() |
| mysql-bin. | | Xid | | | COMMIT /* xid=35 */ |
| mysql-bin. | | Rotate | | | mysql-bin.;pos= |
+------------------+-----+-------------+-----------+-------------+-----------------------------------------+
rows in set (0.00 sec)
  • mysql命令查看指定binlog文件
mysql>  show binlog events in 'mysql-bin.000007';
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin. | | Format_desc | | | Server ver: 5.6.-log, Binlog ver: |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
row in set (0.00 sec)
  • 或者shell环境指定binlog文件
[root@docker01 mysql]# mysqlbinlog mysql-bin.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at
# :: server id end_log_pos CRC32 0x77f71e56 Start: binlog v , server v 5.6.-log created ::
BINLOG '
orxuWg8BAAAAdAAAAHgAAAAAAAQANS42LjM5LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAVYe
93c=
'/*!*/;
# at
# :: server id end_log_pos CRC32 0x8fbc381e Query thread_id= exec_time= error_code=
use `db2`/*!*/;
SET TIMESTAMP=/*!*/;
SET @@session.pseudo_thread_id=/*!*/;
SET @@session.foreign_key_checks=, @@session.sql_auto_is_null=, @@session.unique_checks=, @@session.autocommit=/*!*/;
SET @@session.sql_mode=/*!*/;
SET @@session.auto_increment_increment=, @@session.auto_increment_offset=/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=,@@session.collation_connection=,@@session.collation_server=/*!*/;
SET @@session.lc_time_names=/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table t1 (id int, name varchar())
/*!*/;
# at
# :: server id end_log_pos CRC32 0x6e5df96f Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0x6ed4b068 Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
insert into t1 values(,'yzw')
/*!*/;
# at
# :: server id end_log_pos CRC32 0xeeb12b2a Xid =
COMMIT/*!*/;
# at
# :: server id end_log_pos CRC32 0x6ca7654c Rotate to mysql-bin. pos:
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

其他查询方式:

mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
+------------------+-----------+
rows in set (0.00 sec)

a)查询第一个(最早)的binlog日志:
mysql> show binlog events\G; b)指定查询 mysql-bin.000002这个文件:
mysql> show binlog events in 'mysql-bin.000002'\G; c)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起:
mysql> show binlog events in 'mysql-bin.000002' from 624\G; d)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,查询10条(即10条语句)
mysql> show binlog events in 'mysql-bin.000002' from 624 limit 10\G; e)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,偏移2行(即中间跳过2个),查询10条
mysql> show binlog events in 'mysql-bin.000002' from 624 limit 2,10\G;
7.删除binlog
  • reset master; 删除master的binlog
  • reset slave; 删除slave的中继日志
  • reset slave all; ??
  • purge master logs before 'YYYY-mm-DD HH:MM:SS'; 基于时间点的日志文件删除
  • purge master logs to 'mysql-bin.000002'; 删除到指定binlog文件前的所有日志文件,不包括指定的binlog文件
8.mysqlbinlog help

Mysqlbinlog解析工具

Mysqlbinlog功能是将Mysql的binlog日志转换成Mysql语句,默认情况下binlog日志是二进制文件,无法直接查看。

参数 描述
-d 指定库的binlog
-r 相当于重定向到指定文件
--start-position--stop-position 按照指定位置精确解析binlog日志(精确),如不接--stop-positiion则一直到binlog日志结尾
--start-datetime--stop-datetime 按照指定时间解析binlog日志(模糊,不准确),如不接--stop-datetime则一直到binlog日志结尾

备注:myslqlbinlog分库导出binlog,如使用-d参数,更新数据时必须使用use database。 例:解析ceshi数据库的binlog日志并写入my.sql文件

#mysqlbinlog -d ceshi mysql-bin.000003 -r my.sql

使用位置精确解析binlog日志

mysqlbinlog mysql-bin.000003 --start-position=100  --stop-position=200 -r my.sql
9.使用binlog恢复数据

mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名

基于时间或者scn的恢复
mysqlbinlog mysql-bin.000009 --start-position 154 --stop-position 755 | mysql -uroot -p mytest

--start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间
--stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样
--start-position:从二进制日志中读取指定position 事件位置作为开始。
--stop-position:从二进制日志中读取指定position 事件位置作为事件截至


binlog格式

https://dev.mysql.com/doc/internals/en/binary-log-versions.html
5.0以后,用的是第四版本的binlog格式

binlog events https://dev.mysql.com/doc/internals/en/binlog-event.html

+=====================================+
| event | timestamp 0 : 4 |
| header +----------------------------+
| | type_code 4 : 1 | = FORMAT_DESCRIPTION_EVENT = 15
| +----------------------------+
| | server_id 5 : 4 |
| +----------------------------+
| | event_length 9 : 4 | >= 91
| +----------------------------+
| | next_position 13 : 4 |
| +----------------------------+
| | flags 17 : 2 |
+=====================================+
| event | binlog_version 19 : 2 | = 4
| data +----------------------------+
| | server_version 21 : 50 |
| +----------------------------+
| | create_timestamp 71 : 4 |
| +----------------------------+
| | header_length 75 : 1 |
| +----------------------------+
| | post-header 76 : n | = array of n bytes, one byte per event
| | lengths for all | type that the server knows about
| | event types |
+=====================================+

v4 event sturcture

+=====================================+
| event | timestamp 0 : 4 |
| header +----------------------------+
| | type_code 4 : 1 |
| +----------------------------+
| | server_id 5 : 4 |
| +----------------------------+
| | event_length 9 : 4 |
| +----------------------------+
| | next_position 13 : 4 |
| +----------------------------+
| | flags 17 : 2 |
| +----------------------------+
| | extra_headers 19 : x-19 |
+=====================================+
| event | fixed part x : y |
| data +----------------------------+
| | variable part |
+=====================================+

单独在一个binlog插入一条记录,查看binlong的内容 insert into t1 values (2);

00000000  fe 62 69 6e fa 40 7d 5a  0f 69 08 00 00 74 00 00  |.bin.@}Z.i...t..|
00000010 00 78 00 00 00 00 00 04 00 35 2e 36 2e 33 39 2d |.x.......5.6.39-|
00000020 6c 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 |log.............|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 |................|
00000050 38 0d 00 08 00 12 00 04 04 04 04 12 00 00 5c 00 |8.............\.|
00000060 04 1a 08 00 00 00 08 08 08 02 00 00 00 0a 0a 0a |................|
00000070 19 19 00 01 36 37 2b d4 32 41 7d 5a 04 69 08 00 |....67+.2A}Z.i..|
00000080 00 2f 00 00 00 a7 00 00 00 00 00 04 00 00 00 00 |./..............|
00000090 00 00 00 6d 79 73 71 6c 2d 62 69 6e 2e 30 30 30 |...mysql-bin.000|
000000a0 30 30 38 0d 40 ad 3f |008.@.?|
000000a7

第一部分4个字节

  • 最开始的4个字节magic number:fe62696e 前4个字节是固定的magic number

通过十六进制转ASCII如下(http://www.ab126.com/goju/1711.htm/)

A binary log file begins with a 4-byte magic number followed by an initial descriptor event that identifies the format of the file. In v4, it is called a "format description event."

第二部分19个字节的事件头部(event header)

https://dev.mysql.com/doc/internals/en/format-description-event.html

  • 0-4字节时间戳(timestamp 0 : 4):fa 40 7d 5a ,小字节序存储应该是:5a7d40fa

通过十六进制转十进制获取时间戳是:1518158074,北京时间:2018/2/9 下午2:34:34
十六进制转十进制工具:https://tool.lu/hexconvert/
 时间戳转北京时间工具:http://tools.sharejs.com/unixtime.html

  • 1字节类型码(type_code 4 : 1):0f ,表示FORMAT_DESCRIPTION_EVENT

其他字节码含义参考:https://dev.mysql.com/doc/internals/en/binlog-event-type.html

  • 4字节server_id(server_id 5 : 4):69 08 00 00,小字节序存储:00000869,转10进制是:2153
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | |
+---------------+-------+
row in set (0.00 sec)
  • 4字节事件长度(event_length 9 : 4):74 00 00 00,小字节序存储:00000074,转10进制是:116
  • 4字节下一个事件起始位置(next_position 13 : 4):78 00 00 00,小字节序存储:00000078,转10进制是:120
  • 2个字节的flags(flags 17 : 2):00 00 ,binlog已关闭

其他flag含义参考:https://dev.mysql.com/doc/internals/en/binlog-event-flag.html
00 01表示binlog还在使用

  • extra_headers为空

第三部分事件数据(event data) 事件数据有固定数据fixed data和可变数据variable data组成

https://dev.mysql.com/doc/internals/en/event-data-for-specific-event-types.html
84个字节长度的Fixed data

  • Variable data

http://www.cnblogs.com/ryan0003/articles/8404065.html event header http://www.ab126.com/goju/1711.html https://tool.lu/hexconvert/https://www.jianshu.com/p/c16686b35807 https://dev.mysql.com/doc/internals/en/binary-log-versions.htmlhttps://dev.mysql.com/doc/internals/en/binlog-event-header.html https://dev.mysql.com/doc/internals/en/binlog-event.htmlhttp://tools.sharejs.com/unixtime.html

mysql小白系列_04 binlog(未完)的更多相关文章

  1. mysql小白系列_04 datablock

    1.为什么创建一个InnoDB表只分配了96K而不是1M? 2.解析第2行记录格式?(用下面的表定义和数据做测试) mysql> create table gyj_t3 (),name2 var ...

  2. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  3. virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)

    virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...

  4. mysql小白系列_06 备份与恢复

    1.使用mydumper工具全库备份. 1)源码编译安装 2)全库备份 2.误操作truncate table gyj_t1;利用mysqldump的备份和binlog日志对表gyj_t1做完全恢复. ...

  5. mysql小白系列_14 线上故障分析与排错

    1.重现故障5---线上执行update报错,并处理.(表结构和UPDATE语句自己构造,请给出详细步骤) 1)update故障出现ERROR 1206 (HY000): The total numb ...

  6. mysql小白系列_06 备份与恢复 - mydumper与myloader

    http://blog.csdn.net/leshami/article/details/46815553 https://www.cnblogs.com/zhoujinyi/p/3423641.ht ...

  7. mysql小白系列_13 Online DDL

    Online DDL: 一.FIC之前的添加删除二级索引: 1.首先创建临时表,定义目标新表的选项和索引 2.逐行拷贝数据到临时表 3.插入行时更新索引信息 4.数据全部被拷贝到新表后,删除旧表,re ...

  8. mysql小白系列_11 MHA

    一.MHA是什么?能干什么的 (1)以Perl语言写的一套Mysql故障切换方案,一个脚本管理工具 (2)保障数据库的高可用性 (3)修复多个slave之间的差异日志,最终使所有的slave保持数据一 ...

  9. mysql小白系列_10 mysql主从复制原理

    1.如何解决主从复制延迟的问题? (1)主从复制原理 http://www.cnblogs.com/jenvid/p/8410922.html 1.salve执行slave start,salve服务 ...

随机推荐

  1. CentOS 7.4 安装网易云音乐

    1.下包–>网易云音乐 Ubuntu14.04(推荐14.04依赖包网上能找到) 提示:16.04有部分依赖包还找不到,有兴趣可以自行打包RPM安装. 2.解包 (1)使用 ar -vx解压ub ...

  2. 16.What is pass in Python?

    What is pass in Python? Pass means, no-operation Python statement, or in other words it is a place h ...

  3. Tomcat的设置4——Tomcat的体系结构与设置基于端口号的虚拟主机

    一.Tomcat体系结构 从conf/server.xml可体现Tomcat的体系.一个Server可有多个service,一个service可以有多个连接器connector,每个连接器暴露出不同的 ...

  4. [USACO1.5]回文质数 Prime Palindromes

    题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...

  5. POJ - 3278 Catch That Cow 简单搜索

    Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. ...

  6. three.js中的矩阵变换(模型视图投影变换)

    目录 1. 概述 2. 基本变换 2.1. 矩阵运算 2.2. 模型变换矩阵 2.2.1. 平移矩阵 2.2.2. 旋转矩阵 2.2.2.1. 绕X轴旋转矩阵 2.2.2.2. 绕Y轴旋转矩阵 2.2 ...

  7. 封锁阳光大学(染色)P1330

    题目:https://www.luogu.com.cn/problem/P1330 阳光大学的校园是一张由 n 个点构成的无向图,n 个点之间由 m 条道路连接.每只河蟹可以对一个点进行封锁,当某个点 ...

  8. php接口开发经验总结

    接口开发采用jwt方式验证: 接口开发最好留多几个返回方式,方便本地调用: 待更新.............

  9. 【HBase】HBase和Sqoop整合

    目录 需求一 步骤 一.修改sqoop配置文件 二.在mysql中创建数据库和数据表并插入数据 三.将mysql表中的数据导入到HBase表中 四.在HBase表中查看数据 需求二 步骤 一.创建hi ...

  10. 【Kafka】Flume整合Kafka

    目录 需求 一.Flume下载地址 二.上传解压Flume 三.配置flume.conf 四.启动flume 五.测试整合 需求 实现flume监控某个目录下面的所有文件,然后将文件收集发送到kafk ...