MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
🎏:你只管努力,剩下的交给时间
🏠 :小破站
MySQL Binlog深度解析:进阶应用与实战技巧
- 前言
- 第一:Binlog事件详解
- 第二:关于GTID
- GTID的结构:
- GTID的作用:
- GTID的事件类型:
- 配置和使用GTID:
- GTID的优势:
- 第三:复制与同步
- Binlog在MySQL复制中的角色:
- 配置和管理MySQL复制拓扑:
- 1. 启用Binlog:
- 2. 配置主服务器:
- 3. 启用GTID:
- 4. 重启主服务器:
- 5. 配置从服务器:
- 6. 启动从服务器复制:
- 7. 监视复制状态:
- 8. 故障恢复:
- 注意事项和建议:
- 第四:Binlog与数据恢复
- 使用Binlog进行数据恢复步骤:
- 实用技巧和注意事项:
前言
在前一篇的基础上,我们将进一步挖掘MySQL Binlog的深度,揭示其高级特性和实际应用场景。这将是数据库管理者和开发者的一次深刻学习之旅。
第一:Binlog事件详解
理解MySQL二进制日志(Binary Log)的不同事件类型需要更深入的了解。以下是一些常见事件类型的详细解释:
-
Query事件 (0x02):
- 作用: 记录对数据库执行的SQL语句。
- 结构:
thread_id: 执行该SQL语句的线程ID。exec_time: SQL语句执行的时间戳。db: 执行SQL语句的数据库。sql_length: SQL语句的长度。sql: SQL语句的内容。
-
TableMap事件 (0x13):
- 作用: 将表的ID映射到表名,用于指示接下来的事件涉及的是哪个表。
- 结构:
table_id: 表的ID。flags: 描述表的字段类型。schema: 表所在的数据库。table: 表名。column_count: 表的列数。column_types: 表的列类型。
-
WriteRows事件 (0x15), UpdateRows事件 (0x16), DeleteRows事件 (0x17):
- 作用: 记录对表的写入、更新、删除操作。
- 结构:
table_id: 表的ID。flags: 描述行的一些特性。extra_data_length: 额外数据的长度。extra_data: 额外数据,包含主键值和列值。
-
Xid事件 (0x0A):
- 作用: 表示一个事务的提交。
- 结构:
xid: 事务ID。
-
FormatDescription事件 (0x0F):
- 作用: 定义Binlog文件的格式。
- 结构:
binlog_version: Binlog版本。server_version: MySQL版本。create_timestamp: Binlog文件的创建时间。header_length: 事件头的长度。
-
Rotate事件 (0x04):
- 作用: 表示切换到下一个Binlog文件。
- 结构:
position: 新Binlog文件的起始位置。next_binlog: 新Binlog文件的名称。
-
Intvar事件 (0x05):
- 作用: 记录整数类型的系统变量的更改。
- 结构:
type: 变量的类型。value: 新的变量值。
-
Rand事件 (0x13):
- 作用: 记录浮点数类型的系统变量的更改。
- 结构:
type: 变量的类型。value: 新的变量值。
-
RowsQuery事件 (0x1E):
- 作用: 记录对表数据执行的语句,与Query事件的区别在于RowsQuery事件记录了对表数据的修改。
- 结构:
thread_id: 执行该SQL语句的线程ID。exec_time: SQL语句执行的时间戳。db: 执行SQL语句的数据库。sql_length: SQL语句的长度。sql: SQL语句的内容。
- GTID事件 (0x1F):
- 作用: GTID(全局事务标识符)事件,用于提供复制的一致性。
- 结构:
flags: GTID的标志。source_id: 源服务器的唯一标识符。transaction_id: 事务ID。
- GtidList事件 (0x20):
- 作用: 记录一个事务的GTID列表。
- 结构:
gtid_executed: 已执行的GTID列表。
- PreviousGtids事件 (0x1D):
- 作用: 记录上一个Binlog文件中已经提交的GTID。
- 结构:
gtid_executed: 已执行的GTID列表。
这些结构是以字节为单位的二进制数据,不同的事件类型有不同的字段。详细的结构信息可以在MySQL的官方文档中找到。理解这些事件类型的结构有助于更深入地了解MySQL的二进制日志,并对其进行更高级的使用,例如数据同步、故障恢复和数据备份。
第二:关于GTID
当涉及到MySQL复制(replication)时,GTID(全局事务标识符)是一个非常重要的概念。GTID旨在提供更简单、可靠的复制和故障恢复机制。以下是关于GTID的重点内容:
GTID的结构:
GTID是一个由三个部分组成的标识符:domain_id-server_id-sequence_number。每个组件的含义如下:
domain_id: 表示MySQL服务器所在的域。在MySQL复制中,通常为1。server_id: 表示MySQL服务器的唯一标识符。sequence_number: 表示在给定服务器上生成的事务的顺序号。
GTID的作用:
-
全局唯一标识: GTID是全局唯一的,即使在不同的MySQL服务器上。这确保了在整个复制拓扑中每个事务都有唯一的标识。
-
简化拓扑管理: GTID消除了在主从服务器之间配置二进制日志文件和位置的需要。每个事务都有一个唯一的GTID,使得复制拓扑更容易管理。
-
故障恢复: GTID简化了故障恢复过程。如果主服务器发生故障,从服务器可以很容易地识别它在主服务器上的最后一个已复制的事务,并从那里继续。
GTID的事件类型:
在MySQL二进制日志中,与GTID相关的事件类型主要有两种:
-
GTID事件 (0x1F): 用于记录一个事务的GTID。包含源服务器的标识符、GTID标志和事务ID。
-
GtidList事件 (0x20): 用于记录一个事务的GTID列表。这通常用于表示一组相关的事务。
配置和使用GTID:
在MySQL配置文件中,启用GTID需要设置gtid_mode参数。可以选择使用ON、OFF或UUID作为参数值,具体取决于配置的需求。
使用GTID进行复制时,连接主从服务器的方式也有所不同,通常使用CHANGE MASTER TO语句配置主从关系,包括主服务器的GTID信息。
CHANGE MASTER TOMASTER_HOST='master_host',MASTER_PORT=master_port,MASTER_USER='user',MASTER_PASSWORD='password',MASTER_AUTO_POSITION=1;
GTID的优势:
- 易管理: 简化了配置和管理复制拓扑的过程。
- 可靠性: 提供了更可靠的复制机制,减少了复制延迟和数据不一致的风险。
- 故障恢复: 简化了故障恢复过程,从服务器可以更轻松地找到离线时的同步点。
总体而言,GTID是MySQL复制架构中的一个关键概念,使得复制更加简单、可靠,特别是在大规模和分布式系统中。
第三:复制与同步
MySQL复制是一种常见的数据库高可用性和数据分发方案,其中Binlog(二进制日志)扮演着关键的角色。让我们探讨MySQL复制中Binlog的角色,以及如何配置和管理复制拓扑。
Binlog在MySQL复制中的角色:
-
记录数据更改: Binlog记录了数据库中发生的数据更改,包括INSERT、UPDATE、DELETE等操作。
-
用于恢复: Binlog充当了数据库的变更历史,可以通过回放Binlog来恢复到特定的时间点。
-
复制源: 主服务器上的Binlog用于向从服务器传递变更。从服务器通过读取主服务器上的Binlog并应用这些变更来保持同步。
配置和管理MySQL复制拓扑:
1. 启用Binlog:
确保主服务器上的MySQL配置文件中启用了Binlog。在配置文件中找到并设置以下参数:
log_bin = /path/to/binlog
server_id = <unique_server_id>
2. 配置主服务器:
在主服务器上创建用于复制的用户,并确保该用户具有适当的权限。例如:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
3. 启用GTID:
如前面提到的,可以启用GTID以简化复制管理。在主服务器的配置文件中设置:
gtid_mode = ON
enforce_gtid_consistency = ON
4. 重启主服务器:
重启主服务器以应用新的配置。
5. 配置从服务器:
在从服务器上配置连接主服务器的信息,使用CHANGE MASTER TO语句。例如:
CHANGE MASTER TOMASTER_HOST = 'master_host',MASTER_PORT = master_port,MASTER_USER = 'repl_user',MASTER_PASSWORD = 'password',MASTER_AUTO_POSITION = 1;
6. 启动从服务器复制:
启动从服务器的复制进程:
START SLAVE;
7. 监视复制状态:
可以使用以下语句来查看复制状态:
SHOW SLAVE STATUS\G
在返回结果中,查看Slave_IO_Running和Slave_SQL_Running字段,确保两者都是Yes。
8. 故障恢复:
如果主服务器发生故障,可以使用从服务器上的Binlog进行故障恢复。
注意事项和建议:
-
安全性考虑: 确保在主从服务器之间的通信是安全的,使用SSL等机制加密通信。
-
网络延迟: 考虑主从服务器之间的网络延迟,特别是在跨地域或跨数据中心的情况下。
-
备份策略: 考虑实施定期的备份策略,包括主服务器和从服务器。
-
监控和警报: 设置监控和警报以及复制拓扑的状态,及时发现潜在问题。
通过以上步骤,你可以配置和管理一个基本的MySQL复制拓扑。根据实际需求和复杂度,可能需要进一步调整和优化配置。
第四:Binlog与数据恢复
MySQL的Binlog在数据恢复中扮演着关键的角色。它记录了数据库中发生的数据更改,因此可以用于回放这些更改以进行数据恢复。以下是详细介绍如何使用Binlog进行数据恢复以及一些实用技巧:
使用Binlog进行数据恢复步骤:
-
确认Binlog是否启用:
在MySQL主服务器的配置文件中确保已启用Binlog。检查配置文件中的以下参数:log_bin = /path/to/binlog server_id = <unique_server_id> -
查找需要恢复的时间点:
确定你希望恢复到的特定时间点。可以使用Binlog文件的名称和位置,也可以使用GTID标识符。 -
备份当前数据:
在执行任何恢复操作之前,确保对当前的数据库数据进行备份,以防意外。 -
启动MySQL并应用Binlog:
-
如果使用Binlog文件名和位置,可以在MySQL启动时指定参数,如:
mysqld --log-bin=/path/to/binlog --binlog-do-db=your_database --binlog-position=log_position -
如果使用GTID,可以在启动时指定
--gtid参数。
-
-
应用Binlog:
执行以下SQL语句以应用Binlog:SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE UNTILMASTER_LOG_FILE = 'log_filename',MASTER_LOG_POS = log_position;这将使从服务器跳过一个事件,并在指定的Binlog文件和位置处开始复制。
-
监控和验证:
使用SHOW SLAVE STATUS\G来监视从服务器的复制状态。确保Slave_IO_Running和Slave_SQL_Running都是Yes,表示复制正在运行。 -
恢复完毕后重置复制位置:
恢复完成后,记得将复制位置重置为正常状态:STOP SLAVE; RESET SLAVE;
实用技巧和注意事项:
-
使用mysqlbinlog工具:
mysqlbinlog是一个用于查看和解析Binlog文件的实用工具。你可以使用它来检查Binlog文件的内容,查找需要恢复的时间点。mysqlbinlog /path/to/binlog --start-datetime="YYYY-MM-DD HH:MM:SS" --stop-datetime="YYYY-MM-DD HH:MM:SS" | mysql -u username -p -
增量备份:
定期执行增量备份,并保留一些历史备份。这样,即使出现问题,你可以使用最近的完整备份和增量备份进行数据恢复。 -
监控复制状态:
始终监控从服务器的复制状态,以便及时发现问题。配置警报以便在出现异常情况时立即得到通知。 -
谨慎使用跳过错误:
使用SET GLOBAL SQL_SLAVE_SKIP_COUNTER跳过错误时要小心。确保理解并了解跳过的具体事件,以避免导致数据不一致。 -
谨慎操作Binlog文件:
操作Binlog文件时要小心。删除或移动Binlog文件可能导致无法正常进行数据恢复。 -
测试恢复流程:
定期进行恢复测试,以确保在紧急情况下能够迅速有效地进行数据恢复。
这些步骤和实用技巧可以帮助你更好地利用Binlog进行数据恢复,并在紧急情况下更加自信和高效地应对问题。
相关文章:
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
🎏:你只管努力,剩下的交给时间 🏠 :小破站 MySQL Binlog深度解析:进阶应用与实战技巧 前言第一:Binlog事件详解第二:关于GTIDGTID的结构:GTID的作用:GTID的事…...
openpnp - 给底部相机加防尘罩
文章目录 openpnp - 给底部相机加防尘罩概述笔记END openpnp - 给底部相机加防尘罩 概述 设备标定完, 看着底部相机, 有点担心掉进去东西, 万一从吸嘴掉下去的料(或者清理设备台面时, 不小心掉进去东西)将顶部相机搞短路怎么办. 就想加个防尘罩, 如果有东西掉进去, 可以掉到机…...
mac mysql连接中断重新启动办法
遇到如图所示问题,可以用下面的命令重启mysql服务 sudo /usr/local/mysql/support-files/mysql.server start...
【Vue3】解决Vue打包后上传服务器 资源路径加载错误
问题: 我这里在打包Vue之后将打包后的dist 上传至服务器站点根目录内子目录 名为 "adminstore" , 但是当我通过域名打开站点后发现 资源加载路径内并没有携带 子目录 "adminstore" 文件名称 错误:http://your website domain/js/app…...
u-popup组件在UniApp中的讲解
u-popup 组件是 UniApp 中一个多功能且强大的组件,UniApp 是一个使用 Vue.js 开发跨平台应用程序的框架。u-popup 组件提供了一种在应用程序的其他内容上方显示临时或浮动内容的方式。 使用方法: 要在 UniApp 项目中使用 u-popup 组件,你需要…...
drool 7 multiThread 测试
基本信息 通过option ,使用如下代码进行设置 //线程数量10MaxThreadsOption optionMaxThreadsOption.get(10);kieBaseConf.setOption(option);kieBaseConf.setOption(MultithreadEvaluationOption.YES);并发是以CompositeDefaultAgenda/Rule为颗粒度来的࿰…...
【网安AIGC专题】46篇前沿代码大模型论文、24篇论文阅读笔记汇总
网安AIGC专题 写在最前面一些碎碎念课程简介 0、课程导论1、应用 - 代码生成2、应用 - 漏洞检测3、应用 - 程序修复4、应用 - 生成测试5、应用 - 其他6、模型介绍7、模型增强8、数据集9、模型安全 写在最前面 本文为邹德清教授的《网络安全专题》课堂笔记系列的文章,…...
如何在Simulink中使用syms?换个思路解决报错:Function ‘syms‘ not supported for code generation.
问题描述 在Simulink中的User defined function使用syms函数,报错simulink无法使用外部函数。 具体来说: 我想在Predefined function定义如下符号函数作为输入信号,在后续模块传入函数参数赋值,以实现一次定义多次使用…...
论文导读 | 10月专题内容精选:人的预测
编者按 本次论文导读,编者选择了10月份OR和MS上与"人的预测"有关的三篇文章,分别涉及群体智慧的提取,个体序列预测的评估,以及决策者对风险的扭曲感知在分布式鲁棒优化中的应用。其中,从基于"生成式可能…...
深度学习18
卷积层 查看每个数据 使用tensorboard查看 池化层 使用数据集进行训练 创建实例,使用tensorboard进行显示 最大池化保留了图片信息,神经网络训练的数据量大大减小,可以加快训练 非线性激活 非线性激活为神经网络加入了一些非线性的特质…...
Mysql数据库 18.Mysql SQL优化
SQL优化 一、插入优化 多条插入语句,影响执行效率 优化方案 1、批量插入: 在一条insert语句中多条数据,但是如果数据量过大,也不能完全使用一条语句语句,建议数据量为一次性插入1000条以下的数据 如果数据量多大&…...
[AutoSAR 存储] 汽车智能座舱的存储需求
公知及经验整理,原创保护,禁止转载。 专栏 《AutoSAR 存储》 <<<< 返回总目录 <<<< 1 智能座舱的发展: 1.1 发展历史 车辆信息娱乐系统的发展可以分为三个阶段。 机械化阶段 在上世纪90年代,车辆仪表盘…...
大数据-之LibrA数据库系统告警处理(ALM-37006 Coordinator进程异常)
告警解释 当出现如下情况时,产生该告警: CN所在机器发生硬件故障(断电、硬盘损坏等)。CN实例数据目录中的postgresql.conf配置文件不存在或者其中某个配置参数不正确。CN实例线程无法监听IP,或者无法绑定监听端口。C…...
python 列表的操作
增加 # append 在已有的列表末尾插入一个值 list1[张三,李四] list1.append(王二) print(list1)# expand 在已有的列表末尾追加一个列表 list1 [love,peace,keep] list2 [beautiful,string] list1.extend(list2) print(list1)# insert 在指定位置插入一个值list1 [love,peac…...
Vue快速实践总结 · 上篇
文章目录 模板语法数据绑定事件处理计算属性监视属性(监听器)条件渲染列表渲染数据监视原理内置指令总结生命周期组件化编程组件使用步骤组件的嵌套this指向单文件组件ref、props 脚手架(Vue CLI)render函数 参考自己的Vue专栏以及Vue官方文档 模板语法 …...
外汇天眼:香港监管机构对AMTD Global Markets Limited启动法律诉讼
香港证监会(SFC)已经启动了法律程序,要求首次审裁法院调查AMTD Global Markets Limited(AMTD,目前以orientiert XYZ Securities Limited为名)及其前高管在与首次公开发行(IPO)相关的…...
OpenCV入门教程
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
84基于matlab的数字图像处理
基于matlab的数字图像处理,数据可更换自己的,程序已调通,可直接运行。 84matlab数字图像处理图像增强 (xiaohongshu.com)https://www.xiaohongshu.com/explore/656219d80000000032034dea...
jQuery_09 事件的绑定与使用(on)
jQuery使用on绑定事件 jQuery可以给dom对象添加事件 在程序执行期间动态的处理事件 1. $("选择器").事件名称(事件处理函数) $("选择器") : 选择0或者多个dom对象 给他们添加事件 事件名称:就是js中事件名称去掉on的部分 比如单击…...
详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)
目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制(擦除机制) 六.泛型的上界 一.什么是泛型 泛型(Generics)是Java SE 5中引入的一个新特性,可以使Java中的类和方…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
