热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQLInnoDB事务日志详解:RedoLog与UndoLog

本文详细介绍了MySQLInnoDB存储引擎中的RedoLog和UndoLog,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。
### Redo Log

InnoDB事务日志主要包含Redo Log(重做日志)和Undo Log(回滚日志)。Redo Log用于记录数据页的物理修改,确保数据在系统崩溃后能够恢复到最近的提交点;而Undo Log则用于提供回滚操作和支持多版本并发控制(MVCC)。

#### Redo Log的基本概念

- **物理日志**:Redo Log记录的是数据页的物理变化,而非具体的数据行变化。
- **恢复机制**:Redo Log主要用于恢复已提交的事务,确保数据的一致性和完整性。
- **日志结构**:Redo Log包括内存中的日志缓冲区(redo log buffer)和磁盘上的重做日志文件(redo log file)。内存中的日志缓冲区是易失性的,而磁盘上的日志文件是持久化的。

#### 写入机制

- **force log at commit**:InnoDB通过这一机制确保事务的持久性。在事务提交时,必须将事务的所有日志写入磁盘上的Redo Log文件和Undo Log文件。
- **fsync操作**:每次将日志缓冲区中的日志写入日志文件时,都会调用操作系统的fsync操作,确保日志被写入磁盘。
- **innodb_flush_log_at_trx_commit**:该变量控制事务提交时日志的写入策略,有三种值:0、1、2,默认为1。设置为1时,每次提交都会将日志写入磁盘,保证数据安全;设置为0时,每秒写入一次,可能导致数据丢失;设置为2时,每次提交写入操作系统缓冲区,每秒同步到磁盘。

### 日志块

- **存储单位**:Redo Log以512字节的块(redo log block)为单位存储。
- **日志块结构**:每个日志块由日志块头(12字节)、日志块尾(8字节)和日志主体(492字节)组成。
- **日志格式**:Redo Log记录的是数据页的变化,每个日志块的主体部分包括日志类型(1字节)、表空间ID(压缩后可能小于4字节)、页偏移量(压缩后)和日志数据。

### 刷盘规则

- **脏日志**:内存中未写入磁盘的日志称为脏日志。
- **刷盘时机**:
- 事务提交时。
- 每秒自动刷盘。
- 当日志缓冲区使用超过一半时。
- 发生检查点(checkpoint)时。

### Checkpoint

- **脏数据**:内存中未写入磁盘的数据称为脏数据。
- **触发条件**:
- 系统内存不足。
- 日志文件达到最大值。
- 系统定期触发。

### Binlog与Redo Log

- **Binlog**:MySQL Server层实现的日志,记录的是SQL语句的逻辑变化。
- **Redo Log**:InnoDB引擎特有的物理日志,记录的是数据页的物理变化。
- **区别**:
- **格式**:Redo Log是物理日志,Binlog是逻辑日志。
- **用途**:Redo Log主要用于崩溃恢复,Binlog主要用于数据归档和主从复制。
- **写入方式**:Redo Log是循环写入的,Binlog是追加写入的。

### Undo Log

- **作用**:提供回滚和多版本并发控制(MVCC)。
- **逻辑日志**:记录的是逻辑变化,如删除操作记录为插入,更新操作记录为相反的更新。
- **存储管理**:InnoDB使用回滚段(rollback segment)管理Undo Log,每个回滚段包含1024个Undo Log段。
- **删除机制**:事务提交时,Undo Log不会立即删除,而是放入删除列表中,由Purge线程异步处理。

### 慢查询日志

- **功能**:记录响应时间超过阈值的SQL语句,帮助优化查询性能。
- **配置**:通过`long_query_time`参数设置阈值,默认为10秒。
- **启用**:默认情况下,慢查询日志是关闭的,需要手动启用。启用后,日志可以写入文件或数据库表。

推荐阅读
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • andr ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
author-avatar
okkkokkokkkokka
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有