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)的不同事件类型需要更深入的了解。以下是一些常见事件类型的详细解释:

  1. Query事件 (0x02):

    • 作用: 记录对数据库执行的SQL语句。
    • 结构:
      • thread_id: 执行该SQL语句的线程ID。
      • exec_time: SQL语句执行的时间戳。
      • db: 执行SQL语句的数据库。
      • sql_length: SQL语句的长度。
      • sql: SQL语句的内容。
  2. TableMap事件 (0x13):

    • 作用: 将表的ID映射到表名,用于指示接下来的事件涉及的是哪个表。
    • 结构:
      • table_id: 表的ID。
      • flags: 描述表的字段类型。
      • schema: 表所在的数据库。
      • table: 表名。
      • column_count: 表的列数。
      • column_types: 表的列类型。
  3. WriteRows事件 (0x15), UpdateRows事件 (0x16), DeleteRows事件 (0x17):

    • 作用: 记录对表的写入、更新、删除操作。
    • 结构:
      • table_id: 表的ID。
      • flags: 描述行的一些特性。
      • extra_data_length: 额外数据的长度。
      • extra_data: 额外数据,包含主键值和列值。
  4. Xid事件 (0x0A):

    • 作用: 表示一个事务的提交。
    • 结构:
      • xid: 事务ID。
  5. FormatDescription事件 (0x0F):

    • 作用: 定义Binlog文件的格式。
    • 结构:
      • binlog_version: Binlog版本。
      • server_version: MySQL版本。
      • create_timestamp: Binlog文件的创建时间。
      • header_length: 事件头的长度。
  6. Rotate事件 (0x04):

    • 作用: 表示切换到下一个Binlog文件。
    • 结构:
      • position: 新Binlog文件的起始位置。
      • next_binlog: 新Binlog文件的名称。
  7. Intvar事件 (0x05):

    • 作用: 记录整数类型的系统变量的更改。
    • 结构:
      • type: 变量的类型。
      • value: 新的变量值。
  8. Rand事件 (0x13):

    • 作用: 记录浮点数类型的系统变量的更改。
    • 结构:
      • type: 变量的类型。
      • value: 新的变量值。
  9. RowsQuery事件 (0x1E):

  • 作用: 记录对表数据执行的语句,与Query事件的区别在于RowsQuery事件记录了对表数据的修改。
  • 结构:
    • thread_id: 执行该SQL语句的线程ID。
    • exec_time: SQL语句执行的时间戳。
    • db: 执行SQL语句的数据库。
    • sql_length: SQL语句的长度。
    • sql: SQL语句的内容。
  1. GTID事件 (0x1F):
  • 作用: GTID(全局事务标识符)事件,用于提供复制的一致性。
  • 结构:
    • flags: GTID的标志。
    • source_id: 源服务器的唯一标识符。
    • transaction_id: 事务ID。
  1. GtidList事件 (0x20):
  • 作用: 记录一个事务的GTID列表。
  • 结构:
    • gtid_executed: 已执行的GTID列表。
  1. 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的作用:

  1. 全局唯一标识: GTID是全局唯一的,即使在不同的MySQL服务器上。这确保了在整个复制拓扑中每个事务都有唯一的标识。

  2. 简化拓扑管理: GTID消除了在主从服务器之间配置二进制日志文件和位置的需要。每个事务都有一个唯一的GTID,使得复制拓扑更容易管理。

  3. 故障恢复: GTID简化了故障恢复过程。如果主服务器发生故障,从服务器可以很容易地识别它在主服务器上的最后一个已复制的事务,并从那里继续。

GTID的事件类型:

在MySQL二进制日志中,与GTID相关的事件类型主要有两种:

  1. GTID事件 (0x1F): 用于记录一个事务的GTID。包含源服务器的标识符、GTID标志和事务ID。

  2. GtidList事件 (0x20): 用于记录一个事务的GTID列表。这通常用于表示一组相关的事务。

配置和使用GTID:

在MySQL配置文件中,启用GTID需要设置gtid_mode参数。可以选择使用ONOFFUUID作为参数值,具体取决于配置的需求。

使用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的优势:

  1. 易管理: 简化了配置和管理复制拓扑的过程。
  2. 可靠性: 提供了更可靠的复制机制,减少了复制延迟和数据不一致的风险。
  3. 故障恢复: 简化了故障恢复过程,从服务器可以更轻松地找到离线时的同步点。

总体而言,GTID是MySQL复制架构中的一个关键概念,使得复制更加简单、可靠,特别是在大规模和分布式系统中。

第三:复制与同步

MySQL复制是一种常见的数据库高可用性和数据分发方案,其中Binlog(二进制日志)扮演着关键的角色。让我们探讨MySQL复制中Binlog的角色,以及如何配置和管理复制拓扑。

Binlog在MySQL复制中的角色:

  1. 记录数据更改: Binlog记录了数据库中发生的数据更改,包括INSERT、UPDATE、DELETE等操作。

  2. 用于恢复: Binlog充当了数据库的变更历史,可以通过回放Binlog来恢复到特定的时间点。

  3. 复制源: 主服务器上的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_RunningSlave_SQL_Running字段,确保两者都是Yes

8. 故障恢复:

如果主服务器发生故障,可以使用从服务器上的Binlog进行故障恢复。

注意事项和建议:

  • 安全性考虑: 确保在主从服务器之间的通信是安全的,使用SSL等机制加密通信。

  • 网络延迟: 考虑主从服务器之间的网络延迟,特别是在跨地域或跨数据中心的情况下。

  • 备份策略: 考虑实施定期的备份策略,包括主服务器和从服务器。

  • 监控和警报: 设置监控和警报以及复制拓扑的状态,及时发现潜在问题。

通过以上步骤,你可以配置和管理一个基本的MySQL复制拓扑。根据实际需求和复杂度,可能需要进一步调整和优化配置。

第四:Binlog与数据恢复

MySQL的Binlog在数据恢复中扮演着关键的角色。它记录了数据库中发生的数据更改,因此可以用于回放这些更改以进行数据恢复。以下是详细介绍如何使用Binlog进行数据恢复以及一些实用技巧:

使用Binlog进行数据恢复步骤:

  1. 确认Binlog是否启用:
    在MySQL主服务器的配置文件中确保已启用Binlog。检查配置文件中的以下参数:

    log_bin = /path/to/binlog
    server_id = <unique_server_id>
    
  2. 查找需要恢复的时间点:
    确定你希望恢复到的特定时间点。可以使用Binlog文件的名称和位置,也可以使用GTID标识符。

  3. 备份当前数据:
    在执行任何恢复操作之前,确保对当前的数据库数据进行备份,以防意外。

  4. 启动MySQL并应用Binlog:

    • 如果使用Binlog文件名和位置,可以在MySQL启动时指定参数,如:

      mysqld --log-bin=/path/to/binlog --binlog-do-db=your_database --binlog-position=log_position
      
    • 如果使用GTID,可以在启动时指定--gtid参数。

  5. 应用Binlog:
    执行以下SQL语句以应用Binlog:

    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    START SLAVE UNTILMASTER_LOG_FILE = 'log_filename',MASTER_LOG_POS = log_position;
    

    这将使从服务器跳过一个事件,并在指定的Binlog文件和位置处开始复制。

  6. 监控和验证:
    使用SHOW SLAVE STATUS\G来监视从服务器的复制状态。确保Slave_IO_RunningSlave_SQL_Running都是Yes,表示复制正在运行。

  7. 恢复完毕后重置复制位置:
    恢复完成后,记得将复制位置重置为正常状态:

    STOP SLAVE;
    RESET SLAVE;
    

实用技巧和注意事项:

  1. 使用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
    
  2. 增量备份:
    定期执行增量备份,并保留一些历史备份。这样,即使出现问题,你可以使用最近的完整备份和增量备份进行数据恢复。

  3. 监控复制状态:
    始终监控从服务器的复制状态,以便及时发现问题。配置警报以便在出现异常情况时立即得到通知。

  4. 谨慎使用跳过错误:
    使用SET GLOBAL SQL_SLAVE_SKIP_COUNTER跳过错误时要小心。确保理解并了解跳过的具体事件,以避免导致数据不一致。

  5. 谨慎操作Binlog文件:
    操作Binlog文件时要小心。删除或移动Binlog文件可能导致无法正常进行数据恢复。

  6. 测试恢复流程:
    定期进行恢复测试,以确保在紧急情况下能够迅速有效地进行数据恢复。

这些步骤和实用技巧可以帮助你更好地利用Binlog进行数据恢复,并在紧急情况下更加自信和高效地应对问题。

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

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

相关文章

【总结】重极限的计算

这个做法比较严谨&#xff0c;我之前是想着分母趋于0&#xff0c;分子也得趋于0&#xff0c;这个有界量乘无穷小还是无穷小的手法还是很漂亮的。 图一源链接https://www.zhihu.com/question/269472244 图二选自李艳芳真题解析

链表中环的入口节点(环形链表),剑指offer,力扣

目录 力扣题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 审题目事例提示&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 主要思路&#xff1a;先判断是否有环&#xff0c;有则找出环入口节点 力扣题目地址&#xff1a; …

FFmepg 核心开发库及重要数据结构与API

文章目录 前言一、FFmpeg 核心开发库二、FFmpeg 重要数据结构与 API1、简介2、FFmpeg 解码流程①、FFmpeg2.x 解码流程②、FFmpeg4.x 解码流程 3、FFMpeg 中比较重要的函数以及数据结构①、数据结构②、初始化函数③、音视频解码函数④、文件操作⑤、其他函数 三、FFmpeg 流程1…

【学习笔记】插值之拉格朗日插值(Lagrange)

0 插值介绍 插值法是广泛应用于理论研究和工程实际的重要数值方法。用提供的部分离散的函数值来进行理论分析和设计都是极不方便的&#xff0c;因此希望能够用一个既能反映原函数特征&#xff0c;又便于计算的简单函数去近似原函数。 1 低次拉格朗日插值 定理&#xff1a;设…

福利来了| 200多款精选简历模板免费领,让你30秒内征服HR!

找工作是不是让你很头大&#xff1f;尤其是写简历&#xff0c;真的好痛苦啊&#xff01;我在网上找了好久&#xff0c;都没有找到合适的简历模板&#xff0c;自己做又不知道从哪里下手。 不过现在好了&#xff0c;有一个超级福利送给大家&#xff01;200多款精选简历模板免费领…

codeformer,是如何对数据进行降级处理的?是如何模糊人脸图像的?

答案&#xff1a;https://github.com/sczhou/CodeFormer/blob/8392d0334956108ab53d9439c4b9fc9c4af0d66d/basicsr/data/ffhq_blind_dataset.py#L90 运动模糊&#xff1a; # motion blurif self.use_motion_kernel and random.random() < self.motion_kernel_prob:m_i ran…

使用HTML+CSS+JS网页设计与制作,酷炫动效科技农业网页

使用HTMLCSSJS网页设计与制作&#xff0c;酷炫动效科技农业网页。 可以用于家乡介绍、科技农业、图片画廊展示等个人网站的设计与制作。农业网站、家乡网站、农产品网站、旅游网站。 网站亮点 1、视觉设计&#xff1a;排版布局极简设计&#xff0c;优质的视觉体验等。 2、动…

手摸手Element-ui路由VueRoute

后端WebAPI准备 https://router.vuejs.org/zh/guide/ https://v3.router.vuejs.org/zh/installation.html <template><el-table:data"tableData"style"width: 100%":row-class-name"tableRowClassName"><!-- <el-table-colum…

【华为OD】统一考试B\C卷真题:100%通过: 分班 C/C++源码实现

目录 题目描述&#xff1a; 示例1 C源码实现&#xff1a; 题目描述&#xff1a; 幼儿园两个班的小朋友在排队时混在了一起&#xff0c;每位小朋友都知道自己是否与前面一位小朋友是否同班&#xff0c;请你帮忙把同班的小朋友找出来。 小朋友的编号为整数&#xff0c;与前一…

3-全功能pytest测试框架-allure2

3-全功能pytest测试框架-allure2 一:Allure介绍1> Allure 优势2> Allure 安装二:allure demo1> 脚本demo2> 查看result三:allure装饰器1> 装饰器一览表2> 装饰器概述1. epic、feature、story3> @allure.title()4> @allure.testcase()5> @allure.…

【linux挂载windows,密码含特殊字符,使用证书方式挂载】

1、设置Windows端共享文件目录 暂定设置共享目录为为&#xff1a;D:\shared 2、Linux客户端挂载 安装samba服务 查看是否安装&#xff1a;rpm -qa | grep samba samba4-libs-4.0.0-58.el6.rc4.x86_64 samba4-4.0.0-58.el6.rc4.x86_64 samba4-client-4.0.0-58.el6.rc4.x86_64 s…

Vue框架学习笔记——侦听(监视)属性watch:天气案例+immediate+deep深度监听

文章目录 前文提要天气案例描述样例代码呈现效果&#xff1a;事件的响应中可以写一些简单的语句&#xff08;不推荐&#xff09; 侦听&#xff08;监视&#xff09;属性watch结合天气案例的第一种写法&#xff08;New Vue&#xff09;immediate&#xff1a; 侦听&#xff08;监…

为什么要用 Redis 而不用 map/guava 做缓存? Redis为什么这么快 Redis有哪些数据类型 Redis的应用场景

文章目录 为什么要用 Redis 而不用 map/guava 做缓存?Redis为什么这么快Redis有哪些数据类型Redis的应用场景总结一计数器缓存会话缓存全页缓存&#xff08;FPC&#xff09;查找表消息队列(发布/订阅功能)分布式锁实现 总结二 简单的聊聊Redis常见的一些疑问点&#xff1a;具体…

Spring Security 6.1.x 系列(5)—— Servlet 认证体系结构介绍

一、前言 本章主要学习Spring Security中基于Servlet 的认证体系结构&#xff0c;为后续认证执行流程源码分析打好基础。 二、身份认证机制 Spring Security提供个多种认证方式登录系统&#xff0c;包括&#xff1a; Username and Password&#xff1a;使用用户名/密码 方式…

MATLAB中FFT频谱分析使用详解

文章目录 语法说明语法一&#xff1a;Y fft(X)fft(X)返回X长度的傅里叶变换 语法二&#xff1a;Y fft(X,N)如果 X的长度小于 N&#xff0c;则为 X补上尾零以达到长度 N(FFT插值)双边谱转换为单边谱 如果 X 的长度大于 N&#xff0c;则对 X 进行截断以达到长度 N。 语法三&…

Postman如何使用(四):接口测试

一.接口 1.程序内部接口&#xff1a;方法与方法之间&#xff0c;模块与模块之间的交互&#xff0c;程序内部抛出的接口&#xff0c;比如bbs系统&#xff0c;有登录模块&#xff0c;发帖模块等等&#xff0c;那你要发帖就必须先登录&#xff0c;那么这两个模块就得有交互&#…

Nginx(九) aio sendfile directio 组合使用测试(2)

测试7&#xff1a;开启directio2m、sendfile&#xff0c;关闭aio&#xff0c;请求/vendor.js {"time_iso8601":"2023-11-26T22:47:3508:00","request_uri":"/vendor.js","status":"200","bytes_sent":…

什么是数据增强,为什么会让模型更健壮?

在做一些图像分类训练任务时&#xff0c;我们经常会遇到一个很尴尬的情况&#xff0c;那就是&#xff1a; 明明训练数据集中有很多可爱猫咪的照片&#xff0c;但是当我们给训练好的模型输入一张戴着头盔的猫咪进行测试时&#xff0c;模型就不认识了&#xff0c;或者说识别精度…

Makefile讲解

CC g CFLAGS -stdc11 -Wall -pthread LDFLAGS SRCS ../main.cpp socketCan_FW_Download.cpp OBJS $(SRCS:.cpp.o)acandev: $(OBJS)$(CC) $(CFLAGS) $(OBJS) -o acandev $(LDFLAGS)%.o: %.cpp$(CC) $(CFLAGS) -c $< -o $clean:rm -f $(OBJS) acandev解释下上面Makefile中…

栈和队列OJ题目——C语言

目录 LeetCode 20、有效的括号 题目描述&#xff1a; 思路解析&#xff1a; 解题代码&#xff1a; 通过代码&#xff1a; LeetCode 225、用队列实现栈 题目描述&#xff1a; 思路解析&#xff1a; 解题代码&#xff1a; 通过代码&#xff1a; LeetCode 232、用栈…