认真学习MySQL中的那些日志文件-二进制日志(binlog)

news2024/12/29 11:08:11

binlog即binary log,二进制日志文件,也叫作变更日志(update log)。它记录了数据库所有执行的DDL和DML等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、show等)。

它以事件形式记录并保存在二进制文件中。通过这些信息我们可以再现数据更新操作的全过程。

如果想要记录所有语句(例如,为了识别有问题的查询),需要使用通用查询日志。

binlog主要应用场景:

  • 一是用于数据恢复,如果MySQL数据库意外停止,可以通过二进制日志文件来查看用户执行了哪些操作,对数据库服务器文件做了哪些修改,然后根据二进制日志文件中的记录来恢复数据库服务器。
  • 二是用于数据复制,由于日志的延续性和时效性,master把它的二进制日志传递给slave来达到master-slave数据一致的目的。

可以说MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依赖binlog来同步数据,保证数据一致性。

在这里插入图片描述

【1】查看与操作

① 查看默认情况

Windows下:

show VARIABLES like '%log_bin%'

log_bin	ON
log_bin_basename	C:\ProgramData\MySQL\MySQL Server 8.0\Data\LAPTOP-GDNPUCQ7-bin
log_bin_index	C:\ProgramData\MySQL\MySQL Server 8.0\Data\LAPTOP-GDNPUCQ7-bin.index
log_bin_trust_function_creators	OFF
log_bin_use_v1_row_events	OFF
sql_log_bin	ON

Linux下如下所示:

mysql> show VARIABLES like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /var/lib/mysql/binlog       |
| log_bin_index                   | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | ON                          |
| log_bin_use_v1_row_events       | OFF                         |
| sql_log_bin                     | ON                          |
+---------------------------------+-----------------------------+
6 rows in set (0.01 sec)
  • log_bin_basename : 是binlog日志的基本文件名,后面会追加标识来表示每一个文件
  • log_bin_index:是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录
  • log_bin_trust_function_creators:限制存储过程。前面我们已经讲过了,这是因为二进制日志的一个中药功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启了二进制日志后,需要限制存储函数的创建、修改、调用。
  • log_bin_use_v1_row_events:此只读系统变量已弃用。ON表示使用版本1二进制日志行,OFF表示使用版本2二进制日志行(MySQL5.6的默认值为2)。

MySQL服务每重启一次就会生成一个新的binlog文件。
在这里插入图片描述

② 日志参数设置

方式1:永久性方式

修改MySQL的my.cnf 或 my.ini文件可以设置二进制日志的相关参数:

[mysqld]
# 启用二进制日志 可自定义文件名也可以加上路径 这个对log_bin_basename log_bin_index有影响
log-bin=mysql-bin
binlog_expire_logs_seconds=60000
max_binlog_size=300M
  • binlog_expire_logs_seconds:此参数控制二进制日志文件保留的时长,单位是秒,默认是2592000,30天。
  • max_binlog_size:控制单个二进制日志大小,当前日志文件大小超过此变量时,执行切换动作。此参数的最大和默认值是1GB,该设置并不能严格控制binlog的大小,尤其是binlog比较靠近最大值而又遇到一个比较大事务时,为了保证事务的完整性,可能 不做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束。一般情况下可采取默认值。

数据库文件最好不要与日志文件放在同一个磁盘上,这样当数据库文件所在的磁盘发生故障时,可以使用日志文件恢复数据。


方式2:临时性方式

如果不希望通过修改配置文件并重启的方式设置二进制日志的话,还可以使用如下指令,需要注意的是在mysql8中只有会话级别的设置,没有global级别的设置。

mysql> set global sql_log_bin=0;
ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION variable and can't be used with SET GLOBAL
mysql> set  sql_log_bin=0;
Query OK, 0 rows affected (0.01 sec)

③ 查看日志

当MySQL创建二进制日志文件时,先创建一个以"filename"为名称,以".index"为后缀的文件,再创建一个以"filename"为名称、以".000001"为后缀的文件。

MySQL服务重新启动一次,以".000001"为后缀的文件就会增加一个,并且后缀名称按1递增。即日志文件的个数与MySQL服务启动的次数相同。如果日志长度超过了 max_binlog_size 的上限(默认是1GB),就会创建一个新的日志文件。

查看当前的二进制日志文件列表及大小:

mysql> show binary logs;
+---------------+------------+-----------+
| Log_name      | File_size  | Encrypted |
+---------------+------------+-----------+
| binlog.000006 |   66374693 | No        |
| binlog.000007 |    8162695 | No        |
| binlog.000008 |  205361347 | No        |
| binlog.000009 |   10917409 | No        |
| binlog.000010 | 1073743498 | No        |
| binlog.000011 |  469251392 | No        |
+---------------+------------+-----------+
6 rows in set (0.21 sec)

所有对数据库的修改都会记录在binlog中。但binlog是二进制文件,无法直接查看,想要更直观的观测它就要借助mysqlbinlog命令工具了。指令如下:

mysqlbinlog "/var/lib/mysql/binlog.000011"

如果遇到如下错误:

mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4'.

尝试下面两种措施:

  • 在MySQL的配置 my.cnf 中将default-character-set=utf8mb4 修改为 character-set-server = utf8mb4,但是这需要重启MySQL服务

  • 增加加参数 --no-defaults ,mysqlbinlog --no-defaults "/var/lib/mysql/binlog.000011"
    在这里插入图片描述

执行结果可以看到,这是一个比较简单的日志文件,日志中记录了用户的一些操作,这里并没有出现具体的SQL语句,这是因为binlog关键字后面的内容是经过编码后的二进制日志。

这里面一个update语句包含如下事件:

  • Query事件,负责开始一个事务(begin)
  • Table_map事件,负责映射需要的表
  • Update_rows事件,负责写入数据
  • Xid事件,负责结束事务

下面命令将行事件以伪SQL的形式表现出来( -v 选项):

mysqlbinlog  --no-defaults -v  "/var/lib/mysql/binlog.000011"

在这里插入图片描述

前面的命令同时显式binlog格式的语句,使用如下命令可以隐藏binlog格式的语句:

mysqlbinlog  --no-defaults -v --base64-output=DECODE-ROWS "/var/lib/mysql/binlog.000011"

在这里插入图片描述

关于mysqlbinlog工具的使用技巧还有很多,例如只解析对某个库的操作或者某个时间段内的操作等。下面是几个常用语句,更多操作可以参考官方文档。

# 可查看参数帮助
mysqlbinlog  --no-defaults --help

#查看最后100行
mysqlbinlog  --no-defaults -v --base64-output=DECODE-ROWS "/var/lib/mysql/binlog.000011"|tail -100

#根据position查找
mysqlbinlog  --no-defaults -v --base64-output=DECODE-ROWS "/var/lib/mysql/binlog.000011"|grep -A 20 '4939002'

上面这种办法读取出binlog日志的全文内容比较多,不容易分辨查看到pos点信息,下面介绍一种更为方便的查询命令:

show binlog events [in 'log_name'] [from pos] [limit [offset,] row_count];
  • in ‘log_name’ :指定要查询的binlog文件名(不指定就是第一个binlog文件)
  • from pos:指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
  • limit [offset]:偏移量(不指定就是0)
  • row_count:查询总条数(不指定就是所有行)

应用举例:

# 查询第一个最早的binlog日志
show binlog events;

# 指定查询日志文件
show binlog events in 'binlog.000011';

#指定pos点
show binlog events in 'binlog.000011' from 2000;

# 从pos点开始查询100条
show binlog events in 'binlog.000011' from 2000 limit 100;

# 从pos掉开始,偏移2行(即中间跳过2行)查询100条
show binlog events in 'binlog.000011' from 2000 limit 2,100;

上面都是基于binlog的默认格式,我们可以查看binlog的格式:

mysql> show VARIABLES like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

除此之外,binlog还有2种格式,分表是Statement和Mixed。

  • Statement

每一条会修改数据的SQL都会记录在binlog中。优点是不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。

  • Row

5.1.5版本的MySQL才开始支持row level的复制,它不记录SQL语句上下文相关信息,仅保存哪条记录被修改。优点是row level的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题。

  • Mixed

从5.1.8开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro174版本新功能介绍之关闭拷贝铜皮带网络属性功能

Allegro174版本新功能介绍之关闭拷贝铜皮带网络属性功能 Allegro在172以及以下的版本的时候,拷贝铜皮的时候会自动带上被铜皮的网络属性,在升级到了174版本的时候,是可以随时关闭和打开这个功能的,如下图 除了铜皮,过孔也是可以关闭和打开这个功能的,具体操作如下 选择Se…

NOTE:2022年11月27日以后精密星历采用长命名

IGS切换到新的参考框架—IGS20,以作为其产品的基础。IGS20 与 2022 年 4 月发布的 ITRF2020 密切相关。最新的卫星和地面天线校准 igs20.atx 也将同时生效,与 IGS20 一起使用。IGS 打算从 GPS 第 2238 周(2022 年 11 月 27 日)的产…

一篇分析Linux虚拟化KVM-Qemu分析之timer虚拟化

说明: KVM版本:5.9.1QEMU版本:5.0.0工具:Source Insight 3.5, Visio 1. 概述 先从操作系统的角度来看一下timer的作用吧: 通过timer的中断,OS实现的功能包括但不局限于上图: 定时…

RootPort的completion timeout为什么不能防止MCE

PCIe split transaction协议在解释completion timeout机制前,我们首先说一下PCIe split transaction协议是什么,以及为什么PCIe要选择split transaction?Split transaction协议是从PCI-X总线的引入的一个重要特性,该传输协议替代了…

微服务 分布式配置中心Apollo详解

微服务 分布式配置中心Apollo详解1. 配置中心概述1.1 配置中心简介1.2 配置中心特点1.3 配置中心对比2. Apollo概述2.1 Apollo简介2.2 Apollo特点3. Apollo设计实现3.1 基础模型3.2 架构设计3.3 Why Eureka3.4 模块说明4. Apollo安装部署4.1 部署说明4.2 环境准备3.3 下载安装包…

JavaScript奇技淫巧:隐形字符

JavaScript奇技淫巧:隐形字符 本文,分享一种奇特的JS编程技巧,功能是:可以使字符串“隐形”、不可见! 效果展示 如下图所示,一个字符串经物别的操作之后,其长度有621字节,但内容却…

[ 数据结构 ] 查找算法--------递归实现

0 前言 查找算法有4种: 线性查找 二分查找/折半查找 插值查找 斐波那契查找 1 线性查找 思路:线性遍历数组元素,与目标值比较,相同则返回下标 /**** param arr 给定数组* param value 目标元素值* return 返回目标元素的下标,没找到返回-1*/public static int search(…

ora-39083/01917报错

报错信息: Import: Release 11.2.0.4.0 - Production on Wed Dec 7 17:59:59 2022 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production …

1、Javaweb_HTMLtable布局

web概念概述 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端程序,在远程有一个服务器端程序 * 如:QQ,迅雷.…

Linux环境下安装 java / javac

目录 1、检查虚拟机或者服务器的位数 2、下载 jdk 3、解压jdk 4、添加全局环境变量 1、检查虚拟机或者服务器的位数 安装 java / javac 其实就是下载合适版本的 jdk,我们需要先确认虚拟机或者服务器的主机信息,来下载合适版本的 jdk。 输入 uname …

maven环境变量配置(超详细!)

下载地址: 官网地址 建议不要下载在C盘!! 配置过程 1.解压下载好的压缩包 2.此电脑–右键–属性–高级系统设置–环境变量 3.新建一个系统变量(点击系统变量的新建) 变量名:MAVEN_HOME 变量值&#x…

Python深度学习基础(八)——线性回归

线性回归引言损失函数解析解公式代码实例梯度下降理论随机梯度下降的手动实现代码torch中的随机梯度下降引言 我们生活中可能会遇到形如 yw1x1w2x2w3x3byw_1x_1w_2x_2w_3x_3byw1​x1​w2​x2​w3​x3​b 的问题,其中有y为输出,x为输入,w为权…

Java设计模式中工厂模式是啥?静态工厂、简单工厂与抽象工厂,工厂方法模式又是啥,怎么用,

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 4.3 工厂模式 4.3.1 背景 若创建对象时直接new对象,则会使对象耦合严重,更换对象则很复杂 4.3.2 简单工厂 4.3.3 特点 不是一种设计模…

c语言 文件处理2 程序环境和预处理

对比函数 sprintf(把一个格式化数据转化为字符串) sscanf (从一个字符串中读一个格式化数据) struct S {char arr[10];int age;float f; };int main() {struct S s { "hello", 20, 5.5f };//把这个转化为一个字符串s…

idea调试unity里面的lua代码

前言 本人一名java后端开发,看到前端同事调试lua代码无脑print,甚为鄙视,百度加实操写一份调试unity的lua脚本文档 操作 1.安装lua lua官网下载页面 最终下载页面 2.idea安装插件 emmylua 3.idea打开unity的lua脚本 idea->file->op…

【面试题】面试如何正确的介绍项目经验

大厂面试题分享 面试题库前端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库1、在面试前准备项目描述,别害怕,因为面试官什么都不知道面试官是人,不是神,拿到你的简历的时候…

ospf双向重发布,LSA优化综合

目录实验分析ip地址划分写公网缺省路由区域0公网MGRE搭建各个区域ospf的宣告改变ospf接口工作方式和更改接口优先级ospf多进程及双向重发布减少LSA的更新量1,减少特殊区域的LSA更新量2,骨干区域的优化域间汇总域外汇总防环nat的设置实验分析 如图实际的…

VS Code 为 Clang for MSVC 配置 cmake cmake tools

介绍 在windows平台上,由于平台API差异过大,一般为linux设计的项目(POSIX兼容)无法通过MSVC的编译,而是会报非常多的头文件错误。如果要修改,工程量将巨大。Windows平台上,主要有两个类POSIX兼容…

【JavaScript】事件--总结

千锋 1.Event 对象 代表事件的状态&#xff0c;比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 div{width: 200px;height: 200px;background-color: yellow;} </style> <body><input type"text" id"username"&…

JavaScript 事件

文章目录JavaScript 事件HTML 事件常见的HTML事件JavaScript 可以做什么?JavaScript 事件 HTML 事件是发生在 HTML 元素上的事情。 当在 HTML 页面中使用 JavaScript 时&#xff0c; JavaScript 可以触发这些事件。 HTML 事件 HTML 事件可以是浏览器行为&#xff0c;也可以是…