MySQL 日志系统详解:binlog、redo log、undo log 核心机制分析

彩票预测的可能性与算法分析 彩票作为一种以随机数为基础的赌博形式,吸引了大量希望一夜暴富的参与者。尽管许多人希望通过某种方式预测彩票结果,以增加中奖几率,但彩票预测的可能性依然是一个充满争议和误解的话题。本文将探讨彩票是否能够预测的理论依据,分析可能的预测算法,并解释这些算法为何在实际应用中难以奏效。 阅读详情

MySQL 日志系统概述

MySQL 实现了多种类型的日志,各自承担不同的职责,主要包括:

  • 错误日志(Error Log):记录启动、运行、关闭过程中的问题
  • 通用查询日志(General Query Log):记录所有 SQL 查询
  • 慢查询日志(Slow Query Log):记录执行时间超过阈值的查询
  • 二进制日志(Binary Log,即 binlog):记录所有数据修改语句
  • 重做日志(Redo Log):确保事务的持久性
  • 撤销日志(Undo Log):支持事务回滚和多版本并发控制
  • 中继日志(Relay Log):在从库中接收并重放主库的 binlog

本文将深入讲解 binlog、redo log 和 undo log 这三种核心日志的工作原理和应用场景。

binlog(二进制日志)

什么是 binlog?

binlog 是 MySQL 服务层实现的一种逻辑日志,记录了所有对数据库内容的修改操作(不包括 SELECT 等查询操作)。它以二进制形式存储,可用于数据恢复、主从复制等场景。

binlog 的三种格式

MySQL 支持三种 binlog 格式,各有优缺点:

  1. STATEMENT 格式:记录 SQL 语句原文
  • 优点:日志量小,节省存储空间和网络带宽
  • 缺点:某些函数在主从复制时可能导致数据不一致
  • 实际案例:在使用INSERT INTO target_table SELECT * FROM source_table WHERE create_time < NOW()时,主从节点执行 NOW()的时间不同,导致复制的数据不一致
  1. ROW 格式:记录数据行变更前后的值
  • 优点:精确记录数据变化,主从复制更可靠
  • 缺点:日志量大,特别是批量操作时
  • 实际案例:更新一张有 10 万行数据的表,ROW 格式可能产生几十 MB 甚至上百 MB 的 binlog,而 STATEMENT 格式可能只有几百字节
  1. MIXED 格式:混合模式,MySQL 会自动选择使用 STATEMENT 还是 ROW 格式

注意:从 MySQL 8.0 开始,默认的 binlog 格式已从 STATEMENT 改为 ROW,这反映了 MySQL 对数据一致性要求的提升。

binlog 定位与恢复案例

基于时间范围恢复

# 查看当前的binlog文件
SHOW BINARY LOGS;
# 查看当前正在写入的binlog位置
SHOW MASTER STATUS;
# 查看特定时间段的binlog内容
mysqlbinlog --start-datetime="2023-11-10 14:00:00" \
--stop-datetime="2023-11-10 15:00:00" \
/var/lib/mysql/mysql-bin.000123 > recovery.sql
# 分析日志内容,确定问题所在
grep "UPDATE orders" recovery.sql
# 使用binlog恢复数据
mysql -u root -p < recovery.sql

基于位置点精确恢复

当需要更精确的恢复时,可以使用位置点:

# 先查看binlog内容,定位需要恢复的位置点
mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000123 | less
# 基于位置点恢复(更精确)
mysqlbinlog --start-position=1000 --stop-position=2000 /var/lib/mysql/mysql-bin.000123 > recovery.sql

误删表恢复案例

# 1. 定位误操作的binlog位置
mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000123 | grep "DROP TABLE"
# 2. 在从库模拟恢复(避免主库操作风险)
mysqlbinlog --start-position=4321 --stop-position=5678 /var/lib/mysql/mysql-bin.000123 | mysql -h slave -u root -p

binlog 相关配置

# my.cnf中的binlog配置
[mysqld]
# 启用binlog
log-bin=mysql-bin
# 设置binlog格式
binlog_format=ROW
# binlog过期时间(天)
expire_logs_days=7
# 单个binlog文件大小上限
max_binlog_size=100M
# binlog刷盘策略:1表示每次事务提交都刷盘,最安全但性能较低
sync_binlog=1

redo log(重做日志)

redo log 的作用

redo log 是 InnoDB 存储引擎特有的日志,主要用于实现事务的持久性。当数据修改时,修改内容会先写入 redo log,再慢慢刷回磁盘,这种方式称为 WAL(Write-Ahead Logging)。

redo log 的主要特点:

  • 物理日志,记录"在某个数据页上做了什么修改"
  • 循环写入,大小固定,写满时会覆盖最早的部分
  • 崩溃后,InnoDB 会使用 redo log 恢复未刷盘的数据修改

redo log 与 Buffer Pool 的交互

数据修改的流程:

  1. 当事务修改数据时,首先将修改写入 Buffer Pool 中的页,此时页变为"脏页"
  2. 同时将修改操作记录到 redo log buffer
  3. 根据配置决定 redo log 写盘时机
  4. 后台线程会定期将脏页刷新到磁盘(checkpoint)
  5. 当脏页刷盘后,对应的 redo log 空间可以被重用

redo log 的刷盘策略

根据innodb_flush_log_at_trx_commit参数决定刷盘时机:

  • 值为 0:每秒写入磁盘一次,可能丢失 1 秒数据
  • 值为 1:每次事务提交都写入磁盘,最安全但性能较低
  • 值为 2:每次提交写入 OS 缓存,由 OS 决定何时刷盘

性能对比:设置为 1 时,TPS 通常比设置为 0 或 2 低 15-20%,但提供最高的数据安全性。

redo log 的两阶段提交

为了保证 binlog 和 redo log 的一致性,MySQL 使用两阶段提交机制:

  1. 准备阶段:记录 redo log,标记为 prepare 状态,同时记录 XID(事务 ID)
  2. 提交阶段:写入 binlog,然后提交事务,更新 redo log 为 commit 状态

组提交(Group Commit)机制

为了提高性能,MySQL 实现了组提交机制,将多个事务的 redo log 一起刷盘:

这大大减少了磁盘I/O操作,提高了吞吐量。

崩溃恢复机制

当MySQL崩溃重启时,会进行崩溃恢复:

  1. 扫描最后的redo log
  2. 检查每个prepare状态的事务
  3. 通过XID查找对应的binlog记录
  4. 如果找到完整binlog,则提交事务;否则回滚事务

例如,对于一个银行转账操作:

START TRANSACTION;
UPDATE accounts SET balance = balance - 1000 WHERE id = 'A';
UPDATE accounts SET balance = balance + 1000 WHERE id = 'B';
COMMIT;

崩溃恢复逻辑:

  • 崩溃发生在 prepare 前:重启后没有 prepare 日志,事务自动回滚
  • 崩溃发生在 prepare 后、写 binlog 前:重启后发现 redo log 为 prepare 但没有对应的 binlog,回滚事务
  • 崩溃发生在 binlog 写完、commit 前:重启后发现 redo log 为 prepare 且存在对应的 binlog,自动提交事务
  • 崩溃发生在 commit 后、数据页刷盘前:重启后通过 redo log 恢复未刷盘的数据修改

redo log 配置优化

生产环境的 redo log 配置建议:

# 计算公式:innodb_log_file_size = (TPS * 每事务redo量) * 缓冲时间
# 例如:TPS=1000,每事务1KB,缓冲10秒,则至少需要10MB

# redo log文件大小
innodb_log_file_size = 512M

# redo log文件组中的文件数量(通常2-4个)
innodb_log_files_in_group = 4

# 事务提交时的刷盘策略,生产环境建议设为1
innodb_flush_log_at_trx_commit = 1

undo log(撤销日志)

undo log 的作用

undo log 主要有两个作用:

  1. 支持事务回滚:记录数据修改前的值,当事务回滚时用于恢复原始数据
  2. 实现 MVCC(多版本并发控制):通过保存数据的历史版本,允许不同事务看到同一数据的不同版本

undo log 的工作原理

当事务对数据进行修改时,InnoDB 会先记录修改前的数据到 undo log 中:

  • INSERT 操作:记录如何删除这条记录
  • DELETE 操作:记录如何恢复这条记录
  • UPDATE 操作:记录如何将数据恢复到修改前的状态

这些日志记录保存在回滚段(Rollback Segment)中,支持事务的原子性。

undo log 的生命周期

undo log 的管理流程:

  1. 事务开始时,分配 undo log 空间
  2. 事务执行过程中,记录修改前的数据
  3. 事务提交后,undo log 不会立即删除(为 MVCC 服务)
  4. Purge 线程定期检查不再被任何事务视图使用的 undo log 并回收

可通过以下命令查看 Purge 线程状态:

SHOW ENGINE INNODB STATUS\G

在输出中查找"History list length"值,如果该值持续增长,说明 Purge 线程跟不上事务提交速度。

MVCC 实现原理详解

在 InnoDB 中,每行数据都有三个隐藏字段:

  • DB_TRX_ID:创建或最后修改该行的事务 ID
  • DB_ROLL_PTR:指向 undo log 的指针(回滚指针)
  • DB_ROW_ID:如果表没有主键和唯一索引,InnoDB 会自动生成此 ID

不同事务隔离级别下,Read View(读视图)的创建时机不同:

  • READ COMMITTED:每次 SELECT 都创建新的 Read View
  • REPEATABLE READ:事务开始时创建 Read View 并重用

事务回滚与 MVCC 案例分析

事务回滚案例

START TRANSACTION;
DELETE FROM products WHERE id = 10;
-- 此时发现删错了
ROLLBACK;

MySQL 处理流程:

  1. 执行 DELETE 前,先将 id=10 的产品完整记录到 undo log
  2. 标记数据行为删除状态
  3. 执行 ROLLBACK 时,根据 undo log 恢复原始数据

MVCC 读取案例

假设有两个并发事务:

-- 事务A(事务ID=100):更新商品价格
START TRANSACTION;
UPDATE products SET price = 200 WHERE id = 1;
-- 未提交

-- 同时事务B(事务ID=101):查询商品
START TRANSACTION; -- 隔离级别为REPEATABLE READ
SELECT price FROM products WHERE id = 1;
-- 此时返回更新前的价格,如100

MVCC 处理流程:

  1. 事务 A 修改 id=1 的价格,将原价格 100 写入 undo log,更新当前值为 200
  2. 事务 B 开始,创建 Read View,记录当前活跃事务包括事务 A(100)
  3. 事务 B 查询 id=1 的价格,发现最新版本由事务 100 创建,不可见
  4. 顺着回滚指针找到 undo log 中的历史版本,发现可见
  5. 返回历史版本中的价格 100

undo log 性能监控与优化

长事务监控

-- 查看长时间运行的事务
SELECT trx_id, trx_started, trx_state,
trx_tables_in_use, trx_rows_modified,
trx_mysql_thread_id, trx_query
FROM information_schema.INNODB_TRX
WHERE trx_started < NOW() - INTERVAL 10 MINUTE
ORDER BY trx_started;

大事务优化建议

  1. 避免在一个事务中处理过多数据,将大事务拆分成多个小事务
  2. 对于大表删除操作,使用TRUNCATE TABLE替代DELETE FROM,因为前者不生成 undo log
  3. 避免长时间活跃的事务,特别是那些修改大量数据的事务
  4. 合理设置事务隔离级别,必要时可降级为 READ COMMITTED
-- 大批量删除数据的优化方案
START TRANSACTION;
DELETE FROM large_table WHERE id <= 10000 LIMIT 1000;
COMMIT;
-- 分批提交,每批处理1000行

日志系统架构对比

三种日志的核心区别

维度

Binlog

Redo Log

Undo Log

所属层

服务层

InnoDB 引擎层

InnoDB 引擎层

日志类型

逻辑日志(SQL/行变更)

物理日志(页修改)

逻辑日志(数据旧版本)

主要作用

主从复制、数据恢复

崩溃恢复、事务持久性

事务回滚、MVCC

写入方式

追加写入,永不覆盖

循环写入,空间固定

回滚段管理

刷盘策略

sync_binlog 参数控制

innodb_flush_log_at_trx_commit

随事务提交写入

空间管理

追加,需手动/自动清理

循环覆盖

回滚段自动回收

日志内容

DML/DDL 等修改操作

页级别的物理修改记录

行记录的旧值

三种日志与 ACID 的关系

  • 原子性:由undo log保障,确保事务要么完全执行,要么完全不执行
  • 一致性:由数据库完整性约束+binlog保障,确保数据符合预期规则
  • 隔离性:由锁机制和MVCC(基于undo log)共同保障
  • 持久性:由redo log保障,确保已提交事务的修改永久生效

协同工作流程

在一个典型的更新操作中,三种日志的协同工作过程:

实战案例:日志系统在故障恢复中的应用

案例一:误删数据库恢复

# 1. 假设误执行了DROP DATABASE important_db
# 2. 定位binlog中DROP DATABASE语句的位置
mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000123 | grep -A 10 "DROP DATABASE"

# 3. 创建新的数据库
CREATE DATABASE important_db_new;

# 4. 在从库上重放DROP DATABASE之前的所有操作
mysqlbinlog --stop-position=12345678 /var/lib/mysql/mysql-bin.000123 | mysql -u root -p important_db_new

# 5. 检查并恢复数据

案例二:大事务导致 undo log 暴涨

问题现象:系统响应变慢,磁盘空间急剧减少

排查过程:

-- 检查是否有大事务长时间运行
SELECT * FROM information_schema.INNODB_TRX
WHERE trx_rows_modified > 10000
ORDER BY trx_started;

-- 发现一个删除千万级数据的事务运行了2小时

解决方案:

  1. 立即提交或回滚该事务释放 undo 空间
  2. 改进应用代码,使用批量提交或 TRUNCATE 替代大 DELETE
  3. 监控设置,对大事务提前告警

日志系统性能优化建议

  1. binlog 优化:
  • 选择合适的 binlog 格式:需要主从一致性选 ROW,需要性能且业务简单选 STATEMENT
  • 合理设置 sync_binlog:关键业务设为 1,性能优先可设为 0 或 100-1000
  • 定期清理旧 binlog:PURGE BINARY LOGS BEFORE '2023-11-01'
  1. redo log 优化:
  • 设置足够大的 redo log 文件:通常总大小在 1-8GB
  • 根据业务设置 flush 策略:金融类必须为 1,普通业务可设为 2 提升性能
  • 在 RAID 卡有电池保护的服务器上,可安全设置为 2
  1. undo log 优化:
  • 控制事务大小:单个事务修改行数最好控制在万级以内
  • 合理设置隔离级别:非必要不使用 SERIALIZABLE
  • 定期监控 History list length,正常应在几百到几千

总结

日志类型

核心用途

性能影响

数据安全保障

最佳实践

binlog

主从复制
数据恢复
审计

设为 sync_binlog=1 会降低 10-20%性能

防止服务器崩溃导致的数据丢失

根据复制需求选择格式
定期清理旧文件

redo log

事务持久性
崩溃恢复

设为 innodb_flush_log_at_trx_commit=1 会降低 15-20%性能

防止数据库崩溃导致的数据丢失

配置足够大的文件
根据业务重要性设置刷盘策略

undo log

事务回滚
MVCC 并发控制

长事务会导致性能下降和空间占用

支持事务原子性和隔离性

避免大事务
合理设置隔离级别
监控长事务

深度剖析:Spring AI 与 LangChain4j,谁才是 Java 程序员的 AI 开发利器? 首先介绍 AI 时代 Java 开发框架选择背景,接着对比两者功能特性(Spring AI 的生态集成与标准化设计、LangChain4j 的多模型适配与提示工程)、应用场景(企业级系统改造与创新产品开发)、开发体验(学习成本与调试工具)、生态扩展(Spring 商业支持与 LangChain4j 开源社区)、性能安全(企业级优化与自主安全实现)及成本趋势(短期投入、长期回报与技术演进),最后给出选型建议与混合架构方案。 阅读详情

相关推荐

警惕AI依赖:如何避免数字水蛭侵蚀你的认知能力

在人工智能技术日益普及的今天,人机协作已成为现代工作流的核心范式。其原理在于通过算法模型辅助人类完成信息处理、内容生成等任务,从而提升效率。然而,过度依赖AI可能导致认知卸载,引发思考能力退化等潜在风险。从技术价值看,AI的核心在于增强而非替代人类智能,关键在于建立健康的协作模式。在应用场景上,无论是编程开发、内容创作还是决策分析,用户都需警惕工具依赖对深度工作、创造性思维和决策责任的侵蚀。本文聚焦于识别AI依赖的早期信号,并提供构建分阶段使用流程、将AI作为质疑者等具体策略,旨在帮助读者守护核心认知能力,

weixin_30240349的博客 625

MySQL - 日志系统

MySQL日志分类:默认情况下,错误日志是开启的,且无法被禁止。 默认情况下,错误日志是存储在数据库的数据文件目录中,名称为hostname.err,其中,hostname为服务器主机名。我们可以在 MySQL 的配置文件“my.ini”中配置它: 1.2 错误日志记录信息 服务器启动和关闭过程中的信息 未必是错误信息,比如mysql是如何去初始化存储引擎的过程记录在错误日志里等等比如sock文件找不到,无法加载mysql数据库的数据文件,如果忘记初始化mysql或data dir路径找不到,或权限不正

迪曼奥特迦-博客 1211

PackML工业标准解析:统一机器状态管理与数据交换的实践指南

在工业自动化与智能制造领域,实现设备间的互联互通与高效协同是核心挑战。这背后依赖于一套标准化的机器行为与数据交换规范,其原理在于通过定义统一的状态模型与接口协议,消除不同厂商设备间的“语言”隔阂。这项技术的核心价值在于大幅降低系统集成复杂度、提升运维效率与生产透明度,是构建数字化工厂的基石。其典型应用场景包括包装机械、离散制造产线等需要多设备协同的领域。本文聚焦的PackML(包装机械语言)标准,正是这一理念的杰出实践,它通过一套严谨的**状态机模型**和**数据标签(PackTags)** 体系,为机器提

weixin_30070339的博客 401

MySQL的日志系统

MySQL体系结构与查询流程不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的 主角:redo log(重做日志)和 binlog(归档日志)。如果接触 MySQL,那这两个词肯 定是绕不过的,我后面的内容里也会不断地和你强调。不过话说回来,redo log 和 binlog 在设计上有很多有意思的地方,这些设计思路也可以用到你自己的程序里。

loopnz的博客 275

超详细!动态规划详解分析(典型例题分析和对比,附源码)

为啥要使用动态规划?什么时候使用动态规划?以下是我的一些理解和心得,如果你感兴趣,就接着往下看吧。 对您有帮助的话记得给我点个赞哟! 动态规划的基本思想 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。 动态规划算法与分治法类似,其基本思想也是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中 得到原有问题的解。与分治法不同的是,动态规划经分解后得到的子问题

qq_44398094的博客 8万+

BarTender破解版风险与低成本正版替代方案全解析

在工业自动化和企业信息化领域,标签打印与条形码技术是连接物理世界与数字系统的关键环节。其核心原理是通过软件驱动打印设备,将可变数据(如序列号、生产日期)与固定模板结合,生成可追溯的标识载体。这项技术的价值在于实现生产流程可视化、供应链管理精细化与质量控制自动化,广泛应用于仓储物流、制造执行、零售门店等场景。然而,软件授权合规性常成为企业成本控制的痛点,尤其面对BarTender这类行业标准工具时,部分用户可能寻求破解方案。但破解版软件通常采用内存补丁、伪造许可证等技术手段绕过验证,不仅存在法律风险,更会引发

weixin_32736961的博客 735

Mysql学习笔记之【日志系统】

持久化数据到磁盘是随机IO的过程,相对于顺序IO速度慢,所以Mysql选择将数据缓存起来,等待一个合适的时间一次性写入磁盘,减少IO。binlog记录的是mysql原始的执行语句,并采取的是追加写入的方式记录的,所有可以恢复数据库在任意时刻的数据状态。Mysql的写操作不知立刻写入磁盘的,而是先写日志,等redolog 和 binlog持久化到磁盘后,再由后台进程选择时间将数据持久化到硬盘。undolog 记录的是事务执行过程中旧数据的状态,redolog记录的是数据更新之后的状态。

刘现在的博客 270

【LVGL】从HTML到LVGL:嵌入式UI的设计迁移与落地实践

嵌入式UI迁移实践:从HTML到LVGL 本文介绍了将HTML/CSS设计的UI原型迁移到嵌入式系统(LVGL)的完整流程,重点涉及"HTML→Figma→LVGL"的三步转换方法。具体内容包括: 设计迁移流程:通过Figma作为中间桥梁,将HTML原型转化为标准设计资产,再适配到LVGL库; 工具与参数准备:详细列出了设计迁移所需的工具链和需要提取的核心设计参数; Figma还原步骤:分组件讲解如何在Figma中1:1还原HTML设计,包括标题栏、压力显示区、图表区等核心组件; LVG

ymlmail的博客 1972

Mysql中的日志系统

mysql 日志 binlog undo log redo log 慢查询日志 mysqldumpslow

心流时间的博客 1291

【系统架构设计师】预测试卷一:综合知识(75道选择题)

软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,架构风格反映领域中众多系统所共有的结构和 (48),强调对架构(49)的重用。 (48) A. 语义特性 B. 功能需求 C. 质量属性 D. 业务规则 (49) A. 分析 B. 设计 C.实现

数据知道的博客 7766

如何理解S参数的三大特性

提到S参数的时候经常会涉及一些概念,如无源性、因果性、互易性等,本文逐一介绍这些特性的概念、成因以及判断方式。

一只豌豆象的博客 4497

MySQL 8.0文档阅读: binlog文件格式

文章目录宏mysqlbinlog源码阅读binlog文件分析 官网上没有找到binlog文件内部格式的说明, 本文是通过mysql源码猜的 宏 binlog_event.h: //binlog事件头的最小大小 #define LOG_EVENT_MINIMAL_HEADER_LEN 19U #define EVENT_TYPE_OFFSET 4 #define SERVER_ID_OFFSET...

wzj_whut的专栏 1415

【图像拼接】论文精读:Content-Preserving Warps for 3D Video Stabilization(CPW)

论文题目:Content-Preserving Warps for 3D Video Stabilization——用于3D视频稳定的内容保持扭曲GSP、SPW、LPC等warp时多个项最小化问题的思想都是来自于这篇论文——CPW视频防抖。我们描述了一种从手持摄像机转换视频的技术,以便它看起来像是用定向相机运动拍摄的。我们的方法调整视频以出现,就好像它是从附近的视点拍摄的,允许模拟 3D 相机运动。通过仅针对感知合理性,而不是准确的重建,我们能够开发能够有效从单个源视频中重建动态场景的算法。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

MySQL日志系统解析:Redo Log、Undo Log与Binlog

MySQL的日志系统是其数据持久性、崩溃恢复、主从复制和数据审计的核心。理解Redo Log、Undo Log和Binlog这三大日志的作用、原理和相互关系,对于深入掌握MySQL的内部机制至关重要。本文将探讨这些日志的持久化策略、多版本链、格式以及两阶段提交机制。

m0_66498423的博客 1154

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

MySQL Binlog、Redo Log、Undo Log三大日志原理与协作机制详解:深入理解数据库事务持久化机制

本文深入解析 MySQL 数据库三大核心日志(Binlog、Redo Log、Undo Log)的工作原理与协作机制。通过详细分析每个日志的作用、写入流程和相互关系,帮助读者理解 MySQL 如何保证事务的原子性、持久性和一致性。文章包含 7 张 mermaid 图表,全面展示日志系统的内部工作流程,适合数据库开发者和运维人员阅读。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 850

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

MySQL 三大日志:redo log、undo log、binlog 详解

MySQL的三大日志系统(redo log、undo log、binlog)共同保障了数据库的事务安全和可靠性。redo log作为InnoDB特有的物理日志,通过预写日志机制确保数据持久性;undo log记录数据修改前的状态,支持事务回滚和MVCC机制;binlog是服务器层逻辑日志,用于主从复制和时间点恢复。三者协同工作,通过两阶段提交等机制确保数据一致性。理解这些日志的工作原理和差异,对于数据库性能优化和故障恢复至关重要,需根据业务需求合理配置相关参数以平衡安全性和性能。

呜呼哈 1452

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【深入剖析MySQL事务核心机制:Undo Log、Redo Log与MVCC原理详解】

MySQL主从复制是一种常用的数据复制技术,它允许将一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。这种机制为数据库提供了高可用性、负载均衡和数据备份等能力。主从复制的核心用途数据分布:将数据地理分布到不同位置负载均衡:将读操作分发到多个从服务器备份:从服务器作为备份数据源高可用性:主服务器故障时可快速切换到从服务器MySQL通过redo log、undo log和binlog三大日志系统,以及MVCC机制,共同构建了一个强大而高效的事务处理系统。

m0_64006292的博客 854

深入理解MySQL日志体系:Binlog、Redo Log与Undo Log核心原理

在MySQL数据库的运行过程中,各类日志机制是保障数据一致性、可靠性和可恢复性的核心。无论是主从复制、数据备份恢复,还是崩溃后的故障自愈,都离不开Binlog、Redo Log、Undo Log这三大日志的协同工作。本文将深入剖析这些日志的核心原理、参数配置及关联机制,带你全面掌握MySQL日志体系的精髓。

专注Java和MySQL领域知识分享 1277

MySQL InnoDB存储引擎中的日志系统解析:binlog、redo log、undo log

binlog作为逻辑日志层,保障了数据复制的全局一致性redo log通过物理日志实现了高效的崩溃恢复机制undo log则支撑了事务的原子性和多版本并发控制理解这些日志的交互关系,对于优化数据库性能、设计高可用架构以及处理复杂事务场景具有重要意义。实际应用中需要根据业务特点,合理配置日志参数,平衡数据安全与系统性能。

qq_24520119的博客 1042

MySQL 日志:Redo、Bin 与 Undo Log

这篇文章深入解析了 MySQL InnoDB 存储引擎中的三种核心日志——Redo Log、Bin Log 和 Undo Log,探讨了它们的作用、工作原理及写入时机。Redo Log 主要用于数据的持久性保障和崩溃恢复,Bin Log 支持主从复制和增量恢复,而 Undo Log 实现事务回滚和多版本并发控制(MVCC)。文章逐一分析了每种日志在事务的不同阶段(START、执行、COMMIT)中的写入流程,并详细对比了它们在应用场景和性能优化中的协作关系,为使用人员提供了日志管理与优化的实用建议。

tatasix的博客 1492

MySQL 三大日志系统深度解析:Binlog、Redo Log、Undo Log

MySQL日志系统由RedoLog、UndoLog和Binlog组成,共同保障事务ACID特性。RedoLog采用WAL机制实现崩溃恢复,UndoLog支持事务回滚和MVCC,Binlog用于主从复制和数据恢复。两阶段提交机制确保RedoLog和Binlog的一致性。生产环境建议配置:innodb_flush_log_at_trx_commit=1、binlog_format=ROW、sync_binlog=1。三大日志协同工作,RedoLog保证持久性,UndoLog实现原子性和隔离性,Binlog确保一

0xDevNull的博客 623

揭秘 MySQL 三大日志:Undo、Redo、Binlog

MySQL日志系统解析:UndoLog、RedoLog与Binlog MySQL通过三种核心日志机制确保数据安全与一致性:UndoLog用于事务回滚,记录数据修改前的状态,支持事务原子性和MVCC;RedoLog实现事务持久性,记录物理页修改,采用循环写入机制确保故障恢复;Binlog是服务层二进制日志,提供主从复制和数据恢复功能,支持STATEMENT/ROW/MIXED三种记录模式。三种日志在功能、存储方式和应用场景上各有侧重:UndoLog和RedoLog属于InnoDB引擎层,分别处理事务回滚和崩溃

u013241501的专栏 1012

MySQL日志系统:Binlog、Redo Log与Undo Log详解

数据库日志系统是保障数据一致性和实现故障恢复的核心机制。MySQL采用多日志协同架构,其中二进制日志(Binlog)记录所有数据变更操作,是实现主从复制的基础;重做日志(Redo Log)通过WAL机制提升写入性能,解决随机IO问题;回滚日志(Undo Log)支持事务回滚和MVCC实现。合理配置日志参数对数据库性能影响显著,如调整innodb_log_file_size可提升30%以上TPS。在生产环境中,建议采用ROW格式的Binlog配合定期清理策略,同时为日志文件分配独立磁盘。这些日志机制共同构成了

365

深入剖析 MySQL 日志系统:Redo Log、Undo Log 与 Binlog 的协同工作原理

MySQL通过三种日志(Redo Log、Undo Log、Binlog)协同工作,实现高性能与数据可靠性的平衡。Redo Log作为物理日志,通过WAL机制保证崩溃恢复和持久性;Undo Log作为逻辑日志,支持事务回滚和MVCC多版本控制;Binlog则用于主从复制和时间点恢复。三者通过两阶段提交协议确保数据一致性,其中Redo Log和Binlog的协作是关键。这种日志架构使MySQL既能保证事务ACID特性,又具备良好的并发性能和高可用能力,是数据库稳定运行的基石。

m0_46633338的博客 891

MySQL 三大日志(binlog、redo log 和 undo log)深度解析

MySQL的三大日志(binlog、redo log和undo log)是保障数据可靠性和一致性的核心组件。redo log是InnoDB存储引擎的物理日志,用于崩溃恢复,通过顺序IO写入提升性能,支持三种刷盘策略。binlog是MySQL Server层的逻辑日志,用于数据备份、主从同步,支持statement、row和mixed三种格式,其中row格式确保数据一致性。undo log记录事务修改前的数据,支持事务回滚和MVCC。这三类日志协同工作,确保MySQL的数据持久性、事务完整性和高可用性。

大河之犬的博客 949

深入解析MySQL日志四剑客:Undo Log、Redo Log、Bin Log与Relay Log

MySQL日志体系由Undo LogRedo LogBin Log和Relay LogUndo Log:记录数据的原始值,用于事务回滚和多版本并发控制(MVCC),支持事务隔离性和一致性。Redo Log:记录物理变更,用于数据持久化和崩溃恢复,保证了事务的持久性。Bin Log:记录逻辑变更,用于数据恢复、主从复制和数据审计,支持数据一致性和备份恢复。Relay Log:从库生成的本地日志,用于主从复制,提升了分布式架构下的高可用性。

hello.reader 1503
上一篇: MySQL调优到底有多难,为什么大厂面试官总是偏爱这个问题
下一篇: Java 实战:无锁方式实现高性能线程安全单例
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值