浅析MySQL日志体系

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL InnoDB 引擎中,事务日志主要由两个部分组成,分别是Redolog和Undolog。其中Redolog也称为重做日志,用于保证事务的原子性和持久性,在崩溃恢复期间纠正不完整事务写入的数据。而Undolog主要是记录数据改动的前映像信息,用来实现事务回滚和MVCC功能。

引言
在数据库中,日志文件记录了数据库运行的各方面信息,对于数据库的正常运行起着重要作用。在MySQL数据库中,主要包括了Redolog日志、Undolog日志、Binlog日志、Relaylog日志、GeneralQuery Log日志、SlowQuery Log日志以及Errorlog日志。这些日志共同构成了MySQL数据库的日志体系,在本文中会逐一对这些日志的作用进行介绍。

一、事务日志
MySQL InnoDB 引擎中,事务日志主要由两个部分组成,分别是Redolog和Undolog。其中Redolog也称为重做日志,用于保证事务的原子性和持久性,在崩溃恢复期间纠正不完整事务写入的数据。而Undolog主要是记录数据改动的前映像信息,用来实现事务回滚和MVCC功能。

1.1、Redo log 的基本概念
Redo日志主要包含了两部分:

1)Redo Log Buffer(日志缓冲区),是位于内存中的一块区域,主要用于缓存要写入磁盘日志文件中的数据。

2)Redo Log File,位于磁盘上,持久化Log Buffer中的日志数据。建库后,默认会创建名为ib_logfile0和ib_logfile1的两个文件。

为了保证日志的持久性,InnoDB存储引擎通过ForceLog at commit机制实现,即当事务提交时,必须先将该事务的所有日志写入到重做日志中。在InnoDB的默认设置下(innodb_flush_method),每次将RedoLog Buffer中日志更新到磁盘中的日志文件时,先将重做日志缓冲写入到文件系统缓存,然后调用一次操作系统的fsync操作写入Redolog file,其过程如下图所示。

image.png

图 1 log buffer到log file写入过程

针对为了保证严格遵守ACID特性和磁盘IO性能取舍的问题,在MySQLInnoDB引擎中还有一个参数innodb_flush_log_at_trx_commit,用来控制Logbuffer中的日志刷新到磁盘的策略,其策略如下:

1)当设置为1时(default),事务每次提交时都会将Log buffer中的日志写入操作系统缓存并调用fsync写入到Redo log file中。这样可以保证每一个事务日志不丢失。

2)当设置为0时,并不会在事务提交时一并将Log buffer中的日志 fsync到Redo log file中,而是根据innodb_flush_log_at_timeout(default=1) 参数设置的固定时间频率(s),定期将log buffer日志持久化到Redo log file。这样就有可能会在异常宕机时,意外丢失一部分redo 日志,造成了部分事务日志丢失。

3)当设置为2时,会在事务提交时将Log buffer中的日志写入到Redo log file,但仅写入文件系统的缓存中,不进行fsync操作。这样也不能完全保证一个事务中所有日志的完整性,如果当系统宕机,也可能会造成没有fsync到磁盘中的日志丢失。

1.2 Undo log 的基本概念
Undo log是与单个读写事务关联的undo日志记录的集合,undolog记录包含关于如何撤消事务对聚簇索引记录的最新更改的信息。Undolog存放在数据库内部的一个特殊段(segment)中,称为undosegment,位于共享表空间内。

Undolog 在数据库中主要实现了两个功能分别是事务的回滚和MVCC。

二、Binlog
Binlog(二进制日志)是MySQLServer层维护的一种二进制日志,主要记录了数据库中所有的DDL操作和DML操作,但Binlog中不会记录SELECT和SHOW这类查询语句,Binlog语句是以”事务”的形式保存在磁盘中。

2.1主要作用
1)复制:在MySQL源端开启Binlog,并向从端发送源端生成的binlog,再由从端回放日志实现与源端数据一致。

2)数据恢复:通过Binlog日志实现指定时间点的数据恢复。

2.2 Binlog日志的格式
在my.cnf文件中设置log_bin=/DIRECTORY_NAME/file_name参数,开启。

Binlog日志主要有三种格式,可以在my.cnf文件中通过–binlog_format参数进行设置。

1)STATEMENT
基于SQL语句模式,日志中记录是执行语句和上下文环境。该模式下生成的日志量较少所以减少了对磁盘IO的影响,提高了性能。

2)ROW
基于行的模式,会将每一行的变化都记录到日志中,相较于statement格式,其日志内容要大很多,对磁盘IO影响较大,但是由于记录了每行数据修改的细节,因此不会发生某些特定情况下从库无法复制的情况发生。

3)MIXED
混合模式,即混合了Statement和Row两种日志格式,是MySQL默认的日志格式。在混合模式下,MySQL会默认使用基于SQL语句的日志记录模式(Statement),但是在一些特殊的场景下会自动切换到基于行的日志记录模式。

三、Relay log
Relay log(中继日志)是在MySQL主从复制时产生的日志,在MySQL的主从复制主要涉及到三个线程:

1) Log dump线程:向从库的IO线程传输主库的Binlog日志

2) IO线程:向主库请求Binlog日志,并将Binlog日志写入到本地的relay log中。

3) SQL线程:读取Relay log日志,将其解析为SQL语句并逐一执行。

image.png

从图2中可以看出,从库的IO线程接收到主库的logdump线程传递的Binlog日志后,会将其写入到本地的一个日志中,这个日志就是Relaylog。在文件目录中,一般由多个host_name-relay-bin.nnnnnn 的日志文件和host_name-relay-bin.index索引文件组成,其中日志文件记录的是事务中修改数据的信息,索引文件记录的是使用过的日志文件信息。

Relaylog日志的格式与Binlog的一致,但是相较于Binlog多了master.info和relay-log.info两个日志(默认存储于数据文件目录中)。master.info主要记录上一次读取到master同步过来的binlog的位置,从节点的连接信息和主节点信息,以及连接master和启动复制必须的所有信息。relay-log.info主要记录了从节点文件复制的进度,下一个事件从什么位置开始,由sql线程负责更新。

四、General Query Log
General QueryLog(通用查询日志)记录了用户的所有操作,包括启动和关闭MySQL服务、增删改语句和查询语句,需要注意查询日志在binlog中是不记录的。默认情况下,该日志是关闭状态。

相关参数如下:

general_log = [0|1] --0关闭,1开启
log-output = [TABLE|FILE|NONE] --设置日志输出对象
general_log_file = [FILENAME] --设置输出日志名称

五、Slow Query Log
Slow QueryLog(慢速查询日志)由SQL语句组成,记录了所有执行时间超过参数log_query_time(秒)且扫描的记录数不小于min_examined_row_limit的所有SQL语句的日志,慢查询日志主要用于查找执行时间较长的语句。

默认情况下,管理语句和不使用索引的查询语句是不会记录在slowquery log中,不过可以通过设置参数log_slow_admin_statements和log_queries_not_using_indexes对这两类语句进行监控。在MySQL中,管理语句被定义为ALTER TABLE,ANALYZETABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE和REPAIRTABLE。

如果从文本日志中搜索一些慢查询的语句,会非常消耗时间,MySQL推荐使用mysqldumpslow工具对慢查询日志进行分类汇总。

相关参数如下:

long_query_time = 10 --默认是10s,最小值是0

slow_query_log[={0|1}] --也可以是布尔值(ON|OFF),默认是0,日志关闭。

slow_query_log_file=file_name --指定慢查询日志文件名称,默认host_name-slow.log

log-output = [TABLE|FILE|NONE] –设置日志输出对象

六、Error log
ErrorLog(错误日志)包含mysqld启动和关闭时间的记录,以及诊断消息,如服务器启动和关闭期间以及服务器运行时发生的错误、警告和注意事项。当数据库出现故障导致无法运行时,可以通过查看该日志进行问题分析。

相关参数如下:

log-error [=file_name] --设置日志名称

总结
MySQL数据库的日志系统是一个较为庞大的体系,本文中仅仅是针对一些常见的日志做了简要的介绍,在使用和参数设置中还有非常多的细节,大家也可以参考官方文档进行详细的学习。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
22天前
|
SQL 存储 关系型数据库
Mysql并发控制和日志
通过深入理解和应用 MySQL 的并发控制和日志管理技术,您可以显著提升数据库系统的效率和稳定性。
97 10
|
18天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
47 3
|
1月前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
2月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
2月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
197 6
|
2月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的慢查询日志
MySQL的慢查询日志用于记录执行时间超过设定阈值的SQL语句,帮助数据库管理员识别并优化性能问题。通过`mysqldumpslow`工具可查看日志。本文介绍了如何检查、启用及配置慢查询日志,并通过实例演示了慢查询的记录与分析过程。
214 3
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
557 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
29天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
383 3