Mysql数据库redo log及binlog的写入

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: Mysql数据库redo log及binlog的写入

Mysql整理记录Day4

通过前几篇文章的学习,我们知道Mysql主要是依靠 redo log 和 binlog 这两个日志来保证数据不丢失的。

redolog 和 binlog 的写入流程是怎样的?今天我们就来聊聊这个话题

binlog的写入机制

其实,binlog的写入逻辑比较简单,事务执行的过程中,先把日志写到binlog cache,事务提交的时候再写到binlog文件。注意,一个事务的binlog是不能被拆开的,因此不管这个事务有多大,都需要保证一次性写入,这就涉及到binlog cache的保存问题。

在了解binlog的写入机制之前,我们需要有这么几个概念

  1. 系统给binlog cache分配了一段内存,每个线程有自己的 binlog cache,但是共用一份binlog文件, binlog_cache_size 参数用来控制每个线程中binlog cache的大小,如果超过了 这个参数,就需要暂存到磁盘。
  2. 下图中的write,指的是将binlogcache的日志写入到文件系统的pagecache中,并没有持久化到磁盘,所以速度比较快。(补充:page cache是文件系统中的概念,是文件系统向内核申请的一段内存。后面说到的mysql异常重启,不会影响page cache保存的数据。只有当操作系统断电或者异常重启时,page cache的内容才会丢失。)
  3. 下图中的fsync,才是将数据持久化到磁盘,一般情况下,我们认为只有fsync才占磁盘的IOPS。

write和fsync的时机是由参数sync_binlog控制的:

  • sync_binlog = 0时,表示每次提交事务,直接write,不fsync;
  • sync_binlog = 1时,表示每次提交事务,都会执行fsync;
  • sync_binlog = N(N>1)时,表示每次提交事务都write,在累积到N个事务的时候,调用fsync。

因此,在IO瓶颈的场景里,将sync_binlog设置为一个比较大的值,可以提升性能,降低 IOPS 消耗。但是,对应的风险就是,如果主机异常重启,会丢失这N个事务的binlog。实际业务中,考虑到丢失日志的可控性,一般设置为100~1000。

redo log的写入机制

事务执行过程中,redo log是先写到redo log buffer的。redo log buffer是Mysql进程向系统申请的一段内存。所有的线程共用这段内存空间。

InnoDB 提供了参数 innodb_flush_log_at_trx_commit 来控制 redo log 的写入策略:

  1. 设置为0,表示每次事务提交都只是把 redo log 保留在 redo log buffer 中;
  2. 设置为1,表示每次事务提交都将 redo log 持久化到磁盘;
  3. 设置为2,表示每次事务提交都只是把 redo log 调用 write 写到 page cache。

InnoDB 后台有一个线程,每隔1s,调用 write 写入到 page cache,再调用 fsync 持久化到磁盘。注意,事务执行过程中的 redo log 也是直接写在 redo log buffer 中的,这些 redo log 也会被后台线程一起持久化到磁盘。也就是说,一个没有提交事务的 redo log 也可能被持久化到磁盘。

以下两种场景也会让一个没有提交事务的redolog写入到磁盘:

第一种:redo log buffer 占用空间即将达到参数 innodb_log_buffer_size 的一半,后台线程主动写盘。(只是写到文件系统的 page cache);

第二种:并行事务提交的时候,顺带将另外一个没提交事务的redo log持久化到磁盘。

通常我们说的Mysql 的双“1”配置,指的是 sync_binlog 和 innodb_flush_log_at_trx_commit 都设置为1。也就是说,一个事务完整提交前,需要两次刷盘,一次是redo log(prepare阶段),一次是bin log。

假设你从Mysql看到的TPS是每秒2万的话,那么是不是每秒会有四万次刷盘?实际上不是,因为redo log的组提交机制,大大节约率磁盘的IOPS。

LSN(日志逻辑序列号),单调递增,对应一次次redo log的写入点,每次写入len长度的redolog,LSN就增加len。

笔记参考于极客时间《MySQL实战45讲》

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
21天前
|
存储 安全 关系型数据库
Mysql 的binlog日志的优缺点
MySQL的binlog(二进制日志)是一个记录数据库更改的日志文件,它包含了所有对数据库执行的更改操作,如INSERT、UPDATE和DELETE等。binlog的主要目的是复制和恢复。以下是binlog日志的优缺点: ### 优点: 1. **数据恢复**:当数据库出现意外故障或数据丢失时,可以利用binlog进行点恢复(point-in-time recovery),将数据恢复到某一特定时间点。 2. **主从复制**:binlog是实现MySQL主从复制功能的核心组件。主服务器将binlog中的事件发送到从服务器,从服务器再重放这些事件,从而实现数据的同步。 3. **审计**:b
|
30天前
|
SQL 关系型数据库 MySQL
mysql的binlog恢复数据
mysql的binlog恢复数据
29 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复
对于MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复。二进制日志是MySQL中记录所有数据库更改操作的日志文件。要进行时间点恢复,您需要执行以下步骤: 1. 确保MySQL配置文件中启用了二进制日志功能。在配置文件(通常是my.cnf或my.ini)中找到以下行,并确保没有被注释掉: Copy code log_bin = /path/to/binary/log/file 2. 在需要进行恢复的时间点之前创建一个数据库备份。这将作为恢复的基准。 3. 找到您要恢复到的时间点的二进制日志文件和位置。可以通过执行以下命令来查看当前的二进制日志文件和位
100 1
|
2月前
|
存储 SQL 安全
浅谈MySQL Binlog
浅谈MySQL Binlog
45 0
|
2月前
|
SQL 存储 关系型数据库
解析MySQL Binlog:从零开始的入门指南【binlog入门指南】
解析MySQL Binlog:从零开始的入门指南【binlog入门指南】
1203 0
|
2月前
|
SQL 存储 关系型数据库
binlog 日志的三种格式
binlog 日志的三种格式
|
2月前
|
监控 关系型数据库 MySQL
MySQL Binlog实战:在生产环境中的应用与最佳实践【实战应用】
MySQL Binlog实战:在生产环境中的应用与最佳实践【实战应用】
36 0
|
2月前
|
SQL 监控 关系型数据库
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
44 0
|
2月前
|
监控 安全 数据库
Binlog vs. Redo Log:数据库日志的较劲【高级】
Binlog vs. Redo Log:数据库日志的较劲【高级】
80 0
|
4月前
|
缓存 关系型数据库 MySQL
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
50 0