基本环境:官方社区版MySQL 5.7.19

一、了解Binary Log结构

1.1、High-Level Binary Log Structure and Contents

• Binlog包括binary log files和index file
• 每个binary log文件的前4字节是Magic Number,紧接着是一组描述数据修改的Events
  • The magic number bytes are 0xfe 0x62 0x69 0x6e = 0xfe 'b''i''n'
  • 每个Event包括header bytes和data bytes
    header bytes:Event类型,什么时候,由哪个server生成等信息
    data bytes:特定的数据修改
  • 第一个Event是Description Event,描述文件的格式版本
  • 其他Events按照binlog_version(1、3、4)进行记录
  • 最后一个Event是Log-rotation Event,指定下一个binary log的文件名称
• index文件里面是当前binary log的一个列表

1.2、Binary Log结构示意图

# Binary Log结构示意图(binlog_version=)
|<----------------------------------Events---------------------------------->|
|<---------Fisrt Event--------->|<------Mid Events----->|<---Final Event---->|
+--------------+-------------------------------+--------+-----+--------+--------------------+
| Magic Number | FDE(Format Description Event) | Event1 | ... | EventN | Log-rotation Event |
+--------------+-------------------------------+--------+-----+--------+--------------------+
|<-event header->|<-event data->|


上图是binlog_version=4(MySQL 5.0 and up)的示意图

二、index file添加一行不存在的binary log记录

查看当前binary log

# 查看当前binary log
[root@ZST1 logs]# ll
total
-rw-r-----. mysql mysql Jan : mysql-bin.
-rw-r-----. mysql mysql Jan : mysql-bin.
-rw-r-----. mysql mysql Jan : mysql-bin.
-rw-r-----. mysql mysql Jan : mysql-bin.
-rw-r-----. mysql mysql Jan : mysql-bin.index
[root@ZST1 logs]# cat mysql-bin.index
/data/mysql/mysql3308/logs/mysql-bin.
/data/mysql/mysql3308/logs/mysql-bin.
/data/mysql/mysql3308/logs/mysql-bin.
/data/mysql/mysql3308/logs/mysql-bin.
[root@ZST1 logs]#

mysql-bin.index 添加一行已经删除的记录/data/mysql/mysql3308/logs/mysql-bin.000001,重新启动数据库服务

# 查看error log
[root@ZST1 ~]# more /data/mysql/mysql3308/data/error.log
...
--12T03::.467474Z [Note] InnoDB: Loading buffer pool(s) from /data/mysql/mysql3308/data/ib_buffer_pool
mysqld: File '/data/mysql/mysql3308/logs/mysql-bin.000001' not found (Errcode: - No such file or directory)
--12T03::.546276Z [ERROR] Failed to open log (file '/data/mysql/mysql3308/logs/mysql-bin.000001', errno )
--12T03::.546294Z [ERROR] Could not open log file
--12T03::.563485Z [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
--12T03::.563528Z [Note] Server hostname (bind-address): '*'; port:
数据库服务最终启动起来

mysql-bin.index 添加一行未来的记录/data/mysql/mysql3308/logs/mysql-bin.000017,重新启动数据库服务

# 查看error log
[root@ZST1 ~]# more /data/mysql/mysql3308/data/error.log
...
--12T03::.921370Z [Note] InnoDB: Loading buffer pool(s) from /data/mysql/mysql3308/data/ib_buffer_pool
mysqld: File '/data/mysql/mysql3308/logs/mysql-bin.000017' not found (Errcode: - No such file or directory)
--12T03::.017490Z [ERROR] Failed to open log (file '/data/mysql/mysql3308/logs/mysql-bin.000017', errno )
--12T03::.017509Z [ERROR] Could not open log file
--12T03::.017532Z [ERROR] Can not init tc log
--12T03::.017545Z [ERROR] Aborting
数据库服务最终退出

启动过程会读取index file中的第一条和最后一条记录,然后检查对应的文件是否存在。如果第一条不存在,error log中会有报错,但服务正常启动;如果最后一条不存在,error log中会有报错,服务退出。即使你打乱index file中列表顺序,或者写入其他信息,它始终只验证index file的第一条和最后一条~

三、手动创建一个binary log,但不添加到index file

如果touch_seq < max(exists_seq),正常启动,最新的new_seq=max(exists_seq)+1
如果max(exists_seq) < touch_seq < pow(2,31)-1,正常启动,最新的new_seq=touch_seq+1,当new_seq > pow(2,31)-1001 时会往error log中写入警告
如果touch_seq = pow(2,31)-1,mysqld退出
如果touch_seq > pow(2,31)-1,正常启动,会往error log中写入警告

3.1、MySQL binlog后面的编号最大是多大

最大编号参考文章:MySQL binlog后面的编号最大是多大

原文结论:
1、MySQL binlog的最大sequence是:pow(2,31)-1 = 2147483647
2、当 pow(2,31)-1001 < sequence < pow(2,31)-1 会往error log中写入警告
3、binlog的sequence达到最大值(2147483647)时,不管有没有mysql-bin.000001类似这样的文件,mysqld都是退出
4、在MySQL产生binlog时会读取当前日件文目录下的log-bin的base name获取下一个日志文件的后面的Seq。所以日志目录下文件太多,会影响MySQL的启动及日志切换。这里也有一个大的隐患,运行中给放一个较大的日志文件,在下次日志文件切换时有可能很快就接近于最大值,造成mysqld crash退出
5、一定要监控error log的输出,并足够重视

查看源码(5.7.19)

# 源码信息 sql/binlog.cc
#define MAX_LOG_UNIQUE_FN_EXT 0x7FFFFFFF
#define LOG_WARN_UNIQUE_FN_EXT_LEFT 1000 /* check if reached the maximum possible extension number */
if (max_found == MAX_LOG_UNIQUE_FN_EXT)
{
sql_print_error("Log filename extension number exhausted: %06lu. \
Please fix this by archiving old logs and \
updating the index files.", max_found);
error= ;
goto end;
} /* print warning if reaching the end of available extensions. */
if ((next > (MAX_LOG_UNIQUE_FN_EXT - LOG_WARN_UNIQUE_FN_EXT_LEFT)))
sql_print_warning("Next log extension: %lu. \
Remaining log filename extensions: %lu. \
Please consider archiving some logs.", next, (MAX_LOG_UNIQUE_FN_EXT - next)); mysql> select conv('7FFFFFFF',,);
+------------------------+
| conv('7FFFFFFF',,) |
+------------------------+
| |
+------------------------+

源码逻辑正是上面的结论1、2、3。如果我们的binlog的sequence疯涨到2147483647,那很不幸mysqld会退出。。。但如果我们在正常情况下,touch一个大于2147483647的binary log的文件会出现什么情况呢?

3.2、MySQL binlog后面的编号最大到底是多大

首先我们从2147483648开始

# reset master
mydba@192.168.85.132, [replcrash]> reset master;
Query OK, rows affected (0.01 sec)
# 查看binary log
mydba@192.168.85.132, [replcrash]> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin. | |
+------------------+-----------+
row in set (0.00 sec)
# touch ^
[root@ZST1 logs]# touch mysql-bin.
[root@ZST1 logs]# chown -R mysql:mysql *
# flush执行5次
mydba@192.168.85.132, [replcrash]> flush binary logs;
Query OK, rows affected (0.01 sec)
# 查看binary log
mydba@192.168.85.132, [replcrash]> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
+----------------------+-----------+
rows in set (0.00 sec)
# 查看error log
[root@ZST1 data]# cat error.log
--08T09::.235149Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
--08T09::.868883Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
--08T09::.670811Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
--08T09::.401541Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
--08T09::.075702Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
[root@ZST1 logs]# # 再次reset master
mydba@192.168.85.132, [replcrash]> reset master;
Query OK, rows affected (0.02 sec)
# 查看binary log
mydba@192.168.85.132, [replcrash]> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| mysql-bin. | |
+----------------------+-----------+
row in set (0.00 sec)

可以看到,执行flush binary logs后,sequence一直往后+1(next)。error log中会有警告日志,next > (MAX_LOG_UNIQUE_FN_EXT - LOG_WARN_UNIQUE_FN_EXT_LEFT)恒成立;Remaining log filename extensions后面的数值看着有点怪异~
第二次reset后的sequence从2147483649开始,并不是从000001开始,不知道什么原因。
我们继续加大sequence,直到接近9223372036854775808

# touch ^-
[root@ZST1 logs]# touch mysql-bin.
[root@ZST1 logs]# chown -R mysql:mysql *
# flush执行5次
mydba@192.168.85.132, [replcrash]> flush binary logs;
Query OK, rows affected (0.01 sec)
# 查看binary log
mydba@192.168.85.132, [replcrash]> show binary logs;
+-------------------------------+-----------+
| Log_name | File_size |
+-------------------------------+-----------+
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
+-------------------------------+-----------+
rows in set (0.00 sec)
# 查看error log
[root@ZST1 data]# cat error.log
--08T09::.879612Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
--08T09::.082530Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
--08T09::.934636Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
--08T09::.544604Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
--08T09::.134664Z [Warning] Next log extension: . Remaining log filename extensions: . Please consider archiving some logs.
[root@ZST1 logs]#

当sequence达到9223372036854775808后,再flush binary log,看不出产生新binary log~

[root@ZST1 logs]# mysqlbinlog -v --base64-output=decode-rows mysql-bin.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at
# :: server id end_log_pos CRC32 0x798b200f Start: binlog v , server v 5.7.-log created ::
# Warning: this binlog is either in use or was not closed properly.
# at
# :: server id end_log_pos CRC32 0xf3252c32 Previous-GTIDs
# [empty]
# at
# :: server id end_log_pos CRC32 0x6054f256 Rotate to mysql-bin. pos:
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@ZST1 logs]#

解析binlog可以在末尾看到Rotate to mysql-bin.9223372036854775808  pos: 4
也就是说再怎么切,也只能切到9223372036854775808,这个文件感觉有点不太正常,不受max_binlog_size限制,解析出的日志莫名不完整~
恢复原始:手工删除 mysql-bin.2147483647 这类大文件,然后修改 mysql-bin.index;或者直接清空logs文件夹,再重新启动数据库服务

四、参考文档

MySQL binlog后面的编号最大是多大:http://wubx.net/mysql-binlog-max-sequence/
High-Level Binary Log Structure and Contents:https://dev.mysql.com/doc/internals/en/binary-log-structure-and-contents.html
Binary Log Versions:https://dev.mysql.com/doc/internals/en/binary-log-versions.html
Event Structure:https://dev.mysql.com/doc/internals/en/event-structure.html

手动创建binary log files和手动编辑binary log index file会有什么影响的更多相关文章

  1. 详解Oracle手动创建数据库几大步骤

    在这里我们将介绍Oracle手动创建数据库几大步骤,包括前期的准备工作,以及具体的实施. Oracle手动创建数据库是本文介绍的重点,希望通过本文能帮助大家更好的利用Oracle.51CTO也向您推荐 ...

  2. Java 基础 enum枚举类 的创建/使用/接口继承 ,以及手动创建枚举类的对象为:public static final

    笔记: import java.lang.*; /**一:枚举类 : enum Season implements info { s1(),s2(),s3(),s4() }; //s1--s4 放在S ...

  3. EBS R12 LOG files 位置

    - Apache, OC4J and OPMN: $LOG_HOME/ora/10.1.3/Apache$LOG_HOME/ora/10.1.3/j2ee$LOG_HOME/ora/10.1.3/op ...

  4. Oracle11g手动创建数据库方法

    Oracle11g手动创建数据库方法 参考网页http://www.th7.cn/db/Oracle/201311/36926.shtml 安装路径 我的安装路径是:E:\app\admin\prod ...

  5. linux环境中,如何通过手动创建crontab文件的方式来设置crontab定时调度任务?

    需求描述: 之前在创建定时任务的时候,都是通过cronab -e的方式进行创建,今天在做通过脚本部署定时任务的时候, 就想,通过crontab -e编辑的定时任务存放在哪个文件里,是否,可以手动的编辑 ...

  6. Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)

    1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...

  7. 手动创建第一个OC程序

    手动创建第一个OC程序 创建一个文件夹,文件夹内创建一个a.m的OC源文件,并编辑 之前说过,OC是完全兼容C语言的,那么我们先写个下面的程序尝试一下 #include<stdio.h> ...

  8. 如何在JavaScript中手动创建类数组对象

    前言 关于什么是js的类数组对象这里不再赘述.可以参考这个链接,还有这里. js中类数组对象很多,概念简单的讲就是看上去像数组,又不是数组,可以使用数字下标方式访问又没有数组方法. 例: argume ...

  9. 2,手动创建CAD二次开发项目--AutoCAD二次开发(2020版)

    本项目使用手动创建,意为不使用SDK模板. 从Visual Studio的“文件”下拉菜单中,选择“新建”->“项目...”. 在出现的“新建项目”对话框的“项目类型:”树中,单击“ Visua ...

随机推荐

  1. 实现CSS等分布局的5种方式

    前面的话 等分布局是指子元素平均分配父元素宽度的布局方式,本文将介绍实现等分布局的5种方式 float [思路一]float 缺点:结构和样式存在耦合性,IE7-浏览器下对宽度百分比取值存在四舍五入的 ...

  2. BZOJ3786星系探索——非旋转treap(平衡树动态维护dfs序)

    题目描述 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. ...

  3. BZOJ4723[POI2017]Flappy Bird——模拟

    题目描述 <飞扬的小鸟>是一款风靡的小游戏.在游戏中,小鸟一开始位于(0,0)处,它的目标是飞到横坐标为X的某个位置 上.每一秒,你可以选择点击屏幕,那么小鸟会从(x,y)飞到(x+1,y ...

  4. BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集

    题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...

  5. Java生成数独函数

    突然想写一下生成算法.代码注释的比较多,应该比较好理解 使用了递归 import java.util.ArrayList; public class Sudoku { static int sudok ...

  6. $Min\_25$筛学习笔记

    \(Min\_25\)筛学习笔记 这种神仙东西不写点东西一下就忘了QAQ 资料和代码出处 资料2 资料3 打死我也不承认参考了yyb的 \(Min\_25\)筛可以干嘛?下文中未特殊说明\(P\)均指 ...

  7. 自学Linux Shell16.4-在命令行上使用函数

    点击返回 自学Linux命令行与Shell脚本之路 16.4-在命令行上使用函数 脚本函数不仅可以用作shell脚本命令,也可以用作命令行界面的命令.一旦在shell中定义了函数,可以从系统的任意目录 ...

  8. 【BZOJ1856】[SCOI2010]字符串(组合数学)

    [BZOJ1856][SCOI2010]字符串(组合数学) 题面 BZOJ 洛谷 题解 把放一个\(1\)看做在平面直角坐标系上沿着\(x\)正半轴走一步,放一个\(0\)看做往\(y\)轴正半轴走一 ...

  9. TextView 借助Linkify,使用自定义模式设置链接

    http://my.oschina.net/fengheju/blog/176105 TextView是android中的一个比较常用的控件,它有一个非常有趣的特性,可以通过android:autoL ...

  10. vue使用v-if v-show页面闪烁,div闪现的解决方法

    v-if和v-show可能是日常开发中最常用的两个指令,虽然看上去两者功能是类似的,但是两者还是存在很大区别的. v-if与v-show区别: 在切换 v-if 块时,Vue.js 有一个局部编译/卸 ...