最近一個(gè)日常實(shí)例在做DDL過(guò)程中,直接把數(shù)據(jù)庫(kù)給干趴下了,問題還是比較嚴(yán)重的,于是趕緊排查問題,擼了下crash堆棧和alert日志,發(fā)現(xiàn)是在去除唯一約束的場(chǎng)景下,MyRocks存在一個(gè)嚴(yán)重的bug,于是緊急向官方提了一個(gè)bug。其實(shí)問題比較隱蔽,因?yàn)橹苯右粭lDDL語(yǔ)句,數(shù)據(jù)庫(kù)是不會(huì)掛了,而是在特定情況下,并且對(duì)同一個(gè)索引操作多次才會(huì)發(fā)生,因此排查問題也費(fèi)了一些時(shí)間,具體bug排查和復(fù)現(xiàn)過(guò)程不在此展開,有興趣的童鞋可以直接看bug鏈接:https://github.com/facebook/mysql-5.6/issues/602。借著排查問題的機(jī)會(huì),我梳理了MyRocks DDL的工作流程,下文主要包括3方面內(nèi)容:MyRocks數(shù)據(jù)字典,DDL操作除了修改數(shù)據(jù)本身,很重要的一個(gè)工作是維護(hù)數(shù)據(jù)字典,第二部分是MyRocks DDL的流程,主要圍繞增加/刪除索引的場(chǎng)景展開,最后一部分是分析DDL異常處理邏輯。
數(shù)據(jù)字典
所謂數(shù)據(jù)字典,就是存儲(chǔ)引擎元數(shù)據(jù)的地方。數(shù)據(jù)字典可以從兩個(gè)維度來(lái)看,從用戶角度來(lái)看,數(shù)據(jù)字典就是information_schema表中的
RocksDB相關(guān)的表,主要包括ROCKSDB_DDL,ROCKSDB_INDEX_FILE_MAP等。而從RockDB內(nèi)部實(shí)現(xiàn)角度來(lái)看,所有元數(shù)據(jù)都以KV對(duì)的方式存儲(chǔ)在system column family中。我們看到的information_schema中表的信息,其實(shí)都是通過(guò)system column family中的元數(shù)據(jù)構(gòu)造出來(lái)的,同時(shí)在mysqld啟動(dòng)時(shí),也會(huì)構(gòu)造一份元數(shù)據(jù)存儲(chǔ)在內(nèi)存中,方便快速檢索查詢。下面我會(huì)列出RocksDB數(shù)據(jù)字典的幾種類型,并列出每種類型KV對(duì)的形式。
// Data dictionary types