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 中常见的日志有哪些?
-
redo log:重做日志,用于恢复数据,保证 MySQL 异常宕机后数据的完整性,只记录物理日志(日志记录了对数据页的修改,而不是逻辑修改),循环写,因为不需要回滚,所以可以覆盖写。
-
undo log:撤销日志,用于回滚事务,可以保证事务的原子性、一致性和隔离性。记录逻辑日志,循环写,记录事务操作之前的值,便于回滚事务。
-
binlog:二进制日志,记录所有修改数据库的操作,包括增、删、改等操作,用于数据恢复、数据复制等场景。
-
error log:错误日志,记录 MySQL 引擎在运行过程中出现的错误、警告等信息,用于排查问题。
-
slow query log:慢查询日志,记录执行时间超过阈值的 SQL 语句,用于性能调优、查询优化等场景。
-
general log:通用日志,记录所有客户端的查询和状态变更信息,包括查询、连接、断开等操作,通常用于诊断问题和安全审计。
-
relay log:中继日志,用于 MySQL 主从复制中的数据传输,从 MySQL 主节点复制数据到从节点。
2.慢查询日志有什么用?
慢查询日志是 MySQL 中用于记录执行时间超过阈值的 SQL 语句的日志,通常用于分析性能问题。它可以记录每条执行时间超过指定阈值的 SQL 语句,并记录下执行时间、访问的表、使用的索引以及执行 SQL 的用户等信息,从而帮助开发人员找到慢查询的原因和优化方案。
慢查询日志可以帮助开发人员识别哪些 SQL 语句执行时间长,从而可以进行针对性的优化。优化的方法包括但不限于优化查询语句的写法、增加索引、分离大表等。通过分析慢查询日志可以让开发人员更加深入地了解系统的瓶颈和性能问题,从而制定更好的优化策略。
慢查询日志的开启和关闭可以通过在 MySQL 配置文件中设置参数 slow_query_log 和 long_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 的使用场景:
-
数据复制:MySQL 的主从复制是通过 binlog 实现的。主库将修改操作写入 binlog,从库通过读取主库的 binlog 文件进行复制。
-
数据恢复:binlog 中记录了所有对数据库的修改操作,因此可以利用 binlog 进行数据恢复。
-
数据备份:通过将 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 有什么区别?
-
redo log(重做日志)是 InnoDB 存储引擎自己实现的一种日志,用于保证事务的持久性。当事务执行过程中修改了 InnoDB 表中的数据时,InnoDB 会先将修改操作记录到 redo log 中,并更新内存中的数据页。在事务提交前,InnoDB 会将 redo log 写入磁盘,保证数据持久化。redo log 是以循环写的方式写入磁盘,可以重复使用。redo log 的大小是固定的,可以通过参数
innodb_log_file_size来设置。 -
binlog(归档日志)是 MySQL 数据库服务层实现的一种日志,记录了数据库的所有更新操作,包括对哪个数据库的哪个表进行了什么样的操作。binlog 用于在主从复制、数据库恢复等场景下使用。binlog 中的日志记录是顺序写入的,不会重复使用。binlog 的大小是可变的,可以通过参数
max_binlog_size来设置。
这两种日志有以下三点不同。
-
redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
-
redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
-
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小结三角化。 符号读作*指向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后缀的配置文件࿰…...
IOS - 抓包通杀篇
IOS中大多数情况,开发者都会使用OC提供的api函数,CFNetworkCopySystemProxySettings来进行代理检测; CFNetworkCopySystemProxySettings 检测函数直接会检测这些ip和端口等: 采用直接附加页面进程: frida -UF -l 通…...
盒子模型的简介
盒子的组成 一个盒子由外到内可以分成四个部分:margin(外边距)、border(边框)、padding(内边距)、content(内容)。会发现margin、border、padding是css属性,因…...
Kubernetes 101,第二部分,pod
在上一篇文章中,我们了解了Kubernetes 的基础知识以及对其主要架构的介绍。 介绍完毕后,就该探索如何在 Kubernetes 中运行应用程序了。 容器包装器 在 Kubernetes 中,我们无法直接创建单个容器。相反,为了更好,我们可以将容器包装成一个单元,其中包括: 规范:多个容器可…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
Ray框架:分布式AI训练与调参实践
Ray框架:分布式AI训练与调参实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Ray框架:分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...
【Linux】使用1Panel 面板让服务器定时自动执行任务
服务器就是一台24小时开机的主机,相比自己家中不定时开关机的主机更适合完成定时任务,例如下载资源、备份上传,或者登录某个网站执行一些操作,只需要编写 脚本,然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...
Linux【5】-----编译和烧写Linux系统镜像(RK3568)
参考:讯为 1、文件系统 不同的文件系统组成了:debian、ubuntu、buildroot、qt等系统 每个文件系统的uboot和kernel是一样的 2、源码目录介绍 目录 3、正式编译 编译脚本build.sh 帮助内容如下: Available options: uboot …...
