知识分享 | MySQL InnoDB 日志缓冲区(Log Buffer)讲解

本文深入探讨了InnoDB存储引擎中的两种关键日志:undolog与redolog的作用及其实现原理。同时介绍了Mini-Transaction如何确保日志的ACID特性,并详细解析了innodb_flush_log_at_trx_commit参数的不同取值对数据安全与性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

InnoDB有两个非常重要的日志:undo log、redo log
(1)通过undo log可以看到数据较早版本,实现MVCC,或回滚事务等功能。
(2)通过redo log用来保证事务持久性。

Mini-Transaction是用来实现InnoDB的物理逻辑日志的写入和页恢复的。
通过Mini-Transaction来保证并发事务操作和数据库异常时页的一致性。

Mini-Transaction主要用于innodb redo log和undo log写入,保证两种日志的ACID特性。(注意:是日志的ACID特性)​

当在MySQL中对InnoDB表进行更改时,这些更改首先存储在InnoDB日志缓冲区的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。

image.png
redo日志缓冲区是内存存储区域,用于保存要写入磁盘上的日志文件的数据。日志缓冲区大小由innodb_log_buffer_size 变量定义,默认大小为16MB。

日志缓冲区的内容定期刷新到磁盘。较大的日志缓冲区可以运行大型事务,而无需在事务提交之前将重做日志数据写入磁盘。因此,如果有更新,插入或删除许多行的事务,则增加日志缓冲区的大小可以节省磁盘I/O。

innodb_flush_log_at_trx_commit :控制如何将日志缓冲区的内容写入并刷新到磁盘。
innodb_flush_log_at_timeout :控制日志刷新频率。

如果磁盘I/O导致性能问题,则需要观察事务,例如涉及许多BLOB条目的事务。只要InnoDB日志缓冲区已满,便会将其刷新到磁盘,因此增加缓冲区大小可以减少I/O。

日志文件的缺省数量为两个: ib_logfile0 和 ib_logfile1 。
日志具有固定大小,默认大小取决于MySQL版本。
从5.7版本开始,默认值是每个48MB,从MySQL 5.6.3开始,最大总大小为 512GB。

如果应用程序是写密集型应用程序,则可以使用48MB,并且鉴于日志以循环方式工作,当日志写满时,有必要对磁盘上的数据文件进行写操作。所以,如redo log大小设置较小,可能会导致频繁的磁盘写入甚至是等待,极大地降低了性能。可通过查看日志序列号状态变量log_lsn_current和log_lsn_last_checkpoint来观察刷新的频率。通过将两个值相减,并与重做日志空间的总大小进行比较,可了解刷新是否比期望的发生更频繁。

要调整 innodb_log_buffer_size 或 innodb_log_file_size 变量,必须在MySQL的my.cnf配置文件中显式定义。
attention:
调整 innodb_log_buffer_size 或 innodb_log_file_size 变量前,建议关闭实例,以确保MySQL正确无误地停止运行。如果在关闭过程中出现错误,则现有的日志文件可能尚未完全写入数据文件,数据可能会丢失。

这里重点讲述下innodb_flush_log_at_trx_commit,该参数控制如何将日志缓冲区的内容写入并刷新到磁盘。

先看下图:
image.png

innodb_flush_log_at_trx_commit参数在0,1,2下的不同含义:

  1. 属性值为0:事务提交时,不会将redo log buffer写入redo file,而是等待主线程按时(1秒钟)写入。在该值下,写入效率最高,但是数据安全最低。
  2. 属性值为1:事务每次提交时,都会将重做日志写入文件系统缓存,并且调用文件系统的fdatasync(),将文件系统缓冲中的数据真正写入磁盘存储,确保不会出现数据丢失。在该值下,写入效率最低,但是数据安全最高。一般建议将该属性值设置为1,以获得较高的数据安全性,而且也只有设置为1,才能保证事务的持久性。
  3. 属性值为2,事务提交时,也会将日志文件写入redo log buffer和OS层的文件系统缓存,但是不会调用fdatasync(),而是让文件系统自己去判断何时将缓存写入磁盘。在该值下,二者都是中等水平。

【参考】
https://blog.youkuaiyun.com/weixin_39997438/article/details/107730854

【参考】
https://blog.youkuaiyun.com/u010647035/article/details/104733939

文章至此。

以下为个人公众号,欢迎扫码关注:
image.png

### 安装LibreOffice于无外网连接的Linux系统 #### 准备工作 对于在没有互联网连接的情况下安装LibreOffice,在离线环境中操作前需确认目标系统的具体发行版,例如CentOS、Ubuntu或Debian等[^1]。这一步骤至关重要,因为不同版本的操作系统可能需要特定配置或是依赖库。 #### 下载所需文件 为了顺利完成安装过程,建议先在一个有网络访问权限的机器上登录LibreOffice官方网站,依据所使用的操作系统环境挑选相匹配的软件包组合。通常情况下,除了主要的应用程序包之外,还需要额外获取中文语言支持以及帮助文档的相关资源,并将这些压缩文件传输至待部署的目标设备上的`/opt`目录下[^3]。 #### 解压并设置环境变量 一旦所有必需的数据都被安全转移过来之后,则可利用命令行工具解压缩已下载好的档案: ```bash tar -xvf LibreOffice_*.tar.gz -C /opt/ ``` 接着创建指向新安装位置的链接以便后续调用更加便捷: ```bash ln -s /opt/LibreOffice_* /opt/libreoffice ``` 最后更新共享库缓存使新增加的内容生效: ```bash ldconfig ``` #### 配置桌面集成 为了让应用程序更好地融入现有的图形界面当中去,还需执行如下指令来完成最终设定: ```bash /opt/libreoffice/program/setup.bin --nodefaultlinktarget --nologo --norestore ``` 通过上述一系列措施即可实现在不具备公网接入条件下的Linux平台上成功部署LibreOffice办公套件的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值