返回顶部
首页 > 资讯 > 数据库 >MySQL中常见的日志问题有哪些
  • 746
分享到

MySQL中常见的日志问题有哪些

2024-04-02 19:04:59 746人浏览 独家记忆
摘要

小编给大家分享一下Mysql中常见的日志问题有哪些,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql 里有两个日志,即:重做日志(redo log)和归档日志(binlog)。其中,bi

小编给大家分享一下Mysql中常见的日志问题有哪些,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

mysql 里有两个日志,即:重做日志(redo log)和归档日志(binlog)。

其中,binlog 可以给备库使用,也可以保存起来用于恢复数据库历史数据。它是实现在 server 层的,所有引擎可以共用。redo log 是 InnoDB 特有的日志,用来支持 crash-safe 能力。

你一定听过 Mysql 事务的两阶段提交,指的就是在事务提交的时候,分成 prepare 和 commit 两个阶段。

如图 1 所示为一个事务的执行流程,你在最后三步可以看到,redo log 先 prepare 完成,再写 binlog,最后才进入 redo log commit 阶段。

MySQL中常见的日志问题有哪些

图 1 两阶段提交示意图

这里,我要先和你解释一个误会式的问题:这个图不就是一个 update 语句的执行流程吗,怎么还会调用 commit 语句?

通常情况下,你会产生这个疑问的原因,在于把两个“commit”的概念混淆了:

问题中的“commit 语句”,是指 MySQL 语法中,用于提交一个事务的命令。一般跟 begin/start transaction 配对使用。

而我们图中用到的这个“commit 步骤”,指的是事务提交过程中的一个小步骤,也是最后一步。当这个步骤执行完成后,这个事务就提交完成了。

“commit 语句”执行的时候,会包含“commit 步骤”。

而我们这个例子里面,没有显式地开启事务,因此这个 update 语句自己就是一个事务,在执行完成后提交事务时,就会用到这个“commit 步骤”。

接下来,我们就一起分析一下在两阶段提交的不同时刻,MySQL 异常重启会出现什么现象。

如果在图中时刻 A 的地方,也就是写入 redo log 处于 prepare 阶段之后、写 binlog 之前,发生了崩溃(crash),由于此时 binlog 还没写,redo log 也还没提交,所以崩溃恢复的时候,这个事务会回滚。这时候,binlog 还没写,所以也不会传到备库。到这里,我们都可以理解。

而我们理解会出现问题的地方,主要集中在时刻 B,也就是 binlog 写完,redo log 还没 commit 前发生 crash,那崩溃恢复的时候 MySQL 会怎么处理?

我们先来看一下崩溃恢复时的判断规则。

1、如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交;

2、如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:

a.如果是,则提交事务;

b.否则,回滚事务。

这里,时刻 B 发生 crash 对应的就是 2(a) 的情况,崩溃恢复过程中事务会被提交。

现在,我们就针对两阶段提交再继续延展一下。

问题 1:MySQL 怎么知道 binlog 是完整的?

回答:一个事务的 binlog 是有完整格式的:

如果碰到既有 prepare、又有 commit 的 redo log,就直接提交;

如果碰到只有 parepare、而没有 commit 的 redo log,就拿着 XID 去 binlog 找对应的事务。

问题 3:处于 prepare 阶段的 redo log 加上完整 binlog,重启就能恢复,MySQL 为什么要这么设计?

回答:其实,这个问题还是跟我们在反证法中说到的数据与备份的一致性有关。在时刻 B,也就是 binlog 写完以后 MySQL 发生崩溃,这时候 binlog 已经写入了,之后就会被从库(或者用这个 binlog 恢复出来的库)使用。

所以,在主库上也要提交这个事务。采用这个策略,主库和备库的数据就保证了一致性。

问题 4:如果这样的话,为什么还要两阶段提交呢?干脆先 redo log 写完,再写 binlog。崩溃恢复的时候,必须得两个日志都完整才可以。是不是一样的逻辑?

回答:其实,两阶段提交是经典的分布式系统问题,并不是 MySQL 独有的。

如果必须要举一个场景,来说明这么做的必要性的话,那就是事务的持久性问题。

对于 InnoDB 引擎来说,如果 redo log 提交完成了,事务就不能回滚(如果这还允许回滚,就可能覆盖掉别的事务的更新)。而如果 redo log 直接提交,然后 binlog 写入的时候失败,InnoDB 又回滚不了,数据和 binlog 日志又不一致了。

两阶段提交就是为了给所有人一个机会,当每个人都说“我 ok”的时候,再一起提交。

问题 5:不引入两个日志,也就没有两阶段提交的必要了。只用 binlog 来支持崩溃恢复,又能支持归档,不就可以了?

回答:我把这个问题再翻译一下的话,是说只保留 binlog,然后可以把提交流程改成这样:... -> “数据更新到内存” -> “写 binlog” -> “提交事务”,是不是也可以提供崩溃恢复的能力?

答案是不可以。

如果说历史原因的话,那就是 InnoDB 并不是 MySQL 的原生存储引擎。MySQL 的原生引擎是 MyISAM,设计之初就有没有支持崩溃恢复。

InnoDB 在作为 MySQL 的插件加入 MySQL 引擎家族之前,就已经是一个提供了崩溃恢复和事务支持的引擎了。

InnoDB 接入了 MySQL 后,发现既然 binlog 没有崩溃恢复的能力,那就用 InnoDB 原有的 redo log 好了。

而如果说实现上的原因的话,就有很多了。就按照问题中说的,只用 binlog 来实现崩溃恢复的流程,我画了一张示意图,这里就没有 redo log 了。

MySQL中常见的日志问题有哪些

图 2 只用 binlog 支持崩溃恢复

这样的流程下,binlog 还是不能支持崩溃恢复的。我说一个不支持的点吧:binlog 没有能力恢复“数据页”。

如果在图中标的位置,也就是 binlog2 写完了,但是整个事务还没有 commit 的时候,MySQL 发生了 crash。

重启后,引擎内部事务 2 会回滚,然后应用 binlog2 可以补回来;但是对于事务 1 来说,系统已经认为提交完成了,不会再应用一次 binlog1。

但是,InnoDB 引擎使用的是 WAL 技术,执行事务的时候,写完内存和日志,事务就算完成了。如果之后崩溃,要依赖于日志来恢复数据页。

也就是说在图中这个位置发生崩溃的话,事务 1 也是可能丢失了的,而且是数据页级的丢失。此时,binlog 里面并没有记录数据页的更新细节,是补不回来的。

你如果要说,那我优化一下 binlog 的内容,让它来记录数据页的更改可以吗?可以,但这其实就是又做了一个 redo log 出来。

所以,至少现在的 binlog 能力,还不能支持崩溃恢复。

问题 6:那能不能反过来,只用 redo log,不要 binlog?

回答:如果只从崩溃恢复的角度来讲是可以的。你可以把 binlog 关掉,这样就没有两阶段提交了,但系统依然是 crash-safe 的。

但是,如果你了解一下业界各个公司的使用场景的话,就会发现在正式的生产库上,binlog 都是开着的。因为 binlog 有着 redo log 无法替代的功能。

一个是归档。redo log 是循环写,写到末尾是要回到开头继续写的。这样历史日志没法保留,redo log 也就起不到归档的作用。

一个就是 MySQL 系统依赖于 binlog。binlog 作为 MySQL 一开始就有的功能,被用在了很多地方。其中,MySQL 系统高可用的基础,就是 binlog 复制。

还有很多公司有异构系统(比如一些数据分析系统),这些系统就靠消费 MySQL 的 binlog 来更新自己的数据。关掉 binlog 的话,这些下游系统就没法输入了。

总之,由于现在包括 MySQL 高可用在内的很多系统机制都依赖于 binlog,所以“鸠占鹊巢” redo log 还做不到。你看,发展生态是多么重要。

最后,推荐你关注丁奇的《MySQL 实战 45 讲》专栏。在专栏里,丁奇会帮你梳理出学习 MySQL 的主线知识,比如事务、索引等,还会就开发过程中经常遇到的具体问题和你分析讨论,并且帮你理解问题背后的本质。你会收获 MySQL 核心技术详解与原理说明和 36 个 MySQL 常见痛点问题解析。

statement 格式的 binlog,最后会有 COMMIT;

row 格式的 binlog,最后会有一个 XID event。

另外,在 MySQL 5.6.2 版本以后,还引入了 binlog-checksum 参数,用来验证 binlog 内容的正确性。对于 binlog 日志由于磁盘原因,可能会在日志中间出错的情况,MySQL 可以通过校验 checksum 的结果来发现。所以,MySQL 还是有办法验证事务 binlog 的完整性的。

问题 2:redo log 和 binlog 是怎么关联起来的?

回答:它们有一个共同的数据字段,叫 XID。崩溃恢复的时候,会按顺序扫描 redo log:

看完了这篇文章,相信你对MySQL中常见的日志问题有哪些有了一定的了解,想了解更多相关知识,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中常见的日志问题有哪些

本文链接: https://lsjlt.com/news/53603.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL中常见的日志问题有哪些
    小编给大家分享一下MySQL中常见的日志问题有哪些,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!MySQL 里有两个日志,即:重做日志(redo log)和归档日志(binlog)。其中,bi...
    99+
    2024-04-02
  • MySql中常见问题有哪些
    这篇文章将为大家详细讲解有关MySql中常见问题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1、默认编码集问题在做前台数据展示的时候...
    99+
    2024-04-02
  • MySQL的常见问题有哪些
    这篇文章主要介绍“MySQL的常见问题有哪些”,在日常操作中,相信很多人在MySQL的常见问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL的常见问题有哪些”...
    99+
    2024-04-02
  • mysql常见问题有哪些
    小编给大家分享一下mysql常见问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. Ca...
    99+
    2024-04-02
  • MySQL常见的日志文件分类有哪些
    下面讲讲关于MySQL常见的日志文件分类有哪些,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL常见的日志文件分类有哪些这篇文章你一定会有所受益。日志对一个系统或者应用来...
    99+
    2024-04-02
  • MySQL服务常见问题有哪些
    1. 连接问题:无法连接到MySQL服务器,可能是因为网络问题、权限问题或者MySQL服务器未启动。2. 授权问题:无法使用特定的用...
    99+
    2023-09-27
    mysql
  • Linux中有哪些常见的问题
    这篇文章主要介绍了Linux中有哪些常见的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、 文档文档及其不足是今年最大的痛点之一。尽管开源的方式产生了优秀的代码,但是制...
    99+
    2023-06-10
  • hive中有哪些常见问题
    小编给大家分享一下hive中有哪些常见问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!hadoop 2.6.1hive 1.2.1或者hiv...
    99+
    2023-06-02
  • mongodb常见的异常日志信息有哪些
    Connection error: 连接到数据库时发生错误,可能是网络问题、认证问题等导致连接失败。 Query error: 查...
    99+
    2024-04-02
  • PHP 日志打包索引,有哪些常见问题需要注意?
    在 PHP 开发中,日志打包索引是非常重要的一个环节,它可以帮助开发者更加方便地查找和定位问题。但是,日志打包索引也存在一些常见问题需要开发者注意。下面将会详细介绍这些问题以及如何解决它们。 日志文件大小限制 在生成日志文件时,需要对...
    99+
    2023-09-18
    日志 打包 索引
  • PHP应用中常见的日志类型有哪些?
    在开发PHP应用程序时,日志记录是非常重要的。它可以帮助开发者追踪代码的执行和调试问题,同时也可以帮助监控系统的健康状态。本文将介绍PHP应用中常见的日志类型及其用途。 应用程序日志 应用程序日志是记录应用程序运行时的信息,包括错误、...
    99+
    2023-11-08
    日志 数据类型 apache
  • MyCAT的常见问题有哪些
    小编给大家分享一下MyCAT的常见问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 一:连...
    99+
    2024-04-02
  • c#常见的问题有哪些
    今天小编给大家分享一下c#常见的问题有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 ...
    99+
    2024-04-02
  • Tunnel的常见问题有哪些
    这篇文章主要介绍“Tunnel的常见问题有哪些”,在日常操作中,相信很多人在Tunnel的常见问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Tunnel的常见问题有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-02
  • 有哪些常见问题会影响PHP应用程序中的Shell日志同步?
    PHP应用程序中的Shell日志同步是一个非常重要的问题,因为它可以确保应用程序的稳定性和可靠性。然而,在实际应用过程中,我们经常会遇到一些常见问题,这些问题可能会影响到PHP应用程序中的Shell日志同步。本文将介绍一些常见问题,并提供一...
    99+
    2023-08-18
    同步 shell 日志
  • Ajax中常见小问题有哪些
    这篇文章主要为大家展示了“Ajax中常见小问题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Ajax中常见小问题有哪些”这篇文章吧。1.ajax跨域传递值...
    99+
    2024-04-02
  • 有哪些常见问题会导致ASP和Apache的日志同步失败?
    ASP和Apache是常用的Web服务器,它们都有日志记录功能。在实际应用中,为了方便管理和分析,我们通常需要将ASP和Apache的日志同步到一起。但是,有时候同步会出现问题,本文将介绍有哪些常见问题会导致ASP和Apache的日志同步失...
    99+
    2023-10-01
    apache 同步 日志
  • Redis常见问题有哪些
    今天就跟大家聊聊有关Redis常见问题有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 1.Redis如何做内存优化...
    99+
    2024-04-02
  • angular常见问题有哪些
    这篇文章主要介绍了angular常见问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。AngularJS可以视为是一种数据优先的框架,...
    99+
    2024-04-02
  • css常见问题有哪些
    小编给大家分享一下css常见问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. CSS 中 inline 元素可以设置...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作