mysql 系列:日志

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志的存在,为数据库的很多功能提供了保障。像用于回滚数据的 undo log,用于恢复数据的 redo log, 以及用于主从备份的 binlog。本文将会大致介绍下数据库里的日志类别,以及重点分析下事务日志的相关知识点。

摘要

日志的存在,为数据库的很多功能提供了保障。像用于回滚数据的 undo log,用于恢复数据的 redo log, 以及用于主从备份的 binlog。本文将会大致介绍下数据库里的日志类别,以及重点分析下事务日志的相关知识点。

日志分类

在 mysql 里的日志种类有很多,从总体上来讲可以分为 Server 层存储引擎层的(关于 mysql 的总体架构可以看这篇:mysql 系列:总体架构概述)。

Server 层里的日志分类如下:

错误日志

错误日志是 mysql 在启动、运行或停止时出现异常的日志。我们可以通过下面这个命令来查看错误日志的位置:

SHOW VARIABLES LIKE 'log_error';

上面默认查询到的是 stderr,表示标准错误输出,如果有终端存在,则只会在终端打印错误。 当然,我们也可以在 my.cnf 里设置错误日志位置:

[mysqld]
 log-error=错误日志位置

使用场景:像我们在启动 mysql 失败时,一般可以到错误日志里查看。

通用查询日志

通用查询日志记录了用户的所有操作,包括 sql 语句的查询更新。一般情况下是不会开启的,有点类似于我们平时使用 debug 级别的日志。同样的,我们也可以通过下面的语句来查看是否开启及其输出位置:

SHOW VARIABLES LIKE '%general%';

当我们想要开启通用查询日志,以记录所有客户端的 sql 操作时,就可以用下面的语句了:

SET GLOBAL general_log=on;

上面的日志输出是到文件,如果想要使用 sql 语句来查找日志,可以将日志的输出设置为表:

SET GLOBAL log_output='table';

然后就可以使用下面的 sql 语句来查询了:

select * from mysql.general_log;

这样就可以监控到所有客户端的操作情况了,当然,不要忘记使用完后关闭日志,否则将会占用很大的磁盘空间。

DDL 日志

DDL 日志记录了数据库里元数据的变更信息。DDL 即数据定义语句,像 create,drop,alter语句。

DDL 日志是一个二进制文件,不被人为的阅读修改,也没有其他配置项可以配置它。一般存放在数据目录下,ddl_log.log 文件即是。而且在成功启动 mysqld 后会被删除,只有在记录元数据时才会被重新创建。

binlog 二进制日志

binlog 日志记录了数据库对数据的修改记录,包括了 DDL,如表的创建,数据更新等。但并不包括 select 这些查询语句.

binlog 日志是属于逻辑语句的记录,可用于主从数据库的同步。

relay log 中继日志

relay log 用于主从备份恢复使用的。当 master 将 binlog 传送过来后,slave 服务器会有一个 I/O 线程来处理接收到的日志,并且将其维护到 relay log 里。

relay log 有了主服务器的 binlog 逻辑操作语句后,就可以还原数据库了。

relay log 除了包含 binlog 的内容,还会记录当前恢复到哪个位置。如果从服务器断开重连,则可以从上次记录的位置开始恢复。

慢查询日志

慢查询日志用于记录在 mysql 里执行时间超过预期值的耗时语句,主要用于性能瓶颈分析。

一般慢查询记录需要手动设置:

SET GLOBAL slow_query_log=1;

至于其日志的记录位置,可以这么查询:

SHOW VARIABLES LIKE '%slow_query_log%';

而时间阈值的查询则如下:

SHOW VARIABLES LIKE 'long_query_time%';

对应的设置语句:

SET GLOBAL long_query_time=8;

事务日志

事务日志是 InnoDB 存储引擎为了支持事务的持久化而设计的,主要是 redo log 和 undo log。

redo log

redo log 是对加载到内存数据页修改结果的记录,和 binlog 不同的是,binlog 记录的是逻辑操作语句,偏向于过程记录。而 redo log 是一个数据页的修改日志,偏向于结果的记录。

在 mysql 里每当执行一个事务时,并不会时时的将数据修改同步到硬盘上。而是会在内存里维护了一个 buffer pool,在读取更新数据的时候会优先从这里操作,数据不存在则会从磁盘加载后再操作。

而内存里修改的数据也不会一直驻留着,会定时的更新到磁盘上,这就是所谓的脏页刷盘

细心的朋友可能会发现内存数据并不可靠,要是发生断电,导致 buffer pool 里的数据不能落地到磁盘,那岂不是会丢失数据?这个就是 redo log 发挥作用的时候了。

每当有事务执行操作后,会将刚刚对数据页的修改结果先记录到 redo log,然后才提交事务。这种日志先行的做法,保证了即使来不及同步数据也能从日志里恢复。

事实上,在修改了内存数据页并写入 redo log 后,事务此时也只是标记为 prepare 状态而已,并不会标为 commit 状态,只有当 binlog 也写入成功后才会真正的 commit。

之所以要把 binlog 写入成功后才算完整 commit,主要是因为 binlog 用于从数据库的恢复,如果 redo log 写入成功,binlog 没有写入成功,那么就会导致主数据库有此操作结果的数据,而从数据库同步时缺失数据。

这种 2 次提交状态,被 mysql 称为了二阶段提交。除此之外,redo log、binlog 还有个组提交的过程,主要是用于批量的进行事务的提交,日志的写入。

undo log

回滚日志主要用于回滚数据,和 redo log 不一样的是,undo log 是逻辑日志,是一种相反操作的记录,比如在回滚时,如果是 insert 操作时,则会逆向为 delete,delete 操作时,逆向为 insert 操作,更新则恢复到当时的版本数据。

undo 还用于 MVCC 版本链的使用,具体可以看看这篇文章:MVCC

总结

在 mysql 一开始其实没有事务日志,后来有了 InnoDB 存储引擎,需要支持事务持久化的特性,所以有了 redo log,undo log。虽然对于开发而言,可能不会涉及到对 mysql 日志相关的运维,但它的实现原理还是值得学习的,或许以后也能实现属于自己的一个持久化数据库~~~ ㋡㋡㋡

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
119 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
7天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1638 14
|
8天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的撤销日志文件和错误日志文件
本文介绍了MySQL的物理存储结构,重点讲解了InnoDB存储引擎中的撤销日志文件(undo log)和错误日志文件。从MySQL 8.0开始,默认生成两个10MB的undo表空间文件,并支持动态扩容和收缩。错误日志文件记录了MySQL启动、运行、关闭过程中的问题,通过示例展示了如何查看和使用这些日志。
|
1月前
|
SQL 存储 关系型数据库
Mysql主从同步 清理二进制日志的技巧
Mysql主从同步 清理二进制日志的技巧
28 1
|
1月前
|
关系型数据库 MySQL 数据库
DZ社区 mysql日志清理 Discuz! X3.5数据库可以做定期常规清理的表
很多站长在网站日常维护中忽略了比较重要的一个环节,就是对于数据库的清理工作,造成数据库使用量增加必须多的原因一般有2个:后台站点功能开启了家园,此功能现在很少有论坛会用到,但是灌水机会灌入大量垃圾信息致使站长长时间未能发觉;再有就是程序默认的一些通知类表单会存放大量的、对于网站日常运行并无意义的通知信息。
80 2
|
30天前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
73 0
|
3月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
165 0
|
16天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
137 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
234 3