InnoDB undo日志实验

MySQL undo日志实验 背景:在学习undo日志时,看到一个观点: 对于update操作的undo日志,不更新主键的情况下: 如果被更新的列占用的存储空间未发生变化,则就地更新 如果被更新的列占用的存储空间发生改变,变大或变小,则先删除后插入,并且该删除时直接删除,而不是标记删除 因此本文浅浅实验下,在上述两种情况下的表空间变化,以及undo日志,并看下回滚是如何操作的。 环境 MySQL版本: mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.29 | +-----------+ 1 row in set (0.00 sec) 实验步骤概述 创建表使用varchar字段 添加记录,查看表空间该行数据 更新该记录,但是长度相同 查看表空间该行数据 查看undo日志内容 回滚更新操作,再次查看表空间 删除表重建 添加记录,查看表空间该行数据 更新该记录,但是长度变大 查看表空间该行数据 查看undo日志内容 回滚更新操作,再次查看表空间 删除表重建 添加记录,查看表空间该行数据 更新该记录,但是长度变小 查看表空间该行数据 查看undo日志内容 回滚更新操作,再次查看表空间 数据准备 create table test_undo( id int, name varchar(10), primary key (id) )engine=innodb charset=utf8 row_format=dynamic; 使用utf8编码,使用默认的dynamic行格式。 insert into test_undo values (1,'aaa'),(2,'xxx') 插入两条数据,这里为了区分先删除再插入和原地更新,需要插入两条数据,然后我们操作第一条。 mysql> select TABLE_ID from information_schema....

July 22, 2022 · 5 min · Theme PaperMod

InnoDB索引

InnoDB索引 单机InnoDB InnoDB磁盘相关介绍 InnoDB-架构图 InnoDB存储引擎是基于磁盘存储的,并将其中的记录按页的方式管理。InnoDB在内存中创建一个缓冲池,当进行读取页操作时,首先将从磁盘读到的页存放在缓冲池中。下一次再读到相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,则在缓冲池中直接读取该页即可;否则,读取磁盘上的该页。当进行修改操作时,首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。页从缓冲池中被刷回磁盘的操作并不是在每次页发生更新时触发,而是通过checkpoint的机制触发刷回。 InnoDB表空间结构 InnoDB-逻辑存储结构 在innodb存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。在innodb存储引擎中,每张表都有个主键,如果在创建表时没有显示地定义主键,则innodb存储引擎会使用表中非空的唯一索引或自动创建一个6字节大小的指针。 innodb存储引擎中,所有数据都被逻辑地存放在表空间(tablespace)中,表空间由段(segment)、区(extent)、页(page)组成。 表空间只存放数据、索引和插入缓冲bitmap页,其他比如回滚信息、插入缓冲索引页等存放在共享表空间中。 段包括数据段、索引段、回滚段等。数据段即为B+树的叶子节点,索引段即为B+树的非叶子节点。 区是由连续页组成的空间,每个区的大小都为1MB。默认情况下,innodb存储引擎页的大小为16KB,即一个区有64个连续的页。 页是innodb磁盘管理的最小单位,常见有数据页、undo页等。 ibd文件分析 表文件结构 FSP_HDR/XDES 在idb文件的第一个页的类型为FSP_HDR,该page主要用于存储表空间的一些关键信息。 FSP_HDR结构 与其他所有页一样,FSP_HDR也是页,因此同样存在页头FIL_HEADER以及页尾FIL_TRAILER FIL Header/Trailer 页头、页尾结构 名称(fil0types.h) 含义 FIL_PAGE_SPACE_OR_CHKSUM 表示页的校验和 FIL_PAGE_OFFSET 页号 FIL_PAGE_PREV 逻辑上前一个页.在page0中,该字段为FIL_PAGE_SRV_VERSION FIL_PAGE_NEXT 逻辑上后一个页.在page0中,该字段为FIL_PAGE_SPACE_VERSION FIL_PAGE_LSN 该页最后被修改时的LSN FIL_PAGE_TYPE 页类型 FIL_PAGE_FILE_FLUSH_LSN 仅在系统表空间的第1页定义,代表文件至少被刷新到该LSN值 FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID 页所在表空间id FIL_PAGE_END_LSN_OLD_CHKSUM 前4个字节表示检验和,后4个字节应当与FIL_PAGE_LSN后4个字节相同 FSP Header FSP Header结构 名称(fsp0fsp.h) 含义 FSP_SPACE_ID 表空间id FSP_SIZE 当前表空间拥有的页面数 FSP_FREE_LIMIT(?) 尚未被初始化的最小页号,大于等于该页号的区对应的XDES Entry结构都没有加入到FREE链表中.在小于64个页的表空间中,该值为64 FSP_SPACE_FLAGS 存储标志 FSP_FRAG_N_USED FSP_FREE_FRAG链表中已使用的页面数量 FSP_FREE 空闲extents的基节点,该链上的extent所有page均未被使用,可以整个extent分配给segment,或使用部分碎片页并移动到FSP_FREE_FRAG链 FSP_FREE_FRAG FREE_FRAG链表的基节点,该链上的extent存在空闲页,通常这样的extent中的page,会分配到不同的segment,挂在segment的FSEG_FRAG_ARR上。比如每个带了FSP_HDR页或XDES页的extent就是FSP_FREE_FRAG的 FSP_FULL_FRAG FULL_FRAG链表的基节点,该链上的extent没有空闲page,当该extent上有page被释放后,可以移回FSP_FREE_FRAG链 FSP_SEG_ID 当前表空间中下一个未使用的SegementID,即下次待分配的SegmentID FSP_SEG_INODES_FULL SEG_INODES_FULL链表的基节点,该链上的INODE页已经没有空闲INODE Entry了,一个INODE页最多存放85个INODE Entry。在独立表空间中,当为一个表创建超过42个索引,才会出现FULL的INODE页 FSP_SEG_INODES_FREE SEG_INODES_FREE链表的基节点,该链上的INODE页存在空闲的INODE Entry XDES Entry XDES 指一个page...

June 5, 2022 · 4 min · Theme PaperMod

MySql引擎与事务

mysql引擎 查询支持的引擎 show engines; 查询某个表使用的引擎 show table status like 'article' ; ...

May 1, 2020 · 1 min · Theme PaperMod

MySql索引

MySql索引 使用索引的优缺点 优点: 大大加快了数据的检索时间. 将随机IO变为顺序IO 缺点: 创建索引和维护索引耗费时间,对数据的增删改同时也需要动态维护索引 索引需要物理存储空间 ...

April 29, 2020 · 1 min · Theme PaperMod

阿里云服务器mysql无法连接

阿里云服务器mysql无法连接 问题:在阿里云服务器上部署mysql服务后,想通过datagrip连接数据库。出现无法连接的问题。 解决: 检查阿里云mysql启动情况,已经启动,没有问题 使用telnet测试3306端口是否正常,发现无法连接 查看3306端口的连接情况 ...

March 17, 2020 · 1 min · Theme PaperMod