此工具用来dump一个Fractal-Tree结构的数据文件。

这样我们就可以很直观的知道我写入的数据在磁盘上是个什么样子(disk layout)。

废话少说,一切尽在“栗子”中。

创建表t1:

写入数据并刷到磁盘:

  1. mysql> INSERT INTO t1 VALUES(2,2);
  2. mysql> INSERT INTO t1 VALUES(3,3);
  3. mysql> UPDATE t1 SET b=4 WHERE a=3;
  4. mysql> FLUSH TABLES t1;

可以看到,在数据文件里每一行数据都是一个对,再维护一个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里又是些什么鬼:

  1. ./tdb_logprint < data/log000000000002.tokulog27
  2. xbegin 'b': lsn=64 xid=144,2 parentxid=144,0 crc=97572838 len=53
  3. enq_insert 'I': lsn=65 filenum=3 xid=144,2 key={len=15 data="./test/t1-main\000"} value={len=31 data="./_test_t1_main_90_2_1b.tokudb\000"} crc=d259724f len=95
  4. fcreate 'F': lsn=66 xid=144,2 filenum=7 iname={len=30 data="./_test_t1_main_90_2_1b.tokudb"} mode=0666 treeflags=0 nodesize=4194304 basementnodesize=65536 compression_method=11 crc=3755db8b len=95
  5. xcommit 'C': lsn=67 xid=144,2 crc=ffad0139 len=37
  6. xcommit 'C': lsn=69 xid=144,0 crc=ffa0c139 len=37
  7. fclose 'e': lsn=70 iname={len=32 data="./_test_t1_status_90_1_1b.tokudb"} filenum=5 crc=73c0dbf1 len=61
  8. fopen 'O': lsn=72 iname={len=32 data="./_test_t1_status_90_1_1b.tokudb"} filenum=9 treeflags=0 crc=c8de90f1 len=65
  9. fopen 'O': lsn=73 iname={len=30 data="./_test_t1_main_90_2_1b.tokudb"} filenum=11 treeflags=0 crc=b38239c5 len=63
  10. xbegin 'b': lsn=74 xid=146,0 parentxid=0,0 crc=9a083238 len=53
  11. enq_insert 'I': lsn=75 filenum=11 xid=146,0 key={len=5 data="\000\001\000\000\000"} value={len=5 data="\375\001\000\000\000"} crc=658a7b0b len=59
  12. xcommit 'C': lsn=76 xid=146,0 crc=ff98be39 len=37
  13. xbegin 'b': lsn=77 xid=148,0 parentxid=0,0 crc=8602ef38 len=53
  14. enq_insert 'I': lsn=78 filenum=11 xid=148,0 key={len=5 data="\000\002\000\000\000"} value={len=5 data="\375\002\000\000\000"} crc=59dad00b len=59
  15. xcommit 'C': lsn=79 xid=148,0 crc=ff9f3339 len=37
  16. xbegin 'b': lsn=80 xid=150,0 parentxid=0,0 crc=821b8438 len=53
  17. enq_insert 'I': lsn=81 filenum=11 xid=150,0 key={len=5 data="\000\003\000\000\000"} value={len=5 data="\375\003\000\000\000"} crc=926d5d14 len=59
  18. xcommit 'C': lsn=82 xid=150,0 crc=ff93b439 len=37
  19. enq_insert_multiple 'm': lsn=84 src_filenum=11 dest_filenums={num=1 filenums="0xb"} xid=152,0 src_key={len=5 data="\000\003\000\000\000"} src_val={len=5 data="\375\004\000\000\000"} crc=ecb1c6f0 len=67
  20. xcommit 'C': lsn=85 xid=152,0 crc=ff962939 len=37
  21. fclose 'e': lsn=87 iname={len=32 data="./_test_t1_status_90_1_1b.tokudb"} filenum=9 crc=c43070f7 len=61
  22. begin_checkpoint 'x': lsn=88 timestamp=1455623796540257 last_xid=153 crc=470dd9ea len=37
  23. fassociate 'f': lsn=89 filenum=0 treeflags=0 iname={len=15 data="tokudb.rollback"} unlink_on_close=0 crc=8606e9b1 len=49
  24. fassociate 'f': lsn=90 filenum=1 treeflags=4 iname={len=18 data="tokudb.environment"} unlink_on_close=0 crc=92dc4c1c len=52
  25. fassociate 'f': lsn=91 filenum=3 treeflags=4 iname={len=16 data="tokudb.directory"} unlink_on_close=0 crc=86323b7e len=50
  26. end_checkpoint 'X': lsn=92 lsn_begin_checkpoint=88 timestamp=1455623796541659 num_fassociate_entries=3 num_xstillopen_entries=0 crc=5cde4ff2 len=45

当我们执行CREATE TABLE的时候,FT执行指令是:

创建表的过程是不是很清晰了?

接着看写数据,FT执行的指令:

  1. 1) 打开表文件
  2. 2) 事务开始
  3. 3) 写入记录
  4. 4) 事务提交
  5. ...
  6. ...

在redo-log的最后我们还看到checkpoint信息,包括checkpoint时的lsn以及时间等。

通过 tdb_logprint,我们可以很轻松的知道TokuDB底层到底在干什么,如果你想了解TokuDB底层行为,请开启你的 之旅吧。

静静你可以静静的学习TokuDB了 :D