当前位置: 首页 > news >正文

MySQL面试题-日志

目录

1.MySQL 中常见的日志有哪些?

2.慢查询日志有什么用?

3.binlog 主要记录了什么?

4.Mysql的binlog有几种录入格式?分别有什么区别?

5.redo log 如何保证事务的持久性?

6.页修改之后为什么不直接刷盘呢?

7.binlog 和 redolog 有什么区别?

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

9.redo log和binglog如何保证两份日志之间的逻辑一致

10.undo log 如何保证事务的原子性?


1.MySQL 中常见的日志有哪些?

  1. redo log:重做日志,用于恢复数据,保证 MySQL 异常宕机后数据的完整性,只记录物理日志(日志记录了对数据页的修改,而不是逻辑修改),循环写,因为不需要回滚,所以可以覆盖写。

  2. undo log:撤销日志,用于回滚事务,可以保证事务的原子性、一致性和隔离性。记录逻辑日志,循环写,记录事务操作之前的值,便于回滚事务。

  3. binlog:二进制日志,记录所有修改数据库的操作,包括增、删、改等操作,用于数据恢复、数据复制等场景。

  4. error log:错误日志,记录 MySQL 引擎在运行过程中出现的错误、警告等信息,用于排查问题。

  5. slow query log:慢查询日志,记录执行时间超过阈值的 SQL 语句,用于性能调优、查询优化等场景。

  6. general log:通用日志,记录所有客户端的查询和状态变更信息,包括查询、连接、断开等操作,通常用于诊断问题和安全审计。

  7. relay log:中继日志,用于 MySQL 主从复制中的数据传输,从 MySQL 主节点复制数据到从节点。

2.慢查询日志有什么用?

慢查询日志是 MySQL 中用于记录执行时间超过阈值的 SQL 语句的日志,通常用于分析性能问题。它可以记录每条执行时间超过指定阈值的 SQL 语句,并记录下执行时间、访问的表、使用的索引以及执行 SQL 的用户等信息,从而帮助开发人员找到慢查询的原因和优化方案。

慢查询日志可以帮助开发人员识别哪些 SQL 语句执行时间长,从而可以进行针对性的优化。优化的方法包括但不限于优化查询语句的写法、增加索引、分离大表等。通过分析慢查询日志可以让开发人员更加深入地了解系统的瓶颈和性能问题,从而制定更好的优化策略。

慢查询日志的开启和关闭可以通过在 MySQL 配置文件中设置参数 slow_query_loglong_query_time 来实现。其中,slow_query_log 参数用于开启或关闭慢查询日志功能,long_query_time 参数用于设置执行时间超过多少秒的 SQL 语句会被记录到慢查询日志中。

3.binlog 主要记录了什么?

binlog(二进制日志)是 MySQL 的一种日志文件,它记录了所有对数据的修改操作,包括数据库的增删改等操作。它是 MySQL 的一个重要特性,也是实现数据复制、数据恢复和数据安全的基础。

binlog 主要记录以下几类信息:

        1.数据库的增删改操作

        binlog 记录了所有对数据库的增删改操作,包括对表结构的修改。在每次写入操作时,MySQL 会将操作的数据写入 binlog 中。

        2.事务的提交和回滚信息

        当一个事务提交时,MySQL 会将事务提交的信息写入 binlog 中。如果一个事务回滚了,MySQL 也会将回滚信息写入 binlog 中,这个时候的 binlog 记录的信息可以用于数据恢复。

        3.数据库的状态信息

binlog 记录了 MySQL 的状态信息,包括 MySQL 的版本、服务器的 ID、执行的线程 ID 等信息。

binlog 的使用场景:

  1. 数据复制:MySQL 的主从复制是通过 binlog 实现的。主库将修改操作写入 binlog,从库通过读取主库的 binlog 文件进行复制。

  2. 数据恢复:binlog 中记录了所有对数据库的修改操作,因此可以利用 binlog 进行数据恢复。

  3. 数据备份:通过将 binlog 文件进行备份,可以在需要的时候恢复到某一个时间点的数据状态。

需要注意的是,binlog 记录的是 SQL 语句的修改操作,而不是记录行级别的修改。因此在进行数据恢复的时候,如果有使用到非 SQL 语句的修改方式,如直接修改文件等方式,则无法通过 binlog 进行恢复。

4.Mysql的binlog有几种录入格式?分别有什么区别?

MySQL的binlog有三种格式:statement、row、mixed。

  • statement格式:记录的是SQL语句。在主库上执行的SQL语句会被记录到binlog中,并在从库上重放SQL语句来实现主从复制。这种格式相对简单,适用于数据量较小、写入操作较为简单的场景。
  • row格式:记录的是行的变化情况。在主库上执行的每个行级别的写操作都会被记录到binlog中,并在从库上对相应的行进行修改,来实现主从复制。这种格式相对复杂,但是适用于数据量较大、写入操作频繁的场景。
  • mixed格式:混合了statement和row两种格式。MySQL会根据具体的操作选择使用哪种格式。这种格式可以兼顾上述两种格式的优点,但是实现起来比较复杂。

5.redo log 如何保证事务的持久性?

在 MySQL 中,redo log 主要是用来保证事务的持久性,其实现方式如下:

当一个事务提交时,InnoDB 引擎会首先将该事务的 redo log 缓存到内存中的 redo log buffer 中,同时在内存中更新相应的数据页;然后在适当的时机,将 redo log buffer 中的 redo log 写入磁盘上的 redo log 文件,以确保该事务在崩溃等异常情况下,能够通过 redo log 进行恢复。

在写入磁盘时,MySQL 会将 redo log 文件写入两个文件组成的循环队列中,每个文件的大小由配置参数 innodb_log_file_size 控制,默认值为 48MB。写入时会按照顺序从第一个文件开始写,直到写满,然后继续写入下一个文件。

因为 redo log 采用的是顺序写入磁盘的方式,所以可以提高写入磁盘的效率。同时,redo log 采用循环队列的方式,可以实现覆盖写,节省磁盘空间。

InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB

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

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

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

6.页修改之后为什么不直接刷盘呢?

在数据库中,对数据的修改是指修改内存中的数据页,而不是直接修改磁盘上的数据文件。这样做的主要原因是为了提高写入性能和保证数据的一致性。

如果每次有修改操作就直接写入磁盘,会严重影响写入性能。而且,频繁的磁盘写入会导致磁盘的寿命缩短。此外,直接将修改操作写入磁盘可能会导致数据不一致的问题,例如操作系统或硬件出现错误或中断等情况下。

因此,数据库通常采用一种称为“写前日志”(Write-Ahead Logging,WAL)的技术,将对数据的修改记录到日志文件中。在写入磁盘之前,会先将修改操作记录到 redo log 中,保证事务的持久性和原子性。只有在事务提交的时候,才会将 redo log 中的修改操作同步到磁盘上的数据文件,这样就可以保证数据的一致性和持久性。

当系统崩溃或重启时,可以通过 redo log 重放来恢复数据文件。这是因为,在数据库中,事务提交时,会先将 redo log 中的数据写入到磁盘上的数据文件中,然后再将事务提交的标识写入到 redo log 中。因此,在数据库启动时,只需要将 redo log 中的操作重放,就可以将数据恢复到最新的状态。

7.binlog 和 redolog 有什么区别?

  1. redo log(重做日志)是 InnoDB 存储引擎自己实现的一种日志,用于保证事务的持久性。当事务执行过程中修改了 InnoDB 表中的数据时,InnoDB 会先将修改操作记录到 redo log 中,并更新内存中的数据页。在事务提交前,InnoDB 会将 redo log 写入磁盘,保证数据持久化。redo log 是以循环写的方式写入磁盘,可以重复使用。redo log 的大小是固定的,可以通过参数 innodb_log_file_size 来设置。

  2. binlog(归档日志)是 MySQL 数据库服务层实现的一种日志,记录了数据库的所有更新操作,包括对哪个数据库的哪个表进行了什么样的操作。binlog 用于在主从复制、数据库恢复等场景下使用。binlog 中的日志记录是顺序写入的,不会重复使用。binlog 的大小是可变的,可以通过参数 max_binlog_size 来设置。

这两种日志有以下三点不同。

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

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

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

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

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

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

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

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

9.redo log和binglog如何保证两份日志之间的逻辑一致

redo log 和 binlog 的逻辑一致性是通过两阶段提交 (two-phase commit) 来保证的。在执行修改操作时,MySQL 会先将这些操作记录到 redo log 中,然后再将这些操作记录到 binlog 中。由于 redo log 和 binlog 的记录顺序不同,它们之间可能存在逻辑不一致的情况。为了保证逻辑一致性,MySQL 引入了两阶段提交机制。

在两阶段提交中,MySQL 会先将修改操作记录到 redo log 中的 prepare 阶段,此时并没有提交事务。然后 MySQL 将这些操作记录到 binlog 中,并将事务标记为 prepare 状态。最后,在 commit 阶段,MySQL 会将事务从 prepare 状态转变为 commit 状态,同时将 redo log 中的操作提交到磁盘中。这样就保证了 redo log 和 binlog 之间的逻辑一致性。

需要注意的是,在两阶段提交中,如果在 prepare 阶段发生了错误,MySQL 会回滚该事务,并将 binlog 中对应的操作标记为 rollback。这种情况下,redo log 和 binlog 之间就不会存在逻辑不一致的问题。

redo log 和 binlog 的逻辑一致性是通过两阶段提交来保证的,这也是 MySQL 实现 ACID 中的 A (原子性) 和 C (一致性) 的关键。

10.undo log 如何保证事务的原子性?

undo log 是 InnoDB 存储引擎用来实现事务的原子性和回滚操作的一种机制。在事务进行修改时,InnoDB 会先将修改前的数据写入到 undo log 中,然后进行数据的修改操作,如果事务回滚,则可以利用 undo log 中的信息将数据恢复到修改之前的状态,从而实现事务的原子性。

具体来说,当一个事务开始时,InnoDB 会为该事务开启一个 undo log,所有该事务对数据的修改都会先写入 undo log 中,然后再对数据进行修改。当事务提交时,会将所有对数据的修改一次性写入 redo log 中,然后再将事务的提交状态写入 redo log 中,表示事务提交成功。

如果事务执行过程中发生了错误导致回滚,InnoDB 会利用 undo log 中的信息将数据恢复到修改前的状态。当事务回滚时,InnoDB 会将事务对数据的修改操作反向执行,即将修改后的数据恢复成修改前的数据,然后将这些操作写入 redo log 中,表示事务回滚成功。

undo log 主要用来保证事务的原子性和回滚操作。当事务执行失败时,可以利用 undo log 中的信息将数据恢复到修改之前的状态,从而避免了数据的损坏和不一致。

相关文章:

MySQL面试题-日志

目录 1.MySQL 中常见的日志有哪些? 2.慢查询日志有什么用? 3.binlog 主要记录了什么? 4.Mysql的binlog有几种录入格式?分别有什么区别? 5.redo log 如何保证事务的持久性? 6.页修改之后为什么不直接刷…...

Android 10.0 去掉Launcher3默认给 icon增加的APK图标白边

1.概述 在10.0的系统产品开发中,Launcher3定制化开发中,发现在给第三方app的icon绘制图标的时候,会有白边第三方app的图标没有完全绘制出来,而系统app不存在这个问题,是完全绘制出来的,所以需要分析图标绘制类来解决这个问题 2.去掉Launcher3默认给 icon增加的APK图标白…...

E900V21C(S905L-armbian)安装armbian-Ubuntu(WiFi)

基本上是s905L芯片的刷机都是如此,包括Q7等 在网上寻找好多的教程关于e900v21c的刷机包和教程都少的可怜,唯一的就是这个:山东联通版创维E900V21C盒子刷入Armbiam并安装宝塔和Docker,但他是不能用WiFi和蓝牙的然后就是寻找s90l的…...

tpc协议的3次握手和4次挥手

建立连接的3次握手过程: A: 我想和你建立连接,你收到我的请求吗?(我想娶你) B: 好的,我收到了你的请求,我们可以建立连接,我同意。(好的,我愿意嫁给你) A: 好的,我收到了你的回应,我…...

YOLOv5害虫识别项目代码打包完整上传Gitee仓库(已开源)以及git上传速率限制踩坑记录

YOLOv5害虫识别项目代码打包完整上传Gitee仓库(已开源)以及git上传速率限制踩坑记录 ps: ​ 最近很多小伙伴需要这个害虫识别项目的源码,由于文件过大,所以将代码完整上传至gitee,所有文件、教程、论文、以及代码模型…...

从零开始学习c语言|21、动态内存管理

一、malloc函数 1、什么是malloc函数 malloc是memery(内存)和allocate(分配)的缩写,顾名思义,malloc函数为动态分配内存的意思 2、malloc函数语句 int *p(int *)malloc(sizeof(int))malloc函数的形参为申请的内存空间大小,上述申请了一个i…...

swagger关闭/v2/api-docs仍然可以访问漏洞

今天接到安全团队的说swagger有未授权访问漏洞,即使在swagger关闭的情况下http://127.0.0.1:8086/agcloud/v2/api-docs?group%E7%94%A8%E6%88%B7%E5%85%B3%E8%81%94%E4%BF%A1%E6%81%AF%E6%A8%A1%E5%9D%97仍然还能访问。 看了下原来是有写一个拦截器 registry.addI…...

k8s pod调度总结

在Kubernetes平台上,我们很少会直接创建一个Pod,在大多数情况下会通过控制器完成对一组Pod副本的创建、调度 及全生命周期的自动控制任务,如:RC、Deployment、DaemonSet、Job 等。本文主要举例常见的Pod调度。1全自动调度功能&…...

28个案例问题分析---10---对生产环境的敬畏--生产环境

一:背景介绍 1:上午9:23,老师没有进行上课,但是却又很多的在线人员,并且在线人员的时间也不正确。 2:开发人员及时练习用户,查看用户上课情况。 3:10点整,询问项目组长发…...

视觉SLAM十四讲ch7-1视觉里程计笔记

视觉SLAM十四讲ch7-1 视觉里程计笔记本讲目标从本讲开始,开始介绍SLAM系统的重要算法特征点法ORB特征BRIEF实践特征提取与匹配2D-2D:对极几何八点法求E八点法的讨论从单应矩阵恢复R,t小结三角化![在这里插入图片描述](https://img-blog.csdni…...

模仿评论样式

主要用到了padding-left把左侧的空白给留出来,然后把头像定位到留出的空白位置。行内对齐样式,使用了display:inline-flex;align-items:center;图标本来要用字体比较方便,暂时用的从icon font下载的svg样式写的一塌糊涂,一点也没考…...

xxl-job调度中心、执行器源码详解

文章目录简介调度中心一.程序启动初始化1.初始化入口类2.初始化I18n3.初始化快慢调度线程池4.初始化处理执行器注册或移除线程池更新执行器最新在线的守护线程5.初始化监控任务调度失败或执行失败的守护线程6.初始化处理执行器回调线程池监控任务执行结果丢失的守护线程7.初始化…...

cpp c++summary笔记 复杂类型 “right-left” rule

复杂类型 “right-left” rule 先向右走在向左走,循环往复,右侧的终止为看到右括号,右中括号,左侧为左括号,指针(或其他int等)。 符号读作*指向AA的指针(总在左侧)[]容纳AA的数组(总在左侧)()返…...

bash编程(马哥)

bash基础特性: 命令行展开:~,{} 命令别名:alias,unalias 命令历史:history 命令和路径补全:$PATH glob通配符:*,?,[],[^], 快捷键&am…...

搭建Gerrit环境Ubuntu

搭建Gerrit环境 1.安装apache sudo apt-get install apache2 注意:To run Gerrit behind an Apache server using mod_proxy, enable the necessary Apache2 modules: 执行:sudo a2enmod proxy_http 执行:sudo a2enmod ssl 使新的配置生效,需要执行如下命令:serv…...

朋友去华为面试,轻松拿到26K的Offer,羡慕了......

最近有朋友去华为面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…...

springboot项目如何配置启动端口

文章目录0 写在前面1 配置文件(.yaml)--推荐2 配置文件(.properties)3 IDEA配置--不推荐4 写在最后0 写在前面 项目启动需要一个独立的端口,所以在此记录一下。 根据配置文件的后缀书写格式略有不同。 1 配置文件(.yaml)–推荐 若是.yaml后缀的配置文件&#xff0…...

IOS - 抓包通杀篇

IOS中大多数情况,开发者都会使用OC提供的api函数,CFNetworkCopySystemProxySettings来进行代理检测; CFNetworkCopySystemProxySettings 检测函数直接会检测这些ip和端口等: 采用直接附加页面进程: frida -UF -l 通…...

盒子模型的简介

盒子的组成 一个盒子由外到内可以分成四个部分:margin(外边距)、border(边框)、padding(内边距)、content(内容)。会发现margin、border、padding是css属性,因…...

Kubernetes 101,第二部分,pod

在上一篇文章中,我们了解了Kubernetes 的基础知识以及对其主要架构的介绍。 介绍完毕后,就该探索如何在 Kubernetes 中运行应用程序了。 容器包装器 在 Kubernetes 中,我们无法直接创建单个容器。相反,为了更好,我们可以将容器包装成一个单元,其中包括: 规范:多个容器可…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Bean 作用域有哪些?如何答出技术深度?

导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答&#xff0c…...