MySQL8.0 binlog进阶

news2025/7/17 17:35:33

MySQL8.0经过这几年的操揉磨治,已经上升到海平面了。其中binlog也悄然无声带来了不一样的变化。高可用核心复制基础binlog变化更应该进一步了解。从参数入手,了解带来的变化。

slave回放算法

slave_rows_search_algorithms
当使用基于 row-based复制格式的副本应用UPDATE或DELETE操作时,它必须在相关表中搜索匹配的行。用于执行此过程的算法使用表的一个索引作为首选执行搜索,如果没有合适的索引则

  • 5.7使用表扫描(默认值:TABLE_SCAN,INDEX_SCAN)
  • 8.0使用哈希表(默认值:INDEX_SCAN,HASH_SCAN)。

该算法首先评估表定义中的可用索引,以确定是否有任何合适的索引可以使用,如果有多种可能性,则判断哪个索引最适合操作。该算法忽略以下类型的索引:

1.全文索引
2.隐藏索引
3.计算索引
4.多值索引
5.包含的event语句中,不包含索引字段(跟记录binlog内容有关,参数对应binlog_row_image)

记录语句引用如果有合适的索引,则从候选索引中选择一个索引,其优先级顺序如下:

1.主键。
2.唯一的索引,其中索引中的每一列都有一个NOT NULL属性。如果有多个这样的索引可用,
  算法将选择这些索引中最左边的一个。
3.其他指数。如果有多个这样的索引可用,算法将选择这些索引中最左边的一个。

如算法无法找到合适的索引,或者只能找到非唯一的索引或包含空值的索引,则使用哈希表来帮助识别表记录。

该算法创建一个哈希表,其中包含UPDATE或DELETE操作中的行,键作为行的完整前图像。然后,算法遍历目标表中的所有记录。对于目标表中的每条记录,它确定该行是否存在于散列表中。如果在哈希表中找到该行,则更新目标表中的记录,并从哈希表中删除该行。当目标表中的所有记录都被检查后,算法验证哈希表现在是否为空。如果哈希表中还有任何不匹配的行,算法返回错误ER_KEY_NOT_FOUND并停止复制应用程序线程。

可以说到主从复制架构下从库回放机制中,存在唯一性质的键,保持之前一致。如无主键的情况,8.0版本已经脱离全表扫描的范围。这种情况利和弊两者兼容,不用说hash算法,对性能来说是最优的,并且在所有场景下都能正确工作。

binlog清除机制

  • binlog_expire_logs_seconds
    binlog可以以秒为单位进行清理,之前参数是按照expire_logs_days天为删除,有时因1天当中,可能会生成几百G的binlog日志,导致空间不够用,手动或脚本清理。现在不需要那麻烦。更贴合现状的解决方案。

  • binlog_expire_logs_auto_purge
    binlog用于控制日志自动清理机制,MySQL 8.0.29开始,可以通过将binlog_expire_logs_auto_purge系统变量设置为OFF来禁用binlog的自动清除。这优先于binlog_expire_logs_seconds的任何设置。

按照代码注释记录:expire_logs_days准备废弃,binlog_expire_logs_auto_purge 和binlog_expire_logs_seconds 需要配合使用。

    3  Warning	1287	'@@expire_logs_days' is deprecated and will be removed 
    in a future release. Please use binlog_expire_logs_seconds instead.


# ASSERT: If binlog_expire_logs_auto_purge is set to ON, then the server
#         MUST purge automatically binary log files according to the
#         binlog_expire_logs_seconds setting.
#

#
# ASSERT: If binlog_expire_logs_auto_purge is set to ON and both
#         binlog_expire_logs_seconds and expire_logs_days are set to 0,
#         then binary log files SHALL NOT be automatically purged.
#

binlog加密

  • binlog_encryption
    为此服务器上的binlog和relay文件启用加密,必须安装并配置一个密匙环插件来提供MySQL服务器的密匙环服务。MySQL Keyring

  • binlog_rotate_encryption_master_key_at_startup

     ON:每当服务重新启动时,将生成一个新的加密密钥,并将其用作所有后续binlog文件和relay的主密钥。
     OFF:将再次使用现有的binlog主密钥
    

binlog记录事件大小

  • binlog_row_event_max_size
    对于binlog记录的事件,最大大小的软限制(以字节为单位)。普遍情况,将存储在binlog中的行分组为大小不超过此设置默认值8192字节的事件。如果不能拆分事件,则可以超过最大大小(64bit:17179869184GB,32bit:4GB)。

binlog列字段记录

  • binlog_row_metadata
    配置在使用基于行的日志记录时向binlog添加的表元数据的数量。当设置为默认值MINIMAL时,只记录与SIGNED标志、列字符集和 地理空间类型Geometry类型相关的元数据。当设置为FULL时,将记录表的完整元数据,如列名、ENUM或set字符串值、PRIMARY KEY信息等。

扩展metadata的目的:

1.当元数据的表结构与源的表结构不同时,副本使用元数据来传输数据。
2.外部软件可以使用元数据解码行事件并将数据存储到外部数据库(如数据仓库)。

binlog对于JSON处理

  • binlog_row_value_options
    binlog记录修改JSON文档的一小部分内容,而不是写入完整的JSON值。适用于UPDATE语句,它使用JSON_SET()、JSON_REPLACE()和JSON_REMOVE()的任意序列修改JSON列。如果服务器无法生成部分更新,则使用完整文档。
    默认值是一个空字符串,这禁止使用该格式。
    还是对MySQL支持JSON数据做了一定的改善。

binlog压缩

  • binlog_transaction_compression
    binlog启用压缩机制。主节点压缩的binlog信息,传输到从节点将以压缩状态写入relay log,因此它们间接受益于复制拓扑中其他服务器执行的压缩。

  • binlog_transaction_compression_level_zstd
    binlog内容的压缩级别,随着压缩级别的增加,数据压缩比也会增加,这将减少事务有效负载所需的存储空间和网络带宽。但是,数据压缩所需的工作量也会增加,会占用原始服务器上的时间、CPU和内存资源。压缩工作量的增加与数据压缩比的增加没有线性关系。

binlog精准时间记录

  • original_commit_timestamp
    供内部复制使用。当在副本上重新执行事务时,这将被设置为事务在原始源上提交的时间,以自epoch以来的微秒为单位。这允许在整个复制拓扑中传播原始提交时间戳。复制延时的测量。

original_commit_timestamp: 事务在 master 提交 binlog 的时间戳(微秒),该时间戳每个节点都是一样的。
immediate_commit_timestamp: 事务在 slave(包括中继节点)提交 binlog 的时间戳(微秒),该时间戳在 relay log 中与 original_commit_timestamp 一样,在 slave 的 binlog 是完成回放的时间戳。

binlog事件解析内容:

#221028  8:58:55 server id 129  end_log_pos 276 CRC32 0x17f79afd        GTID    last_committed=0        sequence_number=1       rbr_
only=yes    original_committed_timestamp=1666918735086611   immediate_commit_timestamp=1666918735086611     transaction_length=390
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1666918735086611 (2022-10-28 08:58:55.086611 CST)
# immediate_commit_timestamp=1666918735086611 (2022-10-28 08:58:55.086611 CST)
/*!80001 SET @@session.original_commit_timestamp=1666918735086611*//*!*/;
/*!80014 SET @@session.original_server_version=80031*//*!*/;
/*!80014 SET @@session.immediate_server_version=80031*//*!*/;
SET @@SESSION.GTID_NEXT= '22228e8c-b0ee-11ec-a2d1-00163e23e2cc:70'/*!*/;

总结来说 就是将事务原始提交时间写在binlog 中,提交时间在复制链路上传递,使得 slave 可以计算事务延迟,更全面更精准

总结

从上述MySQL8.0的binlog变化中,选择最受益的项的话,必然是以下这3个:

1.slave_rows_search_algorithms:hash替代 table scan
2.binlog_expire_logs_seconds:秒级别清理机制
3.original_commit_timestamp:复制延迟观测新方式,更全面更精准binlog记录。

对于这些日常运维和解决问题提供的更好的助力。

 

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

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

相关文章

牛客网语法篇练习循环控制(二)

1.今天牛牛学到了回文串,他想在数字里面找回文,即回文数,回文数是正着读与倒着读都一样的数,比如1221,343是回文数,433不是回文数。请输出不超过n的回文数。 a int(input()) for i in range(1,a1):n str…

CSS-counter 计数器详细教程+使用场景示例

counter一. counter计数器二. 属性和方法1. 计数器命名/重置2. 计数器-值递增规则3. 计数器显示 counter() / counters() 函数三 代码示例1. 重新开始计数2. counters嵌套使用3. 借助CSS计数器呈现CSS var变量值一. counter计数器 计数器是一种特殊的数字跟踪器,通常…

systemd的unit配置文件详解

Systemd 是 Linux 的系统和服务的管理器,兼容 SysV 和 LSB初始化脚本,Systemd有以下特性: 积极的并行化能力使用套接字和 D-Bus 激活来启动服务提供按需启动守护进程,使用 Linux cgroups 跟踪进程支持系统状态的快照和恢复维护挂…

艾美捷Cas9核酸酶应用说明及实例展示

Product Description:Recombinant Streptococcus pyogenes Cas9 (wt) protein expressed in an E. coli . Form:Liquid Preparation Method:E. coli expression system Purity:≥ 95% by SDS-PAGE Activity:20 nM CRISPR/Cas9-C-NLS nuclease incubated for 1 hour at 37℃…

【新知实验室 TRTCIM】实时互动课堂最佳实践

【新知实验室 TRTC&IM】实时互动课堂最佳实践一、新知实验室-TRTC腾讯云音视频产品体验官计划活动简介二、产品简介TRTCIM三、最佳实践3.1 官方快速上手TRTC(快速跑通)3.1.1 注册腾讯云账号3.1.2 使用实时音视频(需先开通)3.1.3 创建应用3.1.4 查看项目(查看密钥和快速上手…

java基础—String

我们都知道 创建一个字符串最简单的方式是 String meaasge "java资讯";当然还可以用构造来创建 (不推荐,开发中不要用) String str2new String("java资讯");这两种创建最主要的区别在于,一个在公共池中&…

gitlab CI/CD 自动化部署vue项目到阿里云服务器步骤

目录1,gitlab托管vue项目2,本地项目连接到远程仓库3,设置gitlab-runner4,编写yml文件5,部署到阿里云服务器(本地设置)5.1 安装相关依赖5.2 vue项目中添加deploy.js文件5.3 注册deploy命令5.4 验…

文本生成图像工作简述2--常用数据集分析与汇总

文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像。用户可以输入他们喜欢的任何文字提示——比如,“一只可爱的柯基犬住在一个用寿司做的房子里”——然后,人工智能就像施了魔法一样,会产生相应的图像。 文本生成图像(te…

实验2:Arduino的nRF24L01双向收发实验

实验结果: 00节点向01发送:00ReqMesFor01 01节点向00发送:CodeNewNiceBoy 并且在串口打印出相应信息 硬件电路: 01 软件 00节点代码: /*00 */#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(9, 10);// CE, CSNconst char te…

dolphinscheduler 2.0.5 性能手动测试

目录&#x1f42c;官方配置文件说明&#x1f42c;测试并发量&#x1f420;线程数量设置100&#x1f420;线程数量设置200&#x1f420;线程数量设置500&#x1f42c;测试结论&#x1f42c;官方配置文件说明 官方说明 master.exec.threads&#xff1a; master工作线程数量,用于…

智能晾衣架(二)--功能实现

本文素材来源于红河学院 工学院 作者&#xff1a;赵德森 张艺锦 潘志慧 曹紫康 指导老师&#xff1a;江洁 张龙超 1. 自动升降功能 我们设计时采用了热释电传感器&#xff08;人体红外传感器&#xff09;&#xff0c;在热释电传感器感应到有人靠近时&#xff0c;晾衣架通…

C++:内存管理:C++内存管理详解(二):带你攻破内存管理

前言&#xff1a; 任何程序运行起来都需要分配内存空间存放该进程的资源信息&#xff0c;C程序也不例外。C程序中的变量、常量、函数、代码等等信息所存放的区域都有所不同&#xff0c;不同的区域又有不同的特性。 欺骗C进程 每一个C语言的程序被执行起来的时候系统为了方便开…

字符串的简单介绍和字符串的大小比较

以前就写过一篇关于String的文章&#xff0c;今天再来写一篇&#xff0c;更加深入了解一下String类 &#x1f550;1.String类的定义 &#x1f551;2.String类的创建 &#x1f552;3.字符串的大小比较 1.之前在C语言中我们已经学到了字符类型&#xff0c;但是C语言没有Strin…

Oracle-Rman duplicate文件坏块问题处理ORA-19849 19612

前言: 最近&#xff0c;在使用rman duplicate进行备库环境搭建时&#xff0c;遇到了ORA-19849 19612坏块报错&#xff0c;最终分析是发现由于网络的配置导致。 问题: 在 ORACLE 12.2.0.1.180417 通过RMAN duplicate进行备库初始化&#xff0c;在复制文件的过程中&#xff0c;…

FTP服务器移植到Linux开发板

FTP服务器移植到Linux开发板 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录FTP服务器移植到Linux开发板前言一、vsftpd源码下载二、vsftpd移植及配置1.vsftpd移植2.vsftpd配置2.1 配置vsftpd.conf2.2 添加新用户2…

LVS+Keepalived群集

目录 一.keeepalived工具介绍 1.1 专为LVS和HA设计的一款健康检查工具 1.2 Keepalived实现原理剖析 1.3 VRRP工作过程 1.4 Keepalived&#xff0c;VRRP及其工作原理 1.5 Keepalived体系主要模块及其作用 二、LVSKeepalived 高可用群集的搭建步骤 1、配置负载调度器&…

项目管理(PMO的作用)

项目管理办公室 (PMO) 是对与项目相关的治理过程进行标准化&#xff0c;并促进资源、方法论、工具和技 术共享的一个组织结构。PMO 的职责范围可大可小&#xff0c;从提供项目管理支持服务&#xff0c;到直接管理一个 或多个项目。 PMO的三种类型&#xff1a; PMO的作用&#…

ppt背景图片怎么设置?6步教你快速搞定!

在制作 ppt的过程中&#xff0c;需要将一些内容进行设置&#xff0c;来保证整体美观&#xff0c;也就是将背景图片设置好。背景图片设置的好&#xff0c;可以很好地体现页面上的内容&#xff0c;提高页面上的内容展示效果。所以大家在制作 ppt时&#xff0c;需要将一些背景图片…

进程和线程详解

目录 前言&#xff1a; 操作系统定位 并发 并行 并发 进程 描述 PCB 管理 内存管理 进程间通信 线程 小结&#xff1a; 前言&#xff1a; 当一个程序运行起来时&#xff0c;操作系统要为之分配一些资源&#xff0c;这样的运行起来的程序称之为一个进程。为了有效解…

huffman编译码

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 利用哈夫曼编码进行信息通信可以较大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对…