先来聊聊MySQL的binlog文件解析

看腻了文章就来听听视频讲解吧:https://www.bilibili.com/video/BV1F94y1s7xe/

简介

MySQL的binlog日志是用来记录MySQL对数据库有变更操作的记录,包括DDL和DML,除了select或show等查询类语句不会被binlog日志记录,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

binlog文件类型:

  • 二进制索引文件(后缀名为.index)
  • 日志文件(后缀名为.00000*),记录数据库所有的DDL和DML(除了查询语句select)语句事件

image.png

用途:
主要用于数据库的主从复制和数据恢复

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

MySQL binlog的三种工作模式

  • statement格式,生产环境不建议使用
    优点:不需要记录每一行的变化,减少了binlog日志量,节约I/O,提高性能
    缺点:使用特殊函数或跨库操作时容易丢失数据
  • row格式,生产环境建议使用
    优点:记录每行数据被修改的情况,安全性高
    缺点:会产生大量binlog,网络开销也较大
  • mixed格式,生产环境不建议使用
    MySQL5.1的一个过渡版本,DDL语句会记录成statement,DML会记录成row

binlog相关参数

-- binlog开关
mysql> show variables like 'log_bin%';
+---------------------------------+-------------------------------+
| Variable_name                   | Value                          
+---------------------------------+-------------------------------+
| log_bin                         | ON                              
| log_bin_basename                | /mysqldata/data/mysql-bin      
| log_bin_index                   | /mysqldata/data/mysql-bin.index
| log_bin_trust_function_creators | OFF                            
| log_bin_use_v1_row_events       | OFF                             
+---------------------------------+-------------------------------+
5 rows in set (0.00 sec)
-- binlog工作模式
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
-- binlog文件大小,1073741824/1024/1024/1024=1GB
mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)
-- 安全参数 :binlog过期天数自动清理,建议全备周期2倍
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
-- 查看biglog日志文件所在点,最后一个为当前binlog日志文件
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000012 |      8736 |
| mysql-bin.000013 |      3087 |
+------------------+-----------+
2 rows in set (0.00 sec)

-- 重新生成一个binlog日志
mysql> flush logs;
-- 重置(清空)所有binlog日志(慎用)
mysql> reset master;

mysqlbinlog解析工具

mysqlbinlog解析工具是安装MySQL时自带的,一款用于将MySQL的binlog日志转换成“SQL语句”,默认情况下binlog日志是二进制文件,无法直接查看。

# 解析binlog文件,打印误操作SQL前后各10行,选择要恢复的结束位点 # at xxoo
mysqlbinlog -v -v mysql-bin.000002 | grep "DROP xxoo" -A 10 -B 10

# 统计DML操作频繁的表(ROW模式统计的是行数,statement模式统计的是次数)
[root@db01 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v -v mysql-bin.000012 | awk '/###/{if($0~/UPDATE|INSERT|DELETE/)count[$2" "$NF]++}END{for(i in count)print i,"\t",count[i]}' | column -t | sort -k3nr | more
INSERT  `mdb`.`t12`  9
UPDATE  `mdb`.`t12`  5
DELETE  `mdb`.`t12`  3

MySQL的binlog系列和奇技操作:

先来聊聊MySQL的binlog文件解析
接着说说mysqlbinlog解析工具如何做数据恢复
再来谈谈如何从binlog文件恢复误update的数据,模拟Oracle的闪回功能
接着聊聊如何从binlog文件恢复误delete的数据,模拟Oracle的闪回功能
借用binlog2sql工具轻松解析MySQL的binlog文件,再现Oracle的闪回功能
再来介绍另一个binlog文件解析的第三方工具my2sql
顺带来聊聊MySQL误删ibdata数据文件的恢复
MySQL大表直接复制文件的copy方式

### 解析 MySQL 8.0.37 Binlog 文件 对于 MySQL 8.0.37 版本中的二进制日志(Binlog),可以通过 `mysqlbinlog` 工具来进行解析。此工具能够读取并解释由 MySQL 数据库产生的二进制日志文件,将其转换成可读的文字形式。 为了更方便地处理这些日志信息,建议先通过命令行指定时间范围和其他参数来过滤所需的数据,并将输出重定向到一个 SQL 文件中以便后续分析: ```bash /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 ``` 上述命令会从特定时间段内的 binlog 日志中提取记录,并保存至 `/tmp/binlog007.sql` 文件里[^1]。 当环境变量设置正确时,可以直接调用 `mysqlbinlog` 而不需要提供完整路径。这通常涉及到修改用户的 shell 配置文件以包含 MySQL 的安装位置: ```bash export MYSQL_HOME="/usr/local/mysql-8.0.37" export PATH="$PATH:$MYSQL_HOME/bin" ``` 完成以上配置之后,就可以简化命令为仅需输入 `mysqlbinlog` 即可执行相同操作[^2]。 值得注意的是,在某些情况下可能还需要考虑其他选项如 `--read-from-remote-server` 来连接远程数据库实例获取其上的 binlog;或者调整 `-v` 参数的数量 (`-vv`) 增加输出细节程度等具体需求下的定制化使用方式。 #### 关于 Binlog 格式的说明 MySQL 支持三种不同的复制格式:STATEMENT、ROW 和 MIXED。每种模式下生成的日志条目有所不同,因此理解所使用的服务器配置非常重要。默认情况下,MySQL 8 使用 ROW 模式,这意味着每一行更改都会被记录下来而不是整个语句本身。这对于精确回滚或审计非常有用,但也可能导致更大的日志体积。 在解析过程中,如果遇到难以解读的部分,则可能是由于启用了 GTID (全局事务 ID),它会在每个事件前附加额外的信息用于跨节点同步。此时应查阅官方文档了解更多关于 GTID 处理的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值