Innodb drop index 流程小记

最近在做一个小特性,让InnoDB支持repair table来重建corrupted的索引,本文描述的是实现过程中遇到的一个小问题,主要和innodb drop index相关的一些随笔记录。

 

现象:针对损坏的page,加上一个标记位为corrupted,然而在删除索引并重建后,该标记未被清除掉,但是我在读取page时已经加了清理标记的操作(buf_page_init_low)。

 

drop index流程:

a. ha_innobase::prepare_inplace_alter_table

设置index->to_be_dropped = 1

 

b. ha_innobase::inplace_alter_table

不干活

 

c. ha_innobase::commit_inplace_alter_table

 

commit_try_norebuild

//row_merge_rename_index_to_drop : 将需要drop的index 在数据词典里rename成TEMP_INDEX_PREFIX前缀+index名

 

commit_cache_norebuild

//index->page = FIL_NULL

//row_merge_drop_indexes_dict:从数据词典SYS_INDEXES,SYS_FIELDS,中删除索引项相关记录。

/////row_merge_drop_indexes_dict—>que_eval_sql—>que_run_threads—>que_run_threads_low—>row_upd_step—>row_upd—>row_upd_clust_step—>dict_drop_index_tree   从系统表中删除记录,会触发释放索引树

/////////////btr_free_but_not_root—>fseg_free_step—>fseg_free_extent—>btr_search_drop_page_hash_when_freed  删除所有的AHI项

//dict_index_remove_from_cache:从cache中移除索引

 

alter_stats_norebuild

//dict_stats_drop_index: 从系统表mysql/innodb_index_stats中移除索引的物化的统计信息

 

如何处理二级索引在buffer pool中的page:

从代码逻辑来看,对drop掉的二级索引并没有做标脏驱逐处理,还是留在buffer pool中,也没有从Page hash中删除,仅仅释放自适应哈希记录。

 

如何重用:

由于被drop的索引段已经被设置为free,因此可以重用Page。然而buffer pool中的老索引的page可能并没有被驱逐掉,还存在于page hash中,这些block可以被重用,相关堆栈:

row_merge_build_indexes—>row_merge_insert_index_tuples—>btr_cur_pessimistic_insert—>btr_page_split_and_insert—>btr_page_alloc—>btr_page_alloc_low—>fseg_alloc_free_page_general—>fseg_alloc_free_page_low

—>fsp_page_create

     —>buf_page_create

     —>fsp_init_file_page   //重新初始化page,抛弃旧的内容

时间: 2024-11-03 20:48:20

Innodb drop index 流程小记的相关文章

ORA-02429: cannot drop index used for enforcement of unique /primary key

相信不少人遇到过ORA-02429: cannot drop index used for enforcement of unique /primary key 这个错误,对应的中文提示"ORA-02429: 无法删除用于强制唯一/主键的索引",其实从错误提示信息已经很明显了.下面还是用一个简单的例子述说一下该错误的来龙去脉. ORA-02429错误的原因是因为用户试图删除一个用于强制唯一/主键的索引,解决方法也很简单,删除对应的约束就会自动删除该索引. [oracle@DB-Serv

[MySQL学习] Innodb崩溃恢复流程

简要记录跟踪代码,很多代码流程没有细细的跟进去,只是了解了个大概,杂七杂八,还有太多不了解的地方. 不过,一知半解总比一无所知要好点-sign- //////////////////////////////////////////// 一.innobase_init 1.初始化存储引擎接口函数.检查指定的page大小(innodb_page_size,Percona版本支持16k以下的page size定义).innodb_log_block_size. 2.检查是否通过记录在innodb层的r

[MySQL 源码] Innodb Pessimistic Insert流程

简单跟了下插入导致索引分裂的流程 ////////////////////////////////// 入口函数:row_ins_index_entry 实际上悲观插入和乐观插入是根据row_ins_index_entry_low的第一个参数来判断的 调用两次row_ins_index_entry_low 第一次参数为BTR_MODIFY_LEAF,表示只修改叶子节点,如果失败了 第二次参数为BTR_MODIFY_TREE,表示需要修改B-TREE,这时候会选择调用函数: btr_cur_pes

[MySQL 学习] Innodb Optimistic Update流程

更新一条聚集索引记录,接口函数是btr_cur_optimistic_update,这里的更新不涉及到标记删除/插入(二级索引更新或更新主键值,row_upd->row_upd_clust_rec_by_insert->btr_cur_del_mark_set_clust_rec->btr_rec_set_deleted_flag) a.首先判断记录更新是否改变了大小或者需要外部存储,调用函数row_upd_changes_field_size_or_external b.如果a返回的是

[MySQL 学习] Innodb Optimistic Insert流程

通常情况下,插入一条数据的接口函数为btr_cur_optimistic_insert,这时候不需要进行索引树分裂,先来看看这里怎么处理压缩表数据吧 btr_cur_optimistic_insert a. 计算该Page上还能写入的最大空闲空间大小 max_size = page_get_max_insert_size_after_reorganize(page, 1); 以及这条逻辑记录(dtuple_struct)转换成物理记录的大小 rec_size = rec_get_converte

MySQL 4.1.0 中文参考手册 --- 6.5 数据定义: CREATE、DROP、ALTER

mysql|参考|参考手册|数据|中文 MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译 MySQL Reference Manual for version 4.1.0-alpha. 6.5 数据定义: CREATE.DROP.ALTER6.5.1 CREATE DATABASE 句法 CREATE DATABASE [IF NOT EXISTS] db_name CREATE DATABASE 以给定名字创建一个数据库.允许的数据库名规则在章节 6.1.2 数据库.表.索引.列

MYSQL InnoDB表锁

InnoDB锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题. 2.并发事务处理带来的问题 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多的用户.但并发事务处理也会带来一些问题,主要包括以下几种情况.      更新丢失(ost Update):

index merge的补充说明

1. 为什么需要考虑Intersection 考虑如下查询: SELECT COUNT(*) FROM t1 WHERE key1=1 AND key2=1; 优化器可以考虑使用索引key1或者key2进行REF/Range访问,如果使用key1,那么key2=1则作为过滤条件.另外,优化器还会考虑使用Intersection,即同时使用索引key1和key2.这样做可能的好处是: (a) 如果两次索引扫描后做交集,如果最后ROWID很少,则回表次数大大减少 (b) 如果扫描这两个索引能是覆盖扫

mysql中key 、primary key 、unique key 与index区别_Mysql

mysql中索引是非常重要的知识点,相比其他的知识点,索引更难掌握,并且mysql中的索引种类也有很多,比如primary key .unique key 与index等等,本文章向大家介绍mysql中key .primary key .unique key 与index区别.  一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varch