FIL_PAGE_TYPE_ZBLOB:压缩的外部存储页,如果存在多个blob page,则表示第一个
FIL_PAGE_TYPE_ZBLOB2:如果存在多个压缩的blob page,则表示blob链随后的page;
结构如下图所示:
而在记录内只存储了20个字节的指针以指向外部存储页,指针描述如下:
MacrobytesDescBTR_EXTERN_SPACE_ID 4 外部存储页所在的space id
BTR_EXTERN_PAGE_NO 4 第一个外部页的Page no
BTR_EXTERN_OFFSET 4 对于压缩页,为12,该偏移量存储了指向下一个外部页的的page no;对于非压缩页,值为38,指向blob header,如上图所示
外部页的写入参阅函数 btr_store_big_rec_extern_fields
MySQL5.7新数据页:加密页及R-TREE页MySQL 5.7版本引入了新的数据页以支持表空间加密及对空间数据类型建立R-TREE索引。本文对这种数据页不做深入讨论,仅仅简单描述下,后面我们会单独开两篇文章分别进行介绍。
数据加密页
从MySQL5.7.11开始InnoDB支持对单表进行加密,因此引入了新的Page类型来支持这一特性,主要加了三种Page类型:
FIL_PAGE_ENCRYPTED:加密的普通数据页
FIL_PAGE_COMPRESSED_AND_ENCRYPTED:数据页为压缩页(transparent page compression) 并且被加密(先压缩,再加密)
FIL_PAGE_ENCRYPTED_RTREE:GIS索引R-TREE的数据页并被加密
对于加密页,除了数据部分被替换成加密数据外,其他部分和大多数表都是一样的结构。
加解密的逻辑和Transparent Compression类似,在写入文件前加密(os_file_encrypt_page --> Encryption::encrypt),在读出文件时解密数据(os_file_io_complete --> Encryption::decrypt)
秘钥信息存储在ibd文件的第一个page中(fsp_header_init --> fsp_header_fill_encryption_info),当执行SQL ALTER INSTANCE ROTATE INNODB MASTER KEY时,会更新每个ibd存储的秘钥信息(fsp_header_rotate_encryption)
默认安装时,一个新的插件keyring_file被安装并且默认Active,在安装目录下,会产生一个新的文件来存储秘钥,位置在$MYSQL_INSTALL_DIR/keyring/keyring,你可以通过参数来指定秘钥的存放位置和文件命名。 当你安装多实例时,��要为不同的实例指定keyring文件。
开启表加密的语法很简单,在CREATE TABLE或ALTER TABLE时指定选项ENCRYPTION=‘Y’来开启,或者ENCRYPTION=‘N’来关闭加密。
关于InnoDB表空间加密特性,参阅该commit及官方文档。
R-TREE索引页
在MySQL 5.7中引入了新的索引类型R-TREE来描述空间数据类型的多维数据结构,这类索引的数据页类型为FIL_PAGE_RTREE。
R-TREE的相关设计参阅官方WL#6968, WL#6609, WL#6745
临时表空间ibtmpMySQL5.7引入了临时表专用的表空间,默认命名为ibtmp1,创建的非压缩临时表都存储在该表空间中。系统重启后,ibtmp1会被重新初始化到默认12MB。你可以通过设置参数来修改ibtmp1的默认初始大小,以及是否允许autoExtent。默认值为 “ibtmp1:12M:autoExtent”。
除了用户定义的非压缩临时表外,第1~32个临时表专用的回滚段也存放在该文件中(0号回滚段总是存放在ibdata中)(trx_sys_create_noredo_rsegs),
日志文件ib_logfile关于日志文件的格式,网上已经有很多的讨论,在之前的系列文章中我也有专门介绍过,本小节主要介绍下MySQL5.7新的修改。
首先是checksum算法的改变,当前版本的MySQL5.7可以通过参数innodb_log_checksums来开启或关闭redo checksum,但目前唯一支持的checksum算法是CRC32。而在之前老版本中只支持效率较低的InnoDB本身的checksum算法。