当前位置: 代码迷 >> 综合 >> 【Mysql】- binlog 日志解析
  详细解决方案

【Mysql】- binlog 日志解析

热度:28   发布时间:2023-12-21 07:36:27.0

binary log 简介

二进制日志包含描述数据库更改的“事件”,例如表创建操作或表数据更改。它还包含可能已更改的语句的事件(例如:DELETE不匹配任何行),除非使用基于行的日志记录。二进制日志还包含有关每条语句使用更新数据多长时间的信息。二进制日志有两个重要用途:

  • 对于复制,复制源服务器上的二进制日志提供了要发送到副本的数据更改的记录。将源服务器二进制日志中包含的事件发送到其副本,副本执行这些事件以进行与源上相同的数据更改。

  • 某些数据恢复操作需要使用二进制日志。恢复备份后,将重新执行备份后记录的二进制日志中的事件。这些事件使数据库从备份点开始更新。

环境准备

  • Ubuntu 18.04.2 LTS
  • mysql 5.7.28

更改配置

添加如下配置 开启binlog

[mysqld]
...
server-id=123123
log-bin=/var/lib/mysql/mysql-bin # 日志文件位置及前缀 
binlog-format=ROW #  日志格式 [MIXED|STATEMENT|ROW]

操作数据

# 创建数据库
create database test_db
create database test2_db# 分别创建表并插入数据
CREATE TABLE `cms_help` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`category_id` bigint(20) DEFAULT NULL,`icon` varchar(500) DEFAULT NULL,`title` varchar(100) DEFAULT NULL,`show_status` int(1) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`read_count` int(1) DEFAULT NULL,`content` text,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='帮助表';# 插入数据
INSERT INTO cms_help(category_id)  VALUES (111),(222),(333),(444);
# 执行查询
SELECT * FROM cms_help;
# 执行删除 匹配行
DELETE FROM cms_help WHERE id = 2;
# 执行删除 不匹配任何行
DELETE FROM cms_help WHERE id = 2;
# 执行更新
UPDATE cms_help SET  show_status = 1 WHERE id = 3;
# 执行更新 不匹配行
UPDATE cms_help SET  show_status = 1 WHERE id = 2;
# 执行alert table
ALTER TABLE `cms_help` CHANGE COLUMN `title` `title_t` varchar(100);
# 执行drop
drop table cms_help;

查看binlog信息

show binary logs;

在这里插入图片描述

查看binlog

我们采用官方提供的mysqlbinlog对文件进行查看

mysqlbinlog /var/lib/mysql/mysql-bin.000001  --base64-output=decode-rows -vv --skip-gtids=true  | grep -E "UPDATE cms_help|SELECT * FROM|INSERT INTO cms_help|DELETE FROM cms_help|CREATE TABLE \`cms_help\`|alter"
  • --base64-output=decode-rows : 声明二级制文件格式化格式 后面加上–verbose可将事件解码为带注释的伪SQL语句
  • --verbose: -v 重组行事件之外的伪SQL语句, -vv重组包括行事件和statement事件的伪sql语句
  • --skip-gtids=true: 不保留全局事务标识符,而是让服务器像执行新事务一样执行事务。

格式化查看结果如下:
在这里插入图片描述

由图中展示可知,binary log记录了对表的增删改以及数据行的增删改,且在删改行无匹配行时不进行记录,改表时无匹配行时有记录。

除此之外还有很多需要注意的点,比如--binlog-do-db=db_name设置记录指定数据库时候的跨库记录问题,mysqlbinlog --database指定数据库打印,是仅适用于没有基于行的事件的BINLOG等。

参考链接:https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html

  相关解决方案