引言
早期的MySQL仅支持copy模式的DDL。在MySQL 5.5中,引入了inplace算法,可以将部分DDL操作交给引擎层进行处理,但是在进行DDL期间,依旧会阻塞DML操作。在5.6中,部分inplace DDL操作可以采用online算法。该算法允许用户在进行DDL操作过程中,并行的执行写入操作。有关上述三种DDL的差异及主要特点,可以参照文末的扩展阅读部分。 以add column操作为例,下图给出了online算法进行DDL的主要流程。一. row log 格式
根据不同的DML操作,row log分为三种类型,分别是ROW_T_INSERT、ROW_T_UPDATE和ROW_T_DELETE,分别对应insert,update和delete操作。一条row log记录通常由如下四部分组成。 Part 1: opt type | 1 byte: 记录row log的操作类型。也即ROW_T_INSERT、ROW_T_UPDATE、ROW_T_DELETE Part 2: old pk(optional) | 1 byte: extral size,也即old pk对应的rec的extral部分长度。 | extral size byte: 存储old pk对应rec的extral数据 | 不定长: 存储old pk对应rec的 field 部分数据。 Part 3: record data(optional) | 1-2 bytes:extral size 记录当前rec对应的extral数据长度 | extral size: 待写入rec的extral部分数据 | 不定长:待写入rec的field部分数据。 part 4: virtual column data(optional) | 2 bytes: 虚拟列部分总的数据长度 | 不定长:虚拟列对应的field数据。 其中,不同类型的DML操作,对应所记录的row log内容也有一定差别。具体表现为:- insert 类型
- update类型
- delete 类型
二. row log生成
在MySQL内部,与row log生成相关的函数可以分为主键索引和二级索引两大类。1. 表相关的DML操作。
对表数据的操作可以分为INSERT、UPDATE和DELETE三类,分别由 row_log_table_insert() row_log_table_update(),row_log_table_delete()记录。其中由于insert 与update对应的row log格式相似,因此在内部统一调用函数row_log_table_low()进行记录。2. 二级索引相关DML操作。
在innodb引擎中,对二级索引的update操作是通过delete+insert 方式进行的。因此对于二级索引,row log只有insert和update两种类型。统一由函数row_log_online_op()进行记录。三. row log 应用
row log的应用发生在online DDL的commit阶段。在该阶段,会对所有在DDL执行阶段记录的row log进行回放。回放函数为row_log_table_apply_op()。该函数根据row log的操作类型,对row log进行解析处理。row_log_table_apply_op()函数功能可以抽象概括如下: const mrec_t *row_log_table_apply_op( { … / Load row log type. / switch (row_log_type) { default: ut_ad(0); *error = DB_CORRUPTION; return (NULL); case ROW_T_INSERT: row_log_table_apply_insert(); break; case ROW_T_DELETE: *error = row_log_table_apply_delete(); break; case ROW_T_UPDATE: *error = row_log_table_apply_update(); break; } …. return ; }四. row log中的record data
1. temp格式
读者在阅读row log代码时,会注意到,在这一过程中会出现temp格式的record。这是官方为了节约row log大小而引入的格式。以compact格式为例,其格式如下所示:2. instant add column对row log格式的修改
MySQL在8.0版本引入了instant add column功能,该功能可以通过仅修改元数据的方式,实现加列操作。该功能是通过对列格式进行修改而实现的。以compact格式为例,修改后的列格式为:结语
本文对row log格式以及相关的生成和应用函数做了简单介绍。希望能够帮助读者更好的了解row log的作用原理。受限于时间和笔者能力水平,文章内容可能存在错误,请大家批评指正。注:本文转载自《数据库内核月报 - 2022 / 03》