Mysql中的日志系统

文章目录

  • 1. 慢查询日志(Slow Query Log)
    • 1.1 是否开启慢查询日志
    • 1.2 开启慢查询日志,设置时间阈值
      • 1.2.1 修改文件my.ini
      • 1.2.2 重启mysql后配置生效
    • 1.3 查看慢查询日志
      • 1.3.1 直接用文本编辑器打开
      • 1.3.2 使用mysqldumpslow进行分析
  • 2. InnoDB 重做日志(Redo Logs)
  • 3. 二进制日志(Binary Log / Binlog)
    • 3.1 MySQL整体来看,其实就有两块:server + 存储引擎
    • 3.2 为什么redolog、binlog同时存在
    • 3.3 redolog、binlog日志有以下三点不同
    • 3.4 有了对这两个日志的概念性理解,我们再来看执行器和InnoDB引擎在执行update语句时的内部流程
    • 3.5 两阶段提交
    • 3.6 redo log、binlog的其他一些知识点
  • 4. InnoDB 回滚日志(Undo Log)
  • 5. Mysql各种日志简介

1. 慢查询日志(Slow Query Log)

1.1 是否开启慢查询日志

查询命令:SHOW VARIABLES LIKE ‘slow_query_log’;

1.2 开启慢查询日志,设置时间阈值

1.2.1 修改文件my.ini

[mysqld]
basedir=D:\javasoft\mysql8\mysql-8.0.27-winx64\mysql-8.0.27-winx64\
datadir=D:\javasoft\mysql8\mysql-8.0.27-winx64\mysql-8.0.27-winx64\data\
port=3306
slow_query_log = 1       # 开启慢查询日志
long_query_time = 2      # 设置慢查询阈值,默认为10秒,这里设置为2秒
slow_query_log_file = D:\javasoft\mysql8\mysql-8.0.27-winx64\mysql-8.0.27-winx64\slow_log\slow-query.log    # 指定慢查询日志存放路径及文件名

1.2.2 重启mysql后配置生效

  • 以管理员身份打开cmd
  • 启动:net start mysql
  • 登录:mysql -u root -p -h localhost
  • 查看慢查询开关: show variables like ‘slow_query_log’; 这里复制直接粘贴执行会出错,不知道为啥,大家可以手敲

在这里插入图片描述

1.3 查看慢查询日志

1.3.1 直接用文本编辑器打开

在这里插入图片描述

1.3.2 使用mysqldumpslow进行分析

mysqldumpslow -t 10 /data/mysql/mysql-slow.log #显示出慢查询日志中最慢的10条sql
在这里插入图片描述

2. InnoDB 重做日志(Redo Logs)

  • redo log主要用于崩溃恢复,主要是mysql崩溃时

  • 而binlog主要用于归档,有了归档,若数据误删除,就可以将数据恢复到某个节点,主从同步也依赖binlog,主要解决人为造成的数据问题及数据同步

  • 数据库崩溃恢复使用redo log,binlog没有被用来做崩溃恢复。操作上的原因是,binlog是可以关的,你如果有权限,可以set sql_log_bin=0关掉本线程的binlog日志。 所以只依赖binlog来恢复就靠不住。

  • redo log用于保证crash-safe能力。innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。这个参数我建议你设置成1,这样可以保证MySQL异常重启之后数据不丢失。

  • 物理日志

  • 是InnoDB存储引擎独有的

  • 在MySQL里有个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。为了解决这个问题,MySQL的设计者就用redo日志来提供效率,其实就是WAL技术,WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘

  • 当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log(粉板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做

  • InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么这块“粉板”总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。
    在这里插入图片描述

    write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

    write pos和checkpoint之间的是空着的部分,可以用来记录新的操作。如果write pos追上checkpoint,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。

  • 有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。

3. 二进制日志(Binary Log / Binlog)

3.1 MySQL整体来看,其实就有两块:server + 存储引擎

  • 一块是Server层,它主要做的是MySQL功能层面的事情;redo log是InnoDB引擎特有的日志
  • 还有一块是引擎层,负责存储相关的具体事宜。Server层也有自己的日志,称为binlog(归档日志)。

3.2 为什么redolog、binlog同时存在

  • 因为最开始MySQL里并没有InnoDB引擎。MySQL自带的引擎是MyISAM,但是MyISAM没有crash-safe的能力,binlog日志只能用于归档。
  • 而InnoDB是另一个公司以插件形式引入MySQL的,既然只依靠binlog是没有crash-safe能力的,所以InnoDB使用另外一套日志系统——也就是redo log来实现crash-safe能力。

3.3 redolog、binlog日志有以下三点不同

  1. redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。

  2. redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。

  3. redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

3.4 有了对这两个日志的概念性理解,我们再来看执行器和InnoDB引擎在执行update语句时的内部流程

  1. 执行器先找引擎取ID=2这一行。ID是主键,引擎直接用树搜索找到这一行。如果ID=2这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。

  2. 执行器拿到引擎给的行数据,把这个值加上1,比如原来是N,现在就是N+1,得到新的一行数据,再调用引擎接口写入这行新数据。

  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。

  4. 执行器生成这个操作的binlog,并把binlog写入磁盘。

  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交(commit)状态,更新完成。

这里我给出这个update语句的执行流程图,图中浅色框表示是在InnoDB内部执行的,深色框表示是在执行器中执行的。

在这里插入图片描述
你可能注意到了,最后三步看上去有点“绕”,将redo log的写入拆成了两个步骤:prepare和commit,这就是"两阶段提交"。

3.5 两阶段提交

两阶段提交是为了让两份日志之间的逻辑一致,两阶段提交是跨系统维持数据逻辑一致性时常用的一个方案

怎样让数据库恢复到半个月内任意一秒的状态?

前面我们说过了,binlog会记录所有的逻辑操作,并且是采用“追加写”的形式。如果你的DBA承诺说半个月内可以恢复,那么备份系统中一定会保存最近半个月的所有binlog,同时系统会定期做整库备份。这里的“定期”取决于系统的重要性,可以是一天一备,也可以是一周一备。

当需要恢复到指定的某一秒时,比如某天下午两点发现中午十二点有一次误删表,需要找回数据,那你可以这么做:

  • 首先,找到最近的一次全量备份,如果你运气好,可能就是昨天晚上的一个备份,从这个备份恢复到临时库;
  • 然后,从备份的时间点开始,将备份的binlog依次取出来,重放到中午误删表之前的那个时刻。

这样你的临时库就跟误删之前的线上库一样了,然后你可以把表数据从临时库取出来,按需要恢复到线上库去。

好了,说完了数据恢复过程,我们回来说说,为什么日志需要“两阶段提交”。这里不妨用反证法来进行解释。

由于redo log和binlog是两个独立的逻辑,如果不用两阶段提交,要么就是先写完redo log再写binlog,或者采用反过来的顺序。我们看看这两种方式会有什么问题。

仍然用前面的update语句来做例子。假设当前ID=2的行,字段c的值是0,再假设执行update语句过程中在写完第一个日志后,第二个日志还没有写完期间发生了crash,会出现什么情况呢?

  • 先写redo log后写binlog。假设在redo log写完,binlog还没有写完的时候,MySQL进程异常重启。由于我们前面说过的,redo log写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行c的值是1。
    但是由于binlog没写完就crash了,这时候binlog里面就没有记录这个语句。因此,之后备份日志的时候,存起来的binlog里面就没有这条语句。
    然后你会发现,如果需要用这个binlog来恢复临时库的话,由于这个语句的binlog丢失,这个临时库就会少了这一次更新,恢复出来的这一行c的值就是0,与原库的值不同。

  • 先写binlog后写redo log。如果在binlog写完之后crash,由于redo log还没写,崩溃恢复以后这个事务无效,所以这一行c的值是0。但是binlog里面已经记录了“把c从0改成1”这个日志。所以,在之后用binlog来恢复的时候就多了一个事务出来,恢复出来的这一行c的值就是1,与原库的值不同。

可以看到,如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。

你可能会说,这个概率是不是很低,平时也没有什么动不动就需要恢复临时库的场景呀?

其实不是的,不只是误操作后需要用这个过程来恢复数据。当你需要扩容的时候,也就是需要再多搭建一些备库来增加系统的读能力的时候,现在常见的做法也是用全量备份加上应用binlog来实现的,这个“不一致”就会导致你的线上出现主从数据库不一致的情况。

简单说,redo log和binlog都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。

3.6 redo log、binlog的其他一些知识点

  • Redo log不是记录数据页“更新之后的状态”,而是记录这个页 “做了什么改动”。
    Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。

  • binlog还不能去掉。
    一个原因是,redolog只有InnoDB有,别的引擎没有。
    另一个原因是,redolog是循环写的,不持久保存,binlog的“归档”这个功能,redolog是不具备的。

  • 两阶段提交:
    1 prepare阶段 2 写binlog 3 commit
    当在2之前崩溃时
    重启恢复:后发现没有commit,回滚。备份恢复:没有binlog 。
    一致
    当在3之前崩溃
    重启恢复:虽没有commit,但满足prepare和binlog完整,所以重启后会自动commit。备份:有binlog. 一致

4. InnoDB 回滚日志(Undo Log)

  • 用于事务处理和多版本并发控制(MVCC),记录了对数据修改前的原始值,当事务回滚时可以用来恢复数据至修改前的状态。
  • 是InnoDB存储引擎内部用于事务回滚和MVCC(多版本并发控制)的重要机制,它并不直接提供给用户查看其内容。Undo日志以页为单位存储在系统表空间或独立的Undo表空间中,并且由数据库管理系统自动维护。

undo log引用

5. Mysql各种日志简介

每种日志都有其特定用途,并且在不同情况下分别提供关于MySQL服务器行为的不同视角。根据实际需求和运维要求,管理员可以选择启用或禁用不同的日志,并调整相应的配置选项。

  1. 错误日志(Error Log)

    • 记录MySQL服务器启动、运行时出现的任何严重错误、警告和其他重要消息。这是调试和解决MySQL服务器问题的重要资源。
  2. 查询日志(General Query Log / General Log)

    • 记录所有连接到MySQL服务器的客户端执行的所有SQL语句,包括成功的查询、失败的查询以及连接断开等信息。启用此日志可能会对性能产生影响,因为它记录了大量的详细数据。
  3. 慢查询日志(Slow Query Log)

    • 仅记录执行时间超过特定阈值的SQL查询,有助于识别并优化性能低下的SQL语句。可以通过设置long_query_time参数来控制记录哪些查询为“慢查询”。
  4. 二进制日志(Binary Log / Binlog)

    • 记录了对数据库进行更改的所有操作(如INSERT、UPDATE、DELETE、CREATE TABLE等),但不包括SELECT操作。二进制日志是基于事件的,主要用于MySQL主从复制以及其他数据恢复场景。
  5. InnoDB事务日志(Redo Logs)

    • 对于使用InnoDB存储引擎的表,存在两组重做日志文件(Redo Log)。这些日志用于确保事务的持久性,在系统崩溃时能够通过回放日志恢复未写入磁盘的数据。
  6. 审计日志(Audit Log)

    • MySQL支持审计插件,可以用来记录用户登录、权限变更、SQL语句执行等安全相关的操作。不过,这需要额外安装和配置审计插件。
  7. Relay Log(中继日志)

    • 在MySQL主从复制架构中,从库接收到主库二进制日志的事件后,会将这些事件写入到自身的Relay Log中,并按顺序执行。这是实现主从数据同步的关键步骤。
  8. InnoDB Undo Log(回滚日志)

    • 用于事务处理和多版本并发控制(MVCC),记录了对数据修改前的原始值,当事务回滚时可以用来恢复数据至修改前的状态。
  9. Performance Schema Event and Stage Statistics(性能模式事件与阶段统计信息)

    • 虽然严格意义上并非日志文件,但Performance Schema提供了详细的服务器内部运行状况和资源使用情况的实时监控数据,包括锁、线程状态、内存分配等。
  10. Thread-Specific Error Logs(线程特定错误日志)

    • MySQL支持为每个客户端连接创建单独的错误日志文件,但这需要特殊的配置来启用。
  11. Tablespaces Disk Image Log (DDL Log)

    • MySQL 8.0引入了一个新的特性,称为DDL日志,它记录了关于表空间管理的DDL操作,有助于在崩溃恢复期间重建表空间元数据。
  12. Purge Log(清除日志)

    • 在InnoDB存储引擎中,当事务被提交并持久化后,其对应的Undo页可以被标记为可回收。Purge线程负责检查这些已提交事务的Undo页,并将其从Undo表空间中删除。虽然没有专门的purge log文件,但这个过程在后台进行,对于数据库性能和空间管理至关重要。
  13. Replication Event Logs(复制事件日志)

    • MySQL Replication基于GTID(全局事务标识符)时,会生成与GTID相关的事件记录。这些信息有助于管理和监控复杂的复制拓扑结构。
  14. Performance Schema Trace and Slow Query Events(性能模式跟踪与慢查询事件)

    • 性能模式除了统计信息之外,还可以配置为记录SQL语句执行的详细跟踪信息以及更详细的慢查询数据。
  15. CSV or JSON Audit Plugins(CSV或JSON格式审计插件日志)

    • MySQL提供了多种审计插件实现,如audit_log、audit_null等,可以根据需求将审计日志输出为CSV或JSON格式,便于后续分析处理。
  16. Proxy Protocol Log(代理协议日志)

    • 当MySQL服务器通过支持Proxy Protocol的负载均衡器接收连接时,可能会有专门的日志记录客户端原始IP地址等信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IaC基础设施即代码:Terraform 使用 dynamic动态内联块 创建docker资源

目录 一、实验 1.环境 2.Terraform查看版本 3.Linux主机安装Docker 4.Terraform使用本地编译(In-house)的Providers 5.Docker-CE 开启远程API 6. Linux主机拉取镜像 7.Terraform 使用 dynamic动态内联块 创建资源 二、问题 1.Terraform 计划资源…

Python数据分析案例32——财经新闻爬虫和可视化分析

案例背景 很多同学的课程作业都是需要自己爬虫数据然后进行分析,这里提供一个财经新闻的爬虫案例供学习。本案例的全部数据和代码获取可以参考:财经新闻数据 数据来源 新浪财经的新闻网,说实话,他这个网站做成这样就是用来爬虫的…

64.Spring事件监听的核心机制是什么?

Spring事件监听的核心机制是什么? spring的事件监听有三个部分组成 事件(ApplicationEvent) 负责对应相应监听器 事件源发生某事件是特定事件监听器被触发的原因监听器(ApplicationListener) 对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应…

方案解决:5G基站节能及数字化管理

截至2023年10月,我国5G基站总数达321.5万个,占全国通信基站总数的28.1%。然而,随着5G基站数量的快速增长,基站的能耗问题也逐渐日益凸显,基站的用电给运营商带来了巨大的电费开支压力,降低5G基站的能耗成为…

递归、搜索与回溯算法(专题六:记忆化搜索)

目录 1. 什么是记忆化搜索(例子:斐波那契数) 1.1 解法一:递归 1.2 解法二:记忆化搜索 1.2.1 记忆化搜索比递归多了什么? 1.2.2 提出一个问题:什么时候要使用记忆化搜索呢? 1.3 …

比吸收率(SAR)

本文旨在介绍比吸收率(Specific Absorption Rate)的基本知识。搬运自https://www.antenna-theory.com。英语够用的朋友可以直接移步。感谢网站创始人Peter Joseph Bevelacqua教授的无私奉献。 ------------------我是分隔线------------------- 比吸收…

视频号的视频怎么下载到手机,视频号下载提取到手机有几个步骤?

要下载视频号的视频并提取到手机,可以按照以下步骤操作,具体一起来看看。 电脑版视频号下载到手机 第一步:找到你心仪的视频号视频在电脑中你也可以通过搜索并找到自己需要的视频并分享给视频下载助手; 第二大步:视频…

C++ 设计模式之备忘录模式

【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是备忘录模式 (第17种模式) 备忘录模式(Meme…

如何使用万能头 #include<bits/stdc++.h>

准备蓝桥杯的时候看到了很多头文件包含了这个头文件,后来查了一下 它是C中支持的一个几乎万能的头文件,几乎包含所有的可用到的C库函数。以后写代码就可以直接引用这一个头文件了,不需要在写一大堆vector、string、map、stack…… 我们该如何…

zookeeper弱密码漏洞修复

1.连接zookeeper 进入zookeeper安装目录 bin目录下 ./zkCli.sh -server IP:21812.查看节点 ls /3.查看节点权限 getAcl /zookeeper4.设置IP权限 setAcl / ip:127.0.0.1:cdrwa,ip:10.86.30.11:cdrwazookeeper的权限不具备继承性,父子节点的权限相互独立,因此需要为每个子…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (三)

论文阅读笔记AI篇 —— Transformer模型理论实战 (三) 第三遍阅读(精读)3.1 Attention和Self-Attention的区别?3.2 Transformer是如何进行堆叠的?3.3 如何理解Positional Encoding?3.x 文章涉及…

浅析Redis①:命令处理核心源码分析(上)

写在前面 Redis作为我们日常工作中最常使用的缓存数据库,其重要性不言而喻,作为普调开发者,我们在日常开发中使用Redis,主要聚焦于Redis的基层数据结构的命令使用,很少会有人对Redis的内部实现机制进行了解&#xff0c…

龙哥的问题(积性函数,莫比乌斯反演)

题目路径: 221. 龙哥的问题 - AcWing题库 思路:

golang 中使用 statik 将静态资源编译进二进制文件中

现在的很多程序都会提供一个 Dashboard 类似的页面用于查看程序状态并进行一些管理的功能,通常都不会很复杂,但是其中用到的图片和网页的一些静态资源,如果需要用户额外存放在一个目录,也不是很方便,如果能打包进程序发…

《游戏-01_2D-开发》

首先利用安装好的Unity Hub创建一个unity 2D(URP渲染管线)项目 选择个人喜欢的操作格局(这里采用2 by 3) 在Project项目管理中将双栏改为单栏模式(个人喜好) 找到首选项(Preferences&#xff09…

带你学C语言-指针(4)

目录 ​编辑 ⚾0.前言 🏀1.回调函数 ⚽2.qsort 🏉2.1 qsort函数的模拟实现 🎾3.sizeof与strlen对比 🎾4.结束语 ⚾0.前言 言C之言,聊C之识,以C会友,共向远方。各位CSDN的各位你们好啊&…

docker 使用 vcs/2018 Verdi等 eda 软件

好不容易在ubuntu 安装好了eda软件,转眼就发现了自己的无知。 有博主几年前就搞定了docker上的EDA工具。而且更全,更简单。只恨自己太无知啊。 Synopsys EDA Tools docker image - EDA资源使用讨论 - EETOP 创芯网论坛 (原名:电子顶级开发网…

OB OCP工具

文章目录 OCP产品架构OCP核心功能集群管理-集群拓扑图告警管理 OCP OCP(OceanBase Cloud Platform)是企业级数据库管理平台OceanBase 云平台(OceanBase Cloud Platform,OCP)是以 OceanBase 为核心的企业级数据库管理平…

2024年【焊工(初级)】考试总结及焊工(初级)模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 焊工(初级)考试总结是安全生产模拟考试一点通总题库中生成的一套焊工(初级)模拟考试,安全生产模拟考试一点通上焊工(初级)作业手机同…

canvas绘制图形

目录 1、canvas绘制矩形 2、canvas绘制线 3、canvas绘制圆 4、canvas绘制多圈动画圆 HTML5<canvas>元素用于图形的绘制&#xff0c;Canvas API主要聚焦于2D图形。 1、canvas绘制矩形 canvas是一个二维网格&#xff0c;左上角坐标为(0,0)&#xff0c;横轴为x轴&…