Innodb drop index 流程小記

2021-09-23 19:00:40 字數 1660 閱讀 8987

最近在做乙個小特性,讓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,拋棄舊的內容

小程式支付流程

向後台傳送預生成訂單請求,傳遞商品資訊 id,數量 使用者資訊 id,token,收貨位址 後台返回timestamp 時間戳 noncestr 隨機字串,不長於32位 package 資料報 signtype 簽名型別,預設為md5,支援hmac sha256和md5 paysign 簽名 等字段...

小程式登入流程

之前一直對小程式登入流程比較模糊,今天看了個文章 感覺清晰了很多,總結一下。首先,我們不應該直接獲取使用者資訊,目前好像也不能直接獲取使用者資訊。原則是 當我們需要獲取使用者資訊的時候才發起授權。1.wx.getuserinfo 這個函式 是需要授權才能獲取使用者資訊 2.那麼我們只能用button...

git 小札 流程總覽

集中式版本管理 subversion 和分布式版本管理 git 的差異 集中式 分布式 關於git的三種狀態 三種狀態 基本的git工作流程 git status檢查當前檔案狀態 git add開始跟蹤新檔案,或者把已跟蹤的檔案放到暫存區,還能用於合併時把有衝突的檔案標記為已解決狀態等 git di...