MySQL系列—11.Redo log

news/2024/9/19 4:02:00 标签: mysql, 数据库

1.简介

概念

        redo log用于记录事务操作变化,记录的是数据被修改之后的值,(tbs space id + page no + action)。

作用

        尚未完成的DML,数据库崩溃则用log恢复。保证事务持久性。

( 1 ) 在页面修改完成之后,脏页刷入磁盘之前,写入 Redo 日志;
( 2 ) 实现 WAL: 日志比数据页先写回磁盘 
( 3 ) 聚簇索引 / 二级索引 / Undo 页面修改,记录 Redo 日志;

(4)至少要有2个redo log,文件名序号从0开始,从ib_logfile0到ib_logfileN

相关参数

innodb_log_files_in_group
#redo log 文件的个数,命名方式如: ib_logfile0 iblogfile1
innodb_log_file_size
# 单个 redo log 文件设置大小
innodb_log_group_home_dir
#redo log 文件组所在的路径
innodb_log_buffer_size
#redo log buffer 大小 , 默认 16 M
事务日志写入磁盘,把 redo log 放到该缓冲区,然后根据 innodb_flush_log_at_trx_commit 参数的设 置,再把日志从 buffer flush 到磁盘中
innodb_flush_log_at_trx_commit

#redo log刷新到磁盘策略,默认1

- 值为 0 , 每次 commit 事务 , 并不将事务的重做日志写入磁盘上日志文件,而是等待主线程每秒
刷新
- 1 , 执行 commit 时将重做日志缓冲同步写到磁盘,即伴有 fsync 的调用
- 2 ,将重做日志异步写到磁盘,即写到文件系统的缓存(OS cache)中。
缺点
- 0 ,当数据库发生宕机时,部分日志未刷新到磁盘,因此会丢失最后一段时间的事务。
- 2 ,当操作系统宕机时,会丢失未从文件系统缓存刷新到重做日志文件那部分事 务。

2.工作流程

更新一条记录 ,redo 流程如下 :
1 )从磁盘加载索引数据页到 buffer pool 的索引页中
2 )写入数据的旧值便于 rollback
3 )更新缓冲页中的数据
4 )生产一条重做日志并写入 redo log buffer ,记录的是数据被修改后的值
5 )当事务 commit 时,将 redo log buffer 中的内容刷新到 redo log file ,对 redo lo
g file 采用追加写的方式
6 )定期将内存中修改的数据刷新到磁盘中

3.Write Ahead Log

InnoDB 的更新操作采用的是 Write Ahead Log ( 预先日志持久化 ) 策略,即先写日志,再写
入磁盘。
作用:
( 1 ) 修改的 这个操作记录在日志中, 而不必马上将更改内容刷新到磁盘上 , 从而将随机写
转换为顺序写 , 提高了性能。
(2) 内存中的数据页会和磁盘上的数据页内容不一致 , 此时将内存中的这种数据页称为 脏页

4.Redo Log Buffer 空间管理

buffer pool 中把数据修改情况记录到 redo log buffer ,出现以下情况,再把 redo log 刷下
redo log file
- Redo log buffer空间不足
- 事务提交(依赖innodb_flush_log_at_trx_commit参数设置)
- 做checkpoint
- 实例shutdown
- binlog切换

5.LSN

1.LSN
LSN: log sequence number)日志序列号,LSN 是一个一直递增的整型数字,表示事务写入到日志的字节总量 .
 
存在位置
( 1 ) 日志会携带一个 LSN
( 2 ) 每个数据页上也会记录一个 LSN( 日志序列号 ).
查看lsn
show engine innodb status\G
Log sequence number: 当前系统最大的 LSN
log flushed up to : 当前已经写入 redo 日志文件的 LSN
pages flushed up to :已经将更改写入脏页的 lsn
Last checkpoint at 就是系统最后一次刷新 buffer pool 脏中页数据到磁盘的 checkpoint

6.checkpoint

概念

 对于内存中的脏页,在一定条件下将脏页刷新到磁盘,这个点位行为叫checkpoint.

分类

( 1 )sharp checkpoint :在关闭数据库的时候,将 buffer pool 中的脏页全部刷新到磁盘中。
( 2 )fuzzy checkpoint 数据库正常运行时,在不同的时机,将部分脏页写入磁盘,也是为了避免一次刷新全部的脏页造成的性能问题。
 
        - Master Thread checkpoint :每秒或者每 10 秒一次的频率,将部分脏页从内存中刷新
到磁盘
        - Async / Sync Flush checkpoint:
设重做日志的 LSN 记为 redo_lsn ,将已经刷新回磁盘最新页的 LSN 记为 checkpoint_lsn.
checkpoint_age = redo_lsn - checkpoint_lsn
async_water_mark = 75 % * total_redo_log_file_size # 异步
sync_water_mark = 90 % * total_redo_log_file_size # 同步
checkpoint_age< async_water_mark # 无需刷盘
async_water_mark<checkpoint_age< sync_water_mark #触发刷盘到 checkpoint_age < async_water_mark
checkpoint_age> sync_water_mark # 强制同步刷盘 , 影响数据库性能会抖一下 , 基本很
少发生
查看参数:
mysql> show global status like 'Innodb_buffer_pool_pages%';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| Innodb_buffer_pool_pages_data    | 995   |
| Innodb_buffer_pool_pages_dirty   | 0     |
| Innodb_buffer_pool_pages_flushed | 200   |
| Innodb_buffer_pool_pages_free    | 7194  |
| Innodb_buffer_pool_pages_misc    | 3     |
| Innodb_buffer_pool_pages_total   | 8192  |
+----------------------------------+-------+
mysql> show global status like '%wait_free';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| Innodb_buffer_pool_wait_free | 0     |
+------------------------------+-------+
1 row in set (0.00 sec)

#不为0代表需要free page,没有可用的freepage,数据库性能有问题


http://www.niftyadmin.cn/n/5664941.html

相关文章

Oracle VM VirtualBox仅主机(Host-0nly)网络实现外网连接

目录 1.仅主机(Host-0nly)网络介绍 1.操作步骤 2.测试​编辑 “如果您在解决类似问题时也遇到了困难&#xff0c;希望我的 经验分享 对您有所帮助。如果您有任何疑问或者想分享您的经历&#xff0c;欢迎在评论区留言&#xff0c;我们可以一起探讨解决方案。祝您在编程路上顺利…

1.pytest基础知识(默认的测试用例的规则以及基础应用)

一、pytest单元测试框架 1&#xff09;什么是单元测试框架 单元测试是指再软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试。 2&#xff09;单元测试框架 java&#xff1a;junit和testing python&#xff1a;un…

谷歌浏览器扩展程序怎么提升CSS开发效率

在现代Web开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;是不可或缺的一部分&#xff0c;它负责网页的视觉呈现和布局设计。为了提高CSS开发的效率&#xff0c;谷歌浏览器提供了许多实用的扩展程序。本文将介绍几个关键的扩展程序&#xff0c;并探讨如何利用它们来优…

Ubuntu上如何使用sh文件更新CMake

1. 环境版本 以下版本仅为验证版本&#xff0c;不代表仅在该环境下有效。 项目版本Ubuntu18.04.6 LTS默认CMake3.10.2更新CMake3.14.0 2. 问题描述 Ubuntu 18.04.6 LTS自带的apt包管理器支持CMake最高版本只到3.10.2&#xff0c;无法使用默认apt工具更新CMake。 3. 安装方…

Spring3-IoC1-IoC容器、基于xml管理bean

目录 IoC容器 概述 依赖注入 IoC容器在Spring中的实现 基于xml管理bean 获取bean 依赖注入 setter注入 构造器注入 特殊值处理 字面量赋值 null值 xml实体 CDATA节 特殊类型属性注入 对象类型属性注入 方式一&#xff1a;引用外部bean 方式二&#xff1a;内部…

二.Oracle每周运维操作

目录 2.1、监控数据库对象的空间扩展情况 2.2、监控数据量的增长情况 2.3、系统健康检查 2.4、 检查无效的数据库对象 2.5、检查不起作用的约束 2.6、检查无效的trigger 2.7 数据库补丁更新 解释&#xff1a; 操作步骤&#xff1a; 2.1、监控数据库对象的空间扩展情况 …

Ansible——Playbook基本功能

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1&#xff09;“play”2&#xff09;“task”3&#xff09;“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法&#xff1a;1. 基本结构2. 数据类型3. 列表4. 字典&#xff08;映射&#xff09;5. 注释…

数据库(mysql)常用命令

一.常见的数据库端口号 Mysql默认端口:3306 oracle 默认端口:1521 Sql server 默认端口:1433 注:Mysql采用 的是C/S(客户端/服务器端)架构 二.sql 语法基础 服务器,数据库,数据表,记录,字段之间的关系: 一台Mysql服务器可以管理多个数据库 一个数据库可以存在多张二维表…