MySQL Binlog 日志查看方法及查看内容解析

 

一、Binlog 日志概述

Binlog(二进制日志)记录了 MySQL 数据库执行的所有更改数据的操作,包括INSERT、UPDATE、DELETE等。它对于数据恢复、主从复制以及审计等方面有着至关重要的作用。

二、查看 Binlog 日志方法

开启 Binlog 日志功能

默认情况下,MySQL 的 Binlog 日志功能可能未开启。要开启它,需要修改 MySQL 的配置文件(通常是my.cnf或my.ini)。在[mysqld]部分添加或修改以下配置:

log-bin=mysql-bin

这里mysql-bin是日志文件名前缀,重启 MySQL 服务后,Binlog 日志功能即开启。

查看当前正在使用的 Binlog 日志文件

使用以下 SQL 命令可以查看当前 MySQL 正在写入的 Binlog 日志文件名:

SHOW MASTER STATUS;

执行结果类似如下:

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000003 | 1234 | | | |

+------------------+----------+--------------+------------------+-------------------+

其中File列显示的mysql-bin.000003就是当前正在使用的 Binlog 日志文件名,Position表示当前日志写入的位置。

查看 Binlog 日志内容

  1. 使用 mysqlbinlog 工具
    • 该工具随 MySQL 安装包一同提供。在命令行中,使用以下语法查看 Binlog 日志内容:
mysqlbinlog [选项] binlog文件名

例如,要查看mysql-bin.000003的内容,可以执行:

mysqlbinlog mysql-bin.000003
  • 常用选项:
    • --start-position和--stop-position:用于指定查看日志的位置范围。例如,只查看从位置 100 到 200 的内容:
mysqlbinlog --start-position=100 --stop-position=200 mysql-bin.000003
  • --start-datetime和--stop-datetime:根据时间范围查看日志。如查看 2025 - 04 - 01 10:00:00 到 2025 - 04 - 01 11:00:00 之间的日志:
mysqlbinlog --start-datetime="2025-04-01 10:00:00" --stop-datetime="2025-04-01 11:00:00" mysql-bin.000003
  1. 在 MySQL 客户端中通过SHOW BINLOG EVENTS命令
    • 语法如下:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
  • 示例:查看mysql-bin.000003从位置 50 开始的 10 条日志事件:
SHOW BINLOG EVENTS IN'mysql-bin.000003' FROM 50 LIMIT 0, 10;

三、Binlog 日志内容解析

Binlog 日志包含多个事件(Event),每个事件记录了一次数据库操作。常见的事件类型及解析如下:

  1. Format_desc 事件
    • 通常是 Binlog 日志的第一个事件,用于描述该 Binlog 日志的格式信息,包括日志版本、创建时间等。例如:
#120505 14:31:06 server id 1 end_log_pos 123 CRC32 0xabcdef01 Start: binlog v 4, server v 5.7.20 created 120505 14:31:06 at startup
  • 其中#120505 14:31:06是事件发生时间,server id 1是服务器 ID,end_log_pos 123表示该事件结束的位置,CRC32 0xabcdef01是 CRC32 校验和。
  1. Query 事件
    • 记录了一条 SQL 查询语句,通常是INSERT、UPDATE、DELETE等更改数据的操作。例如:
#120505 14:32:00 server id 1 end_log_pos 256 CRC32 0x12345678 Query thread_id=3 exec_time=0 error_code=0

use testdb;

SET TIMESTAMP=1336223520;

INSERT INTO users (name, age) VALUES ('John', 25);
  • #120505 14:32:00是事件发生时间,server id 1是服务器 ID,end_log_pos 256是事件结束位置。thread_id=3表示执行该查询的线程 ID,exec_time=0是查询执行时间(秒),error_code=0表示执行无错误。下面的use testdb;指定了操作的数据库,SET TIMESTAMP=1336223520;设置了时间戳,最后是具体的INSERT语句。
  1. Row_event 系列事件(如 Table_map 事件、Write_rows 事件、Update_rows 事件、Delete_rows 事件)
    • 在基于行模式(row - based)的 Binlog 记录中常见。
    • Table_map 事件:用于映射表的结构信息,例如:
#120505 14:33:00 server id 1 end_log_pos 300 CRC32 0x87654321 Table_map: `testdb`.`users` mapped to number 123

这里表示testdb数据库中的users表被映射为编号 123。

  • Write_rows 事件:记录了插入数据的操作。例如:
#120505 14:33:10 server id 1 end_log_pos 350 CRC32 0x23456789 Write_rows: table id 123 flags: STMT_END_F

### INSERT INTO `testdb`.`users`

### SET

### @1=1 /* INT meta=0 nullable=0 is_null=0 */,@2='Jane' /* VARCHAR(50) meta=50 nullable=0 is_null=0 */,@3=30 /* INT meta=0 nullable=0 is_null=0 */

表示向testdb.users表插入了一条数据,数据的具体字段值以@符号表示。

  • Update_rows 事件:记录更新数据的操作,会包含更新前和更新后的行数据。例如:
#120505 14:34:00 server id 1 end_log_pos 400 CRC32 0x34567890 Update_rows: table id 123 flags: STMT_END_F

### UPDATE `testdb`.`users`

### WHERE

### @1=1 /* INT meta=0 nullable=0 is_null=0 */,@2='Jane' /* VARCHAR(50) meta=50 nullable=0 is_null=0 */,@3=30 /* INT meta=0 nullable=0 is_null=0 */

### SET

### @1=1 /* INT meta=0 nullable=0 is_null=0 */,@2='Jane Doe' /* VARCHAR(50) meta=50 nullable=0 is_null=0 */,@3=31 /* INT meta=0 nullable=0 is_null=0 */
  • Delete_rows 事件:记录删除数据的操作,包含被删除行的信息。例如:
#120505 14:35:00 server id 1 end_log_pos 450 CRC32 0x45678901 Delete_rows: table id 123 flags: STMT_END_F

### DELETE FROM `testdb`.`users`

### WHERE

### @1=1 /* INT meta=0 nullable=0 is_null=0 */,@2='Jane Doe' /* VARCHAR(50) meta=50 nullable=0 is_null=0 */,@3=31 /* INT meta=0 nullable=0 is_null=0 */

通过上述方法和对内容的解析,能够深入了解 MySQL 数据库中数据的变化历史,为数据库的维护和故障排查提供有力支持。

### ARP协议工作原理 ARP (Address Resolution Protocol) 是一种用于局域网中解析 MAC 地址的协议[^2]。当一台设备需要与另一台位于同一网络中的设备通信时,发送方会广播一个 ARP 请求报文来询问目标 IP 对应的物理地址是什么。这个请求包含了源主机自己的 IP 和硬件地址以及目的主机的 IP 地址。 一旦拥有被查询 IP 地址的目标机器收到此广播消息,则该机会回应一个包含其 MAC 地址的信息给发起者。这样,原始发件人就可以知道如何通过第二层数据链路层直接寻址到达目的地了。此外,为了提高效率并减少重复查找的时间开销,每次成功获取到映射关系之后都会将其存储在一个称为 ARP 缓存表里的地方一段时间[^3]。 #### ARP 协议交互过程简化描述如下: 1. **发出 ARP 请求** 发送端构建一个 ARP 查询包,其中含有自身的 IP 及 MAC 地址,并指明想要获得哪个 IP 所属节点的 MAC 地址; 2. **等待响应** 此 ARP 请求会被扩散至整个本地子网内的所有计算机上;只有那个具有匹配 IP 的接收者才会做出反应; 3. **接收到 ARP 应答** 如果有符合条件的目的站点存在的话,那么它就会回复一条携带自己真实硬件地址的数据帧回传给提问者; 4. **更新 ARP 表项** 提问者的操作系统将新得到的信息加入到内部维护着的一张临时性的对照列表——即所谓的 ARP Cache 中去以便将来快速访问相同对象而不必再次经历上述繁琐的过程。 以下是 ARP 协议工作的简单图解表示形式: ```mermaid graph LR; A[HostA: 192.168.0.1, MAC_A] -->|Broadcast ARP Request| B((Subnet Broadcast)); C[HostC: 192.168.0.2, MAC_C]) -.-> |Listen but not respond|B; D[HostD: 192.168.0.3, MAC_D)] --|Unicast ARP Reply to HostA| A; ``` 在此图表中: - `HostA` 向所在子网上所有的成员广播了一个 ARP 请求。 - `HostC` 收到了这条信息但由于不是要找的对象所以保持沉默。 - 被指定为目标 (`192.168.0.3`) 的 `HostD` 则单独地向 `HostA` 返回了自己的实际硬件地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值