TokuDB的幾個黑科技工具

2021-09-23 23:25:30 字數 4635 閱讀 3562

剛過完年,美女程式設計師靜靜想學習下tokudb相關技術,從何處入手呢?tokudb的技術資料可是出了名的少!

本篇就給大家介紹下兩個」黑科技「工具,來幫助我們更深入的了解tokudb。

此工具用來dump乙個fractal-tree結構的資料檔案。

這樣我們就可以很直觀的知道我寫入的資料在磁碟上是個什麼樣子(disk layout)。

廢話少說,一切盡在「栗子」中。

建立表t1:

create table `t1` (

`a` int(11) not null,

`b` int(11) default null,

primary key (`a`)

) engine=tokudb

寫入資料並刷到磁碟:

mysql> insert into t1 values(1,1);

mysql> insert into t1 values(2,2);

mysql> insert into t1 values(3,3);

mysql> update t1 set b=4 where a=3;

mysql> flush tables t1;

使用tokuftdump進行資料dump:

./bin/tokuftdump data/_test_t1_main_90_2_1b.tokudb

... ci: xid=0000000000000000 val=}

ci: xid=0000000000000000 val=}

ci: xid=0000000000000000 val= pi: xid=000000009a93a265 val=}

可以看到,在資料檔案裡每一行資料都是乙個對,再維護乙個mvcc結構就可以滿足acid特性了。

最後一條記錄就是執行完update後mvcc:有2個val存在,xid(transaction id)不同,需要注意的是tokuftdump會對資料進行重組織展現,並非磁碟上的原生結構。

如果你想深入了解tokudb的fractal-tree結構,這是個必不可少的工具,它不僅可以dump資料,還可以dump fractal-tree的全部資訊,讓底層儲存結構「躍然屏上」。

此工具用來dump tokudb的redo-log,讓我們了解tokudb redo-log是如何組織的。

接下來我們看下執行完剛才的sql後,窺探下redo-log裡又是些什麼鬼:

./tdb_logprint < data/log000000000002.tokulog27

xbegin 'b': lsn=64 xid=144,2 parentxid=144,0 crc=97572838 len=53

enq_insert 'i': lsn=65 filenum=3 xid=144,2 key= value= crc=d259724f len=95

fcreate 'f': lsn=66 xid=144,2 filenum=7 iname= mode=0666 treeflags=0 nodesize=4194304 basementnodesize=65536 compression_method=11 crc=3755db8b len=95

xcommit 'c': lsn=67 xid=144,2 crc=ffad0139 len=37

change_fdescriptor 'd': lsn=68 filenum=7 xid=144,0 old_descriptor= new_descriptor= update_cmp_descriptor=true crc=acef9cdb len=68

xcommit 'c': lsn=69 xid=144,0 crc=ffa0c139 len=37

fclose 'e': lsn=70 iname= filenum=5 crc=73c0dbf1 len=61

fclose 'e': lsn=71 iname= filenum=7 crc=060f6b9f len=59

fopen 'o': lsn=72 iname= filenum=9 treeflags=0 crc=c8de90f1 len=65

fopen 'o': lsn=73 iname= filenum=11 treeflags=0 crc=b38239c5 len=63

xbegin 'b': lsn=74 xid=146,0 parentxid=0,0 crc=9a083238 len=53

enq_insert 'i': lsn=75 filenum=11 xid=146,0 key= value= crc=658a7b0b len=59

xcommit 'c': lsn=76 xid=146,0 crc=ff98be39 len=37

xbegin 'b': lsn=77 xid=148,0 parentxid=0,0 crc=8602ef38 len=53

enq_insert 'i': lsn=78 filenum=11 xid=148,0 key= value= crc=59dad00b len=59

xcommit 'c': lsn=79 xid=148,0 crc=ff9f3339 len=37

xbegin 'b': lsn=80 xid=150,0 parentxid=0,0 crc=821b8438 len=53

enq_insert 'i': lsn=81 filenum=11 xid=150,0 key= value= crc=926d5d14 len=59

xcommit 'c': lsn=82 xid=150,0 crc=ff93b439 len=37

xbegin 'b': lsn=83 xid=152,0 parentxid=0,0 crc=8e1ca138 len=53

enq_insert_multiple 'm': lsn=84 src_filenum=11 dest_filenums= xid=152,0 src_key= src_val= crc=ecb1c6f0 len=67

xcommit 'c': lsn=85 xid=152,0 crc=ff962939 len=37

fclose 'e': lsn=86 iname= filenum=11 crc=8709a890 len=59

fclose 'e': lsn=87 iname= filenum=9 crc=c43070f7 len=61

begin_checkpoint 'x': lsn=88 timestamp=1455623796540257 last_xid=153 crc=470dd9ea len=37

fassociate 'f': lsn=89 filenum=0 treeflags=0 iname= unlink_on_close=0 crc=8606e9b1 len=49

fassociate 'f': lsn=90 filenum=1 treeflags=4 iname= unlink_on_close=0 crc=92dc4c1c len=52

fassociate 'f': lsn=91 filenum=3 treeflags=4 iname= unlink_on_close=0 crc=86323b7e len=50

end_checkpoint 'x': lsn=92 lsn_begin_checkpoint=88 timestamp=1455623796541659 num_fassociate_entries=3 num_xstillopen_entries=0 crc=5cde4ff2 len=45

wow,redo-log其實就是ft(tokudb底層儲存引擎縮寫,ft-index)所有操作指令的回放。

當我們執行create table的時候,ft執行指令是:

1) 開啟事務

2) 把建立的表資訊記錄到元資料庫 tokudb.directory

3) 建立表檔案

4) 提交事務

建立表的過程是不是很清晰了?

接著看寫資料,ft執行的指令:

1) 開啟表檔案

2) 事務開始

3) 寫入記錄

4) 事務提交

...5) 關閉表檔案

...

在redo-log的最後我們還看到checkpoint資訊,包括checkpoint時的lsn以及時間等。

如果你對tokudb某個細節不清楚,請執行下你的sql,結合這兩個工具,再加上原始碼,基本可以做到胸中有數了。

靜靜你可以靜靜的學習tokudb了 :d

電氣探測的黑科技工具 艾睿光電紅外熱像儀

黑科技紅外熱成像儀已經成為一種趨勢啦,裝置故障 設施洩漏這樣問題真的是太磨人了。你也一定跟我一樣用過很多儀器和方法,但還是依然解決不了這問題。在這裡和大家分享乙個裝置探測的神器!艾睿光電的紅外熱像儀。買紅外熱像儀型號很多,我們都知道在選擇探測儀器時,要考慮很多的因素,其中三項最為重要 靈敏度 響應速...

幾個css黑科技

這裡的黑科技其實就是一些css中不怎麼為人所知但在解決某些問題的時候很溜的屬性。box 斜線前面的影響的是水平方向,斜線後面影響的是垂直方向,各個數字就分別代表四個不一樣的方向。input調節該屬性值的大小你就可以看到outline的距離變化了。ol li nth child n 7 nth chi...

最近發現的C 的幾個「黑科技」

先說乙個小發現,在delete 的時候,是按照與構造順序相反的順序來析構的!原來的構造順序指的是,new 的時候,是按照下標順序構造的 include using namespace std class log log private int id int main 上面 的輸出結果為 destru...