MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点

1.REDO LOG 是用来做数据库crash recovery的,是保证数据库数据正确性、完整性及持久性的重要机制之一。在数据库操作中,它保存了对InnoDB表中数据的修改记录,所以也叫日志文件。

2.日志文件内部也是按照大小相等的页面切割,页面大小为512个字节(回顾下数据页是多大? )。考虑到机械硬盘的块大小也是512字节,所以日志块也是如此设计。

解释:这是因为写日志其实就是为了提高数据库写入吞吐量,如果每次写入是磁盘块大小的倍数,效率才是最高的,并且日志将逻辑事务对数据库的分散随机写入转化成了顺序的512字节整倍数据的写入,这样就大大提高了数据库的效率。

3.物理事务(Mini-transaction ,MTR)是相对逻辑事务而言的。(逻辑事务具有ACID四个特性,用来保证数据库的完整性--要么都做,要么什么都不做。)物理事务是对InnoDB存储引擎而言的,在存储引擎中,只要涉及到文件修改、文件读取等物理操作,都离不开这个物理事务,可以说,物理事务是Buffer Pool中Page与文件中的一个桥梁。

4.InnoDB的REDO日志不完全是物理日志,它包含了部分逻辑意义。比如,插入一条记录时,MTR记录的是在一个页面中写入这条记录,内容大致包括页面号、文件号(表空间号)、以及这条记录的值(包括每个列信息),这样就有了逻辑概念。

5.一个逻辑事务由多个物理事务组成,用来保证数据库的ACID特性。物理事务可以保证一次物理修改是完整的,即可以理解为一个底层的相对完整的操作。比如,在插入一条记录的过程中,会包括写一条回滚记录及插入时写入一个页面等,那么这些逻辑上是一个动作的物理写入,就可以被认为是一个独立的物理事务。

6.物理事务的作用过程:首先,在系统将一个页面载入Buffer Pool时,需要一个新开始(mtr_start)或者一个已将开始的物理事务,载入时需要指定页面的获取方式,比如是用来读取的还是用来修改的,根据获取方式上锁(写,则上X锁;读,上S锁),上锁前,还需进行检查,例如是否页面已被上锁,是否需要排队等待等 。然后,当上锁成功后,物理事务就会将这个页面的内存结构存储到memo动态数组中,然后这个物理事务就可以访问这个页面了。物理事务对页面的访问有两种操作,一种是读,另一种是写。读操作就是简单读取指定页面内偏移及长度的数据。写则是指定从某一偏移开始写入指定长度的数据。同时,如果这个物理事务是写日志的,此时还需要对刚才的写操作记下日志。最后,是物理事务的提交,主要是将这个物理事务产生的日志写入到InnoDB日志系统的日志缓冲区中,然后,等待时机(日志刷盘机制),将缓冲区中的日志数据刷到日志文件中。

7.日志缓冲区的存储只是一个暂时的中间状态,日志缓冲区的大小可以通过参数innodb_log_buffer_size来设置。

8.日志产生的作用,是将随机页面写入变成顺序日志的写入,从而用一个速度更快的写入来保证速度较慢的写入的完整性,已提高整体数据的性能。

9.REDO 日志恢复 主要过程:(1)从日志文件的固定位置找到最新的检查点信息;(2)从最新的检查点位置开始扫描日志文件,做数据库恢复。

10.InnoDB的REDO是在UNDO之前做的,是等到物理的数据库操作都完成之后,才能在物理数据一致的基础上去做一些逻辑的操作,即UNDO回滚操作。

-----主要部分内容参考梳理于网络知识,此仅为学习笔记,在此原创作者感谢!

原文地址:https://www.cnblogs.com/xuliuzai/p/10236671.html

时间: 2024-11-09 11:29:01

MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点的相关文章

MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现

一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点.因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在某一个页面(这条记录最终被插入的位置)的多个偏移位置写入某个长度的值,例如页头的记录数.槽数.页尾槽数据.页中的记录值等.这些本是一些物理操作,而Innodb为了节省日志量及其它原因,设计为逻辑处理的方式,即在一个页面上插入一条记录时,对应的日志内容包括表空间号.页面号.将被记录的各个列的值等内容,

MySQL 基础知识梳理学习(二)----记录在页面层级的组织管理

1.InnoDB的数据存储结构 InnoDB中数据是通过段.簇.页面构成的. (1)段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引.表.回滚段的基本元素.创建一个索引(B+树)时会同时创建两个段,分别是内节点段和叶子段,内节点段用来管理(存储)B+树中非叶子节点(页面)的数据,叶子节点用来管理(存储)B+树中叶子节点数据.一个索引包括2个段,那么一个表的段的数目,就是索引的个数乘以2了. (2)簇是构成段的基本元素,一个段有若干个簇构成.一个簇是物理上连续分配的一

MySQL 基础知识梳理学习(一)----系统数据库

information_schema 此数据库是MySQL数据库自带的,主要存储数据库的元数据,保存了关于MySQL服务器维护的所有其他数据库的信息,如数据库名.数据库表.表列的数据类型及访问权限等. 这个库在很多情况下,可以帮助我们做一些自动化处理的工作,比如巡检程序找到所有的MyISAM表,或者是找到所有的自增列快达到上限的表.很多工具的信息来源,比如Percona Toolkit,它在查一些信息的时候也是通过在这个库上执行SQL语句来做的. 这个库有其明显的缺点:它在每次查找的时候,都会现

MySQL 基础知识梳理学习(五)----半同步复制

1.半同步复制的特征 (1)从库会在连接到主库时告诉主库,它是不是配置了半同步. (2)如果半同步复制在主库端是开启了的,并且至少有一个半同步复制的从节点,那么此时主库的事务线程在提交时会被阻塞并等待,结果有两种可能,要么至少一个从库节点通知它已经收到了所有这个事务的Binlog事件,要么一直等待直到超过配置的某一个时间点为止,而此时,半同步复制将自动关闭,转换为异步复制. (3)从库节点只有在接收到某一个事务的所有Binlog,将其写入并Flush到Relay Log文件之后,才会通知对应主库

[SQL] SQL 基础知识梳理(三)- 聚合和排序

SQL 基础知识梳理(三)- 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 目录 一.对表进行聚合查询 1.聚合函数 (1)5 个常用函数: ①COUNT:计算表中的记录(行)数. ②SUM:计算表中数值列的数据合计值. ③AVG:计算表中数值列的数据平均值. ④MAX:求出表中任意列中数据的最大值. ⑤MIN:求出表中任意列中数据的最小值. (2)聚合:将多行汇总成一行. 图1-1 Shohin 表 2.计算

MySQL基础知识03数据类型(三)日期时间相关类型

1. DATE DATE类型只包含日期,格式:'YYYY-MM-DD'.范围从'0000-01-01'到'9999-12-31'.其中年月日只能输入有效的年月日. mysql> create table d1 ( id  date primary key); Query OK, 0 rows affected (0.02 sec) mysql> show create table d1; +-------+--------------------------------------------

[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为“参数”,输出值称为“返回值”. 2.函数的种类: (1)算术函数 - 数值计算 (2)字符串函数 - 字符串操作 (3)日期函数 - 日期操作 (4)转换函数 - 转换数据类型 (5)聚合函数 - 数据聚合 3.算术函数(加.减.乘.除):+.-.*./ [备注]数据类型 NUMBERIC(全体位数,小数位数)可以指定数值的大小. C

[SQL] SQL 基础知识梳理(七)- 集合运算

SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 CREATE TABLE Shohin2 (shohin_id CHAR(4) NOT NULL, shohin_mei VARCHAR(100) NOT NULL, shohin_bunrui VARCHAR(32) NOT NULL, hanbai_tanka INTEGER , shiire

Python基础知识梳理 - 第01部分

在开始Python基础知识梳理前, 先安装下环境. 以下过程是在Linux操作系统, root用户下进行的, 主要安装了2.7版本的python, 和pip, ipython, virtualenv等工具, 最后是vim的设置. 1. 安装python. # wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz Python-2.7.14 # ./configure --prefix=/usr/local/python27