1. Binlog是什么?有哪几种格式?推荐使用哪种,为什么

    Binlog是什么

    • Binlog二进制日志是MySQL Server层记录所有更改数据库内容的操作日志的二进制文件,如操作UPDATE,DELETE,INSERT
    • Binlog不记录SELECT,SHOW等查询操作
    • 使主从复制,数据恢复,审计追踪的核心
    • 通常位于数据目录,文件名类似:mysql-bin.000001

    通过参数bonlog_format设置格式

    • STATEMENT 记录原始SQL语句(默认早期版本使用)
    • ROW 记录每一行被修改的具体值(行级变更)
    • MINED 自动选择使用STATEMENT 或 ROW,复杂操作使用 ROW,简单操作用 STATEMENT

    推荐使用ROW格式

    描述
    精确记录数据变更后的具体值,不受环境因素影响
    一致性高主从复制不会出现因 SQL 非确定性引起的数据不一致问题
    恢复准确更容易基于 binlog 做精准恢复

    可通过修改MySQL配置文件或使用SQL语句设置Binlog格式

    • 修改配置文件

      [mysqld]
      binlog_format = ROW  # 可选值:STATEMENT、ROW、MIXED
      
    • 使用SQL语句动态修改

      SET GLOBAL binlog_format = 'ROW';  # 可选值:STATEMENT、ROW、MIXED
      
  2. 对数据库的操作是先执行,还是先写入binlog中?为什么
    总结:

    事务性操作(如 InnoDB)
    执行操作 → 记录 redo log → 写入 binlog → 提交事务通过两阶段提交确保 binlog 与数据变更的一致性。

    非事务性操作(如 MyISAM)执行操作 → 写入 binlog,存在崩溃导致主从不一致的风险

    • 事务性存储引擎(如 InnoDB)的执行流程

      对于支持事务的存储引擎,MySQL 采用 两阶段提交 确保 binlog 与数据变更的一致性

      1. 执行 SQL 并记录 redo log
        • 执行 SQL 语句,修改内存中的数据页(Buffer Pool)。
        • 将变更记录到redo log(物理日志),确保崩溃恢复时数据不丢失。
      2. 准备阶段(Prepare)
        • 存储引擎将事务标记为PREPARED状态。
        • 强制将 redo log 写入磁盘(确保持久性)。
      3. 写入 binlog:将事务的变更写入binlog(逻辑日志)。
      4. 提交阶段(Commit)
        • 存储引擎将事务标记为COMMITTED状态。
        • 写入commit 标记到 redo log,事务完成。

      关键点:

      • binlog 在事务提交前写入,但在存储引擎真正提交前。
      • 通过 redo log 和两阶段提交,保证 binlog 与数据变更的顺序一致,避免主从复制不一致。
      二、非事务性存储引擎(如 MyISAM)的执行流程

      对于不支持事务的存储引擎:

      1. 执行 SQL 并修改数据文件:直接执行 SQL,修改数据文件和索引。
      2. 写入 binlog:操作完成后,将变更记录到 binlog。

      风险
      如果在执行 SQL 后、binlog 写入前发生崩溃,可能导致主从数据不一致(主库已执行但从库未复制)。

  3. 如果刚写入binlog,数据库出现异常,没有写入就重启了,会发生什么事情

    • 在 MySQL 中,若binlog 已写入但数据未提交时发生异常重启,InnoDB 存储引擎会通过 崩溃恢复和两阶段提交(2PC) 机制确保数据一致性

    • binlog 写入后数据库异常重启,不会导致数据不一致,可能需要通过 redo log 完成未完成的提交操作。是 MySQL 主从复制可靠性的核心保障之一

      两阶段提交

      1. 准备阶段(Prepare)
      • 执行 SQL 并记录 redo log。
      • InnoDB 将事务标记为PREPARED,并写入 redo log。
      1. 提交阶段(Commit)
      • MySQL Server 写入 binlog。
      • InnoDB 写入COMMIT标记到 redo log,事务完成
    • 发生异常的三种场景及处理

    • 场景 1:binlog 写入后,InnoDB 未收到提交指令
      • 现象:binlog 已写入磁盘,但 InnoDB 未执行COMMIT
      • 恢复流程
        1. 重启后,InnoDB 通过 redo log 发现事务处于PREPARED状态。
        2. 检查 binlog:
          • 若 binlog 存在该事务:InnoDB 自动提交事务(与 binlog 保持一致)。
          • 若 binlog 不存在:InnoDB 回滚事务。
      场景 2:binlog 写入失败(如磁盘已满)
      • 现象:binlog 写入中断,InnoDB 未收到提交指令。
      • 恢复流程
        1. binlog 写入失败时,MySQL Server 会回滚事务(协调者决定)。
        2. 重启后,InnoDB 通过 redo log 发现事务未完成,直接回滚。
      场景 3:binlog 和 redo log 部分丢失
      • 现象:binlog 或 redo log 文件损坏。
      • 恢复流程
        1. 若 binlog 完整但 redo log 丢失,事务会被重新应用(通过 binlog)。
        2. 若两者均损坏,可能需要从备份恢复或手动修复(极端情况
  4. 随着时间的推移,binglog越来越大怎么操作

    • 可手动清理或自动清理来管理Binlog
      方法:定期清理旧日志,手动 PURGE BINARY LOGS
      配置自动过期时间
  5. 如何强制创建新的binlog文件,这个操作有什么实际用途

    • 强制切换

      FLUSH BINARY LOGS;
      
      用途说明
      日志归档便于日志管理、切分日志
      主从同步初始化主库切换 binlog 文件,让从库能从新起点同步
      手动备份配合 binlog 做增量控制增量恢复的起点
  6. 如何手动清理binlog(只保留当前使用的,删除其他的),自动清理需要如何配置。

    • 清除某个 binlog 之前的所有日志

      PURGE BINARY LOGS TO 'mysql-bin.000010';
      
    • 或清除指定时间之前的日志

      PURGE BINARY LOGS BEFORE '2025-07-10 00:00:00';
      

      不能清除正在被从库读取的日志

    • 自动清理配置

      在my.cnf中添加:

      expire_logs_days = 7           # 保留7天
      # 或新版:
      binlog_expire_logs_seconds = 604800
      

      运行代码重启生效

  7. binlog 的生命周期和清理机制是什么?如何设置自动过期时间

    • 生命周期由参数 binlog_expire_logs_seconds 决定。
    • 清理方式分为手动(PURGE)和自动(expire)
    • 自动清理是 MySQL 后台线程定期执行的,保证磁盘空间控制。
  8. 如何通过 mysqlbinlog 工具解析 binlog 内容?如何只解析某一个时间段的 binlog

    • 基本用法

      mysqlbinlog /var/lib/mysql/mysql-bin.000001
      
    • 只解析某一时间段:

      mysqlbinlog --start-datetime="2025-07-10 12:00:00" \--stop-datetime="2025-07-10 13:00:00" \/var/lib/mysql/mysql-bin.000001
      

      可以重定向为SQL文件

      mysqlbinlog ... > recover.sql
      
  9. 配置文件中确保开启了binlog,并且使用ROW格式。

    • 在my.cnf中配置:

      [mysqld]
      log-bin=mysql-bin
      binlog_format=ROW
      server-id=1
      

      然后重启MySQL服务

  10. 对数据库进行全量备份,使用之前创建的任意表格新增3条记录。

    • 全量备份 mysqldump

      mysqldump -u root -p --all-databases --single-transaction --master-data=2 > full_backup.sql
      
    • 插入记录

      insert into student values (1001,'张三',18);
      insert into student values (1002,'李四',20);
      insert into student values (1003,'王五',22);
      
  11. drop整个表,之后使用binlog还原表,包括新增的3条记录。

    1. 查找 drop 前的 binlog 位置或时间

    2. 使用 mysqlbinlog 导出 binlog SQL

      mysqlbinlog --start-datetime="2025-07-10 10:00:00" \--stop-datetime="2025-07-10 12:00:00" \/var/lib/mysql/mysql-bin.000003 > recover.sql
      
    3. 手动编辑文件:只保留建表和插入语句

    4. 执行SQL恢复数据:

      mysql -u root -p < recover.sql
      
  12. 主从同步中的binlog与relaylog有什么关系

    • 从库 I/O 线程将主库 binlog 拉过来,写入 relay log,再由 SQL 线程执行

    • 日志类型主库 or 从库作用
      Binlog主库记录主库的所有更改操作
      Relay log从库是从库从主库拉过来的 binlog 拷贝
  13. mysql主从同步时是如何保障数据一致性的

    • 日志驱动:主库写操作记录到 binlog,从库 IO 线程拉取 binlog 存为 relay log,SQL 线程顺序执行 relay log 语句,复刻主库变更。
    • 顺序执行:从库 SQL 线程串行应用 relay log,严格遵循主库事务提交顺序,避免乱序导致的数据冲突。
    • GTID(可选):为事务分配全局唯一 ID,精准标记已同步事务,防重复执行,简化故障切换时的断点定位。
    • 故障校验:从库通过心跳检测主从连接,结合Seconds_Behind_Master监控延迟,异常时触发重连 / 修复,维持同步链路。
      本质是靠日志复制 + 串行重演 + 状态校验,让从库精准复刻主库数据流转,保障最终一致。
  14. 按照时间顺序,描述主从同步的所有步骤

    1. 主库记录 binlog

      • 所有 DML 操作被写入 binlog。
        主库对 DML(增删改)、DDL(建表等)操作,会按binlog_format(STATEMENT/ROW/MIXED)格式写入 binlog,是复制的基础,
    2. 从库 I/O 线程连接主库

      • 发起 COM_BINLOG_DUMP 请求。
        从库启动后,IO线程通过CHANGE MASTER TO配置的主库信息,发起COM_BINLOG_DUMP协议请求,拉取 binlog
    3. 主库传送 binlog 内容

      • 主库的 dump 线程发送 binlog 给从库。
        主库响应请求后,会创建dump线程,持续将 binlog 事件推送给从库
    4. 从库写入 relay log

      • I/O 线程把 binlog 内容保存为中继日志(relay log)。
        从库IO线程接收的 binlog,会先落地为中继日志(relay log),避免直接应用时中断丢失
    5. SQL 线程读取 relay log

      • 从库 SQL 线程按顺序执行这些操作,实现数据同步。
        从库SQL线程串行解析 relay log,重演 SQL 操作,保证主从数据最终一致
    6. 完成复制

    • binlog 与事务的关联:主库写 binlog 时,会通过两阶段提交(2PC) 保证与 InnoDB redo log 一致,避免主从数据分裂。
    • relay log 的管理:从库会自动清理过期 relay log(可通过relay_log_purge等参数控制),防止日志膨胀。
    • 异常场景处理:若主从网络中断,IO线程会自动重连;若 SQL 线程执行报错(如主键冲突),需人工介入修复(如跳过事务、修正数据

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

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

相关文章

走进computed,了解computed的前世今生

computed&#xff08;计算属性&#xff09;并不是vue独创的&#xff0c;而是源自计算机科学和响应式编程的长期发展 计算理论的奠基&#xff1a; 函数式编程的纯函数思想&#xff1a;计算属性的核心特征&#xff08;无副作用、依赖输入确定输出&#xff09;直接来源于函数式编程…

Java 23 新特性解析与代码示例

Java 23 新特性解析与代码示例 文章目录Java 23 新特性解析与代码示例1. 引言2. 正式特性2.1. Markdown文档注释 (JEP 467)2.2. 废弃sun.misc.Unsafe的内存访问方法以移除 (JEP 471)2.3. ZGC&#xff1a;默认启用代际模式 (JEP 474)3. 预览特性3.1. 原始类型在模式、instanceof…

spring boot + mybatis + mysql 只有一个实体类的demo

使用MyBatis进行数据库操作&#xff0c;配置简单。主要演示了mybatis可以不用只使用方法名来对应mapper.java和mapper.xml。 目录结构 pom.xml src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── springbootjdbcweb/ │ │ └── …

iRemovalPro完美绕iCloud插卡打电话,A12+支持iOS 18.1.1

iRemovalPro 专业工具全解析与操作指南 &#xff08;支持iOS 14.0 - 16.6.1&#xff0c;A7-A15芯片设备&#xff09; &#x1f449;下载地址见文末 iRemoval Pro iRemoval 专业版是一款来自外国安全研究员的工具&#xff0c;用来帮助一些人因为忘记自己的ID或者密码&#xff0c…

安卓SELinux策略语法

目录前言一、 通用AV规则语法1.1 allow source target:class permissions;1.2 neverallow source target:class permissions;二、type三、attribute四、typeattribute五、alias六、typealias七、init_daemon_domain7.1 init_daemon_domain 宏概述7.2 宏展开与实现7.2.1 展开后规…

vscode cursor配置php的debug,docker里面debug

VSCode PHP调试配置指南 概述 本文介绍如何在VSCode中配置PHP调试环境&#xff0c;包括本地和Docker环境。 前置要求 VSCodePHP 7.0Xdebug扩展PHP Debug VSCode扩展 本地调试配置 1. 安装Xdebug # Ubuntu/Debian sudo apt-get install php-xdebug# MacOS brew install p…

elk部署加日志收集

清华大学镜像源地址&#xff1a;Index of /elasticstack/8.x/yum/8.13.2/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 一、elasticsearch 1.安装 rpm -ivh elastic-agent-8.13.2-x86_64.rpm 2.修改配置 vim /etc/elasticsearch/elasticsearch.yml 修改如下&…

dify 升级1.7.1 插件无法下载依赖

dify 升级1.7.1 插件无法下载依赖 1. 安装通义千问插件&#xff0c;各种报错&#xff1b; 使用下面命令查看docker 镜像日志 docker logs -f --tail100 docker-plugin_daemon-1 2025/08/01 07:42:21 full_duplex.go:59: [INFO]init environment for plugin langgenius/tongyi…

linux中简易云盘系统项目实战:基于 TCP协议的 Socket 通信、json数据交换、MD5文件区别与多用户文件管理实现

&#x1f4cb; 项目介绍 本项目是一个基于Linux环境的简易云盘系统&#xff0c;采用C/S&#xff08;客户端/服务器&#xff09;架构&#xff0c;实现了类似百度网盘的基本功能。系统通过TCP Socket进行网络通信&#xff0c;使用JSON格式进行数据交换&#xff0c;利用SQLite3数据…

linux中posix消息队列的使用记录

在linux中使用posix中的消息队列时遇到了一个问题&#xff0c;就是在发送消息时&#xff0c;如果队列满了&#xff0c;mq_send接口会一直阻塞&#xff0c;经过查找资料后才发现&#xff0c;该接口默认是阻塞的&#xff0c;也就是说&#xff0c;当队列满了以后&#xff0c;接口会…

01 基于sklearn的机械学习-机械学习的分类、sklearn的安装、sklearn数据集及数据集的划分、特征工程(特征提取与无量纲化、特征降维)

文章目录机械学习机械学习分类1. 监督学习2. 半监督学习3. 无监督学习4. 强化学习机械学习的项目开发步骤scikit-learn1 scikit-learn安装2 sklearn数据集1. sklearn 玩具数据集鸢尾花数据集糖尿病数据集葡萄酒数据集2. sklearn现实世界数据集20 新闻组数据集3. 数据集的划分特…

n8n】n8n的基础概念

以下是为初学者整理的 n8n 基本概念总结&#xff0c;帮助快速理解核心功能和使用逻辑&#xff1a;1. 工作流&#xff08;Workflow&#xff09;核心单元&#xff1a;n8n的一切操作基于工作流&#xff0c;代表一个自动化流程。组成&#xff1a;由多个节点&#xff08;Nodes&#…

机器学习基础-matplotlib

一、相关知识点二、plotfrom pylab import mpl # 设置显示中文字体 mpl.rcParams["font.sans-serif"] ["SimHei"] # 设置正常显示符号 mpl.rcParams["axes.unicode_minus"] False #%%#%% import matplotlib.pyplot as plt import random# 画出…

spring-ai-alibaba 学习(十九)——graph之条件边、并行节点、子图节点

前面了解了基础的概念及流程&#xff0c;以及一些参数类下面了解一些特殊的边和节点条件边常见的流程图可能长这个样子&#xff1a;其中菱形的为条件节点&#xff08;或者叫判定节点&#xff09;&#xff0c;但是在spring-ai-alibaba-graph中&#xff0c;并没有条件节点在sprin…

深入浅出设计模式——创建型模式之原型模式 Prototype

文章目录原型模式简介原型模式结构关于克隆方法&#xff1a;浅拷贝/深拷贝原型模式代码实例定义原型类和克隆方法客户端使用代码示例示例一&#xff1a;浅拷贝示例二&#xff1a;深拷贝原型模式总结开闭原则代码仓库原型模式&#xff1a;用原型实例指定创建对象的种类&#xff…

.NET 10 中的新增功能系列文章3—— .NET MAUI 中的新增功能

.NET 10 预览版 6 中的 .NET MAUI.NET 10 预览版 5 中的.NET MAUI.NET 10 预览版 4 中的 .NET MAUI.NET 10 预览版 3 中的 .NET MAUI.NET 10 预览版 2 中的 .NET MAUI.NET 10 预览版 1 中的 .NET MAUI 一、MediaPicker 增强功能&#xff08;预览版6&#xff09; .NET 10 预览…

MT Photos图库部署详解:Docker搭建+贝锐蒲公英异地组网远程访问

如今&#xff0c;私有化部署轻量级图床/图库系统&#xff0c;已经成为越来越多用户的高频需求。而MT Photos&#xff0c;正是一款非常适合在Docker环境下运行的自托管图床/图库系统。MT Photos基于Node.js与Vue构建&#xff0c;界面简洁美观&#xff0c;支持多用户权限管理、多…

解决dbeaver连接不上oceanbase数据库的问题

解决dbeaver连接不上oceanbase数据库的问题 问题&#xff1a; 使用dbeaver连接oceanbase数据库报错如下&#xff1a; ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘dat…

Kafka——请求是怎么被处理的?

引言在分布式消息系统中&#xff0c;请求处理机制是连接客户端与服务端的"神经中枢"。无论是生产者发送消息、消费者拉取数据&#xff0c;还是集群内部的元数据同步&#xff0c;都依赖于高效的请求处理流程。Apache Kafka作为高性能消息队列的代表&#xff0c;其请求…

区块链技术如何确保智能合约的安全性和可靠性?

智能合约作为区块链上自动执行的可编程协议&#xff0c;其安全性和可靠性直接决定了区块链应用的信任基础。区块链通过底层技术架构、密码学工具和机制设计的多重保障&#xff0c;构建了智能合约的安全防线。以下从技术原理、核心机制和实践保障三个维度展开分析&#xff1a;一…