MySQL Binlog

MySQL Binlog

MySQL Binlog

  • 介绍
  • 查看 Binlog 位点
  • 开启和关闭 Binlog
  • Binlog 的作用
  • Binlog 记录的格式
  • Binlog 的解析
  • Binlog 加密
  • Binlog 的清理
    • 根据Binlog文件名删除
    • 根据时间删除
  • Binlog 保留参数
  • Binlog 的落盘
  • Binlog 相关参数

MySQL主从复制:https://blog.csdn.net/a18792721831/article/details/146117935
MySQL Binlog:https://blog.csdn.net/a18792721831/article/details/146606305
MySQL General Log:https://blog.csdn.net/a18792721831/article/details/146607343

介绍

Binlog 包含描述数据库修改的语句,如 create , update 等数据变更语句,不会记录类似 select , show 等不修改数据的语句。

如果想记录所有的 SQL 语句,可以使用 General Log

查看 Binlog 位点

使用 show master status 查看当前Binlog的位点

image-20250310183401493

创建databases,并创建一张表

create database test;
use test;
create table t(id int, name varchar(256));

然后在查看Binlog的位点信息

image-20250310183551459

其 Position 从2427增加到 2818。

使用 show binlog events in 'mysql-bin.000004' from 2427 \G 查看从 2427 开始发生了什么操作

image-20250310183847224

创建database和table 的sql都被记录到 Binlog 中了。

试着查询一下呢

image-20250310184029054

发现执行了 select 的语句,但是 Position 并没有增加。

开启和关闭 Binlog

开启Binlog ,需要在配置文件中的 [mysqld]中加上如下语句:

log-bin = /data/mysql/binlog/mysql-bin

表示Binlog的存放路径为/data/mysql/binlog 文件名为mysql-bin后接Binlog的序列号

比如 my.cfg文件如下:

[mysqld]
server_id=100
log_bin=/var/lib/mysql-bin/mysql-bin
binlog_format=row
plugin-load-add=mysql_native_password.so
authentication_policy=mysql_native_password

我是使用docker 启动的,挂载如下:

docker run \
--name master \
-e MYSQL_ROOT_PASSWORD=master \
-v /data/mysql/master/log:/var/log/mysql \
-v /data/mysql/master/data:/var/lib/mysql \
-v /data/mysql/master/conf:/etc/mysql/conf.d \
-v /data/mysql/master/binlog:/var/lib/mysql-bin \
-p 3106:3306 \
-d \
mysql:8.0

表示将 容器内的 /var/lib/mysql-bin 目录挂载到/data/mysql/master/binlog目录,在配置文件中指定Binlog日志存储目录是 /var/lib/mysql-bin目录,文件名是 mysql-bin后接序列号

Clipboard_Screenshot_1741603687

为了跟踪使用了那些Binlog文件,mysqld还创建了一个Binlog索引文件,其中包含Binlog文件的名称。默认情况下,该名称与Binlog文件具有相同的基本名称,扩展名为.index。比如上面的 mysql-bin.index

image-20250311142515832

如果没有指定Binlog的文件名和路径,那么在mysqld中的配置为空

log-bin

默认存放在datadir下,Binlog的文件名为主机名后接 Binlog 的序列号。

一般建议指定一个基本名称,防止更改主机名时出现 Binlog 的文件名与之前不一致的现象。

关闭 Binlog, 需要在配置文件中加上

skip_log_bin

或者

disable_log_bin

如果要关闭当前会话的 Binlog,可以执行如下语句

set sql_log_bin=0;

Binlog 的作用

复制:主库的变更先写入Binlog,然后传到从库进行回放。

灾备:当误操作后,可以先把全备导入某个新的实例中,然后通过全备时间点到误操作中间的 Binlog 解析出所有事务(排除误操作的事务),并在新实例中执行这些事务,达到恢复到误操作前一刻的状态。

Binlog 记录的格式

Binlog 可以设置为以下几种日志格式

  • Statement(基于SQL语句的格式):每条会修改数据的SQL语句都会记录在 Binlog 中,不需要记录每行的变化。
  • Row(基于行):会非常清楚地记录每行数据被修改的细节。
  • Mixed(混合模式):以上两种格式的混合采用,默认采用的 statement 格式保存Binlog,statement格式无法准确复制的操作可以使用row格式保存Binlog。
日志格式优点缺点
statement日志量少,节约IO,性能高在主从复制中可能会导致主从数据不一致,比如使用了不确定函数,UUID()函数等等
row主从数据基本一致,支持闪回日志量多
mixed日志量少,节约IO,性能高,解决了statement格式部分数据不一致的情况不支持闪回,不分高可用架构不支持该格式,不方便将数据同步到其他类型的数据库,

Binlog 记录的格式由参数 binlog_format 控制,如果要设置为 row格式,则在 [mysqld] 中加入如下语句

binlog_format=row

当然也支持动态修改,修改参数binlog_format的全局值

set global binlog_format='row';

修改参数binlog_format的会话级别的方法:

set session binlog_format='row';

image-20250327191714860

image-20250327191823940

image-20250327191906986

image-20250327191937754

image-20250327192021973

Binlog 的解析

Binlog 文件不能直接查看,需要通过 mysqlbinlog 工具解析。

比如在 row 格式下,解析 Binlog 的方法

首先查看binlog_format是否为 row

image-20250327193658060

首先查看位点

image-20250327193729589

文件index=6,pos=157

创建一个表

image-20250327193807721

创建一个表,并且插入一行数据后,binlog的index=6,但是pos=362

接着解析binlog文件

mysqlbinlog --start-position=157 mysql-bin.000006 -vv > ./log

image-20250327194322704

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#250327 19:36:22 server id 100  end_log_pos 126 CRC32 0xf96205bf        Start: binlog v 4, server v 8.0.41 created 250327 19:36:22 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
NjjlZw9kAAAAegAAAH4AAAABAAQAOC4wLjQxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA2OOVnEwANAAgAAAAABAAEAAAAYgAEGggAAAAICAgCAAAACgoKKioAEjQA
CigAAb8FYvk=
'/*!*/;
# at 157
#250327 19:37:52 server id 100  end_log_pos 234 CRC32 0xb65c3b6b        Ignorable
# Ignorable event type 34 (MySQL Anonymous_Gtid)
# at 234
#250327 19:37:52 server id 100  end_log_pos 362 CRC32 0xddef90fd        Query   thread_id=8     exec_time=0     error_code=0
use `mysql`/*!*/;
SET TIMESTAMP=1743075472/*!*/;
SET @@session.pseudo_thread_id=8/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table test_t(name varchar(256))
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

也可以直接 mysqlbinlog mysql-bin.000006

image-20250327194456064

Binlog 加密

从Mysql 8.0.14 开始,可以对 Binlog 文件和中继日志文件进行加密,从而保护敏感数据。

可以在配置文件的[mysqld]中加上如下语句开启 Binlog 加密

early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql/keyring
binlog_encryption=on

也可以通过select @@binlog_encryption查看

image-20250327194808777

修改[mysqld]

image-20250327200129300

再次查看

image-20250327200205898

使用 show binary logs; 查看

image-20250327200229356

可以发现最新的 binlog encryption 已经变成yes了

第一次配置过加密的插件后,后面可以通过 set global binlog_encryption='off';关闭或者set global binlog_encryption='on';开启

image-20250327200502553

image-20250327200922428

从上图可以看出,mysql-bin.000009 文件是加密,使用mysqlbinlog解析加密的binlog文件

image-20250327201111292

已经解析不出来结果了。

应该使用MySQL的用户密码进行解析才行

mysqlbinlog --read-from-remote-server \
-hx.x.x.x \
-Px \
-uu \
-pp \
--start-position=157 \
mysql-bin.000009 -vv >./log3

查看log3的内容

# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 157
#250327 20:08:16 server id 100  end_log_pos 0 CRC32 0x07906a17 	Start: binlog v 4, server v 8.0.41 created 250327 20:08:16
BINLOG '
sD/lZw9kAAAAegAAAAAAAAAAAAQAOC4wLjQxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEwANAAgAAAAABAAEAAAAYgAEGggAAAAICAgCAAAACgoKKioAEjQA
CigAARdqkAc=
'/*!*/;
# at 157
#250327 20:08:31 server id 100  end_log_pos 234 CRC32 0x17b798d5 	Anonymous_GTID	last_committed=0	sequence_number=1	rbr_only=no	original_committed_timestamp=1743077311135115	immediate_commit_timestamp=1743077311135115	transaction_length=206
# original_commit_timestamp=1743077311135115 (2025-03-27 20:08:31.135115 CST)
# immediate_commit_timestamp=1743077311135115 (2025-03-27 20:08:31.135115 CST)
/*!80001 SET @@session.original_commit_timestamp=1743077311135115*//*!*/;
/*!80014 SET @@session.original_server_version=80041*//*!*/;
/*!80014 SET @@session.immediate_server_version=80041*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 234
#250327 20:08:31 server id 100  end_log_pos 363 CRC32 0x7d250931 	Query	thread_id=10	exec_time=0	error_code=0	Xid = 100
use `mysql`/*!*/;
SET TIMESTAMP=1743077311/*!*/;
SET @@session.pseudo_thread_id=10/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
/*!80013 SET @@session.sql_require_primary_key=0*//*!*/;
create table test_t1(name varchar(256))
/*!*/;
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*/;

创建表 test1 的sql成功被解析。

Binlog 的清理

对于一个繁忙的MySQL 实例,其 Binlog 增长也是比较快的,因此,需要设置其保留天数,如果磁盘即将满,那么可能还要单独删除历史Binlog。

根据Binlog文件名删除

可以使用purge binary logs 语句来删除指定 Binlog 的文件名或指定时间之前的 Binlog 文件

首先使用show binary logs查看

image-20250328164722647

然后使用 purge binary logs to 'mysql-bin.000004'删除 1~3 的Binlog文件

image-20250328164842418

直接在mysql服务的binlog目录下查看

image-20250328164910321

也是没有了

根据时间删除

直接在mysql的服务端查看Binlog文件的详细信息

image-20250328165017505

假设我们删除 20点之前的Binlog文件,执行purge binary logs before '2025-03-27 20:00:00';

image-20250328165309545

好像和预期有点不符,不过还是可以看到是可以删除的。

Binlog 保留参数

一般不会直接删除Binlog文件,而是通过设置expire_logs_days参数或binlog_expire_logs_seconds参数。

expire_logs_days参数定义了日志保留天数,binlog_expire_logs_seconds参数定义了日志保留秒数。

MySQL 8.0 建议设置binlog_expire_logs_seconds参数,在未来版本中可能会废除expire_logs_days参数。

image-20250328165803855

image-20250328165851969

expire_logs_days为0表示永远不删除,expire_logs_days默认值为0

binlog_expire_logs_seconds默认为 2592000秒,等于30天,也就是默认是保存30天

假设将binlog_expire_logs_seconds设置为1小时,也就是3600s,那么之前保留的Binlog文件会被删除

image-20250328170130371

image-20250328170416098

不管设置为多少,不会自动删除

需要使用flush logs触发生效

image-20250328170521962

Binlog 的落盘

Binlog 同步到磁盘的频率由 sync_binlog 参数控制。sync_binlog参数大致有这几种配置

  • sync_binlog=0:禁用MySQL服务将Binlog 同步到磁盘的功能,是由操作系统控制Binlog的刷盘。在这种情况下,性能比较好,但是当操作系统崩溃时可能会丢失部分事务。
  • sync_binlog=1:每个事务都会同步到磁盘。这是最安全的设置,但是磁盘写入次数的增加可能会导致性能下降
  • sync_binlog=N:表示每N个事物Binlog同步一次到磁盘。当操作系统崩溃时,服务器提交的事务可能没有被刷新到Binlog中,此时可能会丢失部分事务,虽然设置比较大的值可以提高性能,但是数据丢失的风险也会增加。

image-20250328171003002

可以通过 set global sync_binlog=3;调整

image-20250328171107662

Binlog 相关参数

  1. max_binlog_size:单个Binlog文件大小的最大值

    image-20250328171815372

  2. log-slave-update:从库从主库接收的更新是否记录到从库自身的Binlog中,如果从库后面又接了从库,或者在从库上做备份,或者MySQL 5.6 主从复制使用了GTID模式,那么建议开启这个参数

  3. binlog-do-db:后面接库名,表示当前数据库只记录该参数设置的库的 Binlog ,其他库都不记录

  4. binlog-ignore-db:后面接库名,表示当前数据库不记录该参数设置的库的Binlog,其他库都记录

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十四届蓝桥杯省赛电子类单片机学习记录(客观题)

01.一个8位的DAC转换器,供电电压为3.3V,参考电压2.4V,其ILSB产生的输出电压增量是(D)V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 解析: ILSB(最低有效位)的电压增量计算公式…

【随手记】支持多模态输入的 AI Chatbot App

一、Streamlit 1、Streamlit开发文档 官方文档:https://docs.streamlit.io/ 中文文档:https://blog.csdn.net/weixin_44458771/article/details/135495928 2、Streamlit命令行启动 pip install streamlit streamlit run app.py --server.port 85013…

为什么大模型在 OCR 任务上表现不佳?

编者按: 你是否曾经用最先进的大语言模型处理企业文档,却发现它把财务报表中的“$1,234.56”读成了“123456”?或者在处理医疗记录时,将“0.5mg”误读为“5mg”?对于依赖数据准确性的运营和采购团队来说,这…

关于ArcGIS中加载影像数据,符号系统中渲染参数的解析

今天遇到一个很有意思的问题,故记录下来,以作参考和后续的研究。欢迎随时沟通交流。如果表达错误或误导,请各位指正。 正文 当我们拿到一幅成果影像数据的时候,在不同的GIS软件中会有不同效果呈现,但这其实是影像是…

智能舵机:AI融合下的自动化新纪元

在自动化的浪潮中,智能舵机以其独特的魅力和卓越的性能,正引领着自动化产业迈向新的高度。今天,让我们一起走进智能舵机的世界,感受AI技术为其带来的无限可能。 一、智能舵机:自适应控制的先锋 智能舵机,…

计算机二级WPS Office第四套电子表格

解题过程 排名的函数有三个:rank函数、rank.avg函数、rank.eq函数

【数学建模】(启发式算法)蚁群算法(Ant Colony Optimization)的详解与应用

蚁群算法(Ant Colony Optimization)详解与应用 文章目录 蚁群算法(Ant Colony Optimization)详解与应用前言1. 蚁群算法的生物学基础2. 蚁群算法的基本原理2.1 算法框架2.2 状态转移规则2.3 信息素更新规则 3. 蚁群算法的实现4. 蚁群算法的改进4.1 MAX-MIN蚁群系统(MMAS)4.2 精…

基于Springboot的网上订餐系统 【源码】+【PPT】+【开题报告】+【论文】

网上订餐系统是一个基于Java语言和Spring Boot框架开发的Web应用,旨在为用户和管理员提供一个便捷的订餐平台。该系统通过简化餐饮订购和管理流程,为用户提供快速、高效的在线订餐体验,同时也为管理员提供完善的后台管理功能,帮助…

使用idea开发spark程序

新建scala 项目 创建lib目录 将spark jars/ 路径下所有jar 复制到 lib目录 添加依赖 创建scala 程序 package sparkimport org.apache.spark.{SparkConf, SparkContext}object WordCount {def main(args: Array[String]): Unit {val conf new SparkConf().setAppName(&q…

CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案

计算机该如何求解三角函数?或许你的第一印象是采用泰勒展开,或者采用多项式进行逼近。对于前者,来回的迭代计算开销成本很大;对于后者,多项式式逼近在较窄的范围內比较接近,超过一定范围后,就变…

无需docker三步安装deepseek可视化操作软件-Open-WebUI

在以前安装Open-WebUI时,需要通过docker安装, 针对小白来讲呢有些麻烦, 因此这里推荐使用python环境安装Open-WebUI,简单快捷上手快! 1. Mac安装python3.11 以上的环境, windows同学直接官网下载安装包msi,双击安装即可1.1 Mac直接安装 python3.11brew install pyt…

3DGS较真系列

目录 引言 三维高斯飞溅(3DGS) 总体流程 SFM算法 1.特征提取: 2.特征匹配: 3.图像对优选: 4.相机位姿估计及空间点坐标获取: 5.三角化确立新图像地图点: 6.重建场景及其约束: 3DGS 1.捏雪球 2…

【计网】网络、互连网、互联网的认识和区分

一、些杂乱的知识点: 1.Internet是由数量极大的各种计算机网络连接起来的。 2.世界上最大的计算机网络Internet叫互联网(互联网 ! 互连网)。 3.互联网的两个基本特点: (1)互通性&#xff1a…

手机零售行业的 AI 破局与创新降本实践 | OceanBase DB大咖说

OceanBase《DB 大咖说》第 20 期,我们邀请了九机与九讯云的技术总负责人,李远军,为我们分享手机零售企业如何借力分布式数据库OceanBase,赋能 AI 场景,并通过简化架构实现成本管控上的突破与创新。 李远军于2016年加入…

高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系

一句话总结 在高并发金融系统中,审计方案设计需平衡"观测粒度"与"系统损耗",通过双AOP实现非侵入式采集,三表机制保障操作原子性,最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源,并按下电源开关,系统即启动,在启动过程中,系统会显示下图中的开机画面,它们分别是 Android 系统启动时的 Logo 画面: 最后会显示如下解锁画面: 2.2 命令终端 将…

Linux云计算SRE-第二十一周

构建单节点prometheus,部署node exporter和mongo exporter。构建kibana大盘。包含主机PU使用率,主机MEM使用率,主机网络包速度。mongo db大盘,包含节点在线状态,读操作延迟等 一、实验环境准备 - 节点信息&#xff1…

蓝桥杯 - 简单 - 产品360度展示

介绍 在电子商务网站中,用户可以通过鼠标或手势交互实现 360 度全方位查看产品,提升用户体验。现在需要你设计一个 Pipeline 管道函数,用于控制 360 度展示产品的动画序列,通过管道连接各个动画步骤,使产品以流畅的方…

【Rust基础】使用LanceDB构建高性能以图搜图服务

简介 最近使用LanceDB构建了一个以图搜图服务,用于相似图片检索,支持以下功能: 搜索 支持向量搜索,查找相似图片支持通过item_id搜索精确搜索 数据管理 支持添加数据、批量导入CSV或JSON数据支持已有数据修改、删除 API 提供HTT…

蓝桥杯备考:模拟算法之排队接水

简单的模拟就行了&#xff0c;把他们的时间排序&#xff0c;时间最少的先上&#xff0c;然后算出每个人的等待时间的平均值 #include <iostream> #include <algorithm> using namespace std; const int N 1e310; int n; double sum; double ret; struct node{int…