MySQL · TokuDB · TokuDB数据文件大小计算
最后更新于:2022-04-01 10:40:01
想要查看TokuDB某个表占了多少磁盘空间,目前还没有太好的方法。
如果你使用’show table status’命令,得到的结果只会让你更迷茫:
~~~
Name: toku
Engine: TokuDB
Version: 10
Row_format: tokudb_zlib
Rows: 28874059
Avg_row_length: 30
Data_length: 868159449
Max_data_length: 9223372036854775807
Index_length: 2099497463
Data_free: 0
~~~
我们来看看test_toku表磁盘文件大小:
~~~
$du -b _test_toku*
124427776 _test_toku_A_B.tokudb --KEY(A,B)索引数据文件
215959552 _test_toku_B_C.tokudb --KEY(B,C)索引数据文件
149504000 _test_toku_main.tokudb --主数据文件
~~~
Data_length和Index_length都对不上,而且差的还不是一点,真头疼,总不能每次都要去服务器上du吧?其实,我们可以通过`information_schema.TokuDB_fractal_tree_info`得到:
~~~
mysql> select * from TokuDB_fractal_tree_info where table_name='test_toku'\G;
*************************** 1\. row ***************************
dictionary_name: ./test/test_toku_A_B
internal_file_name: _test_toku_A_B.tokudb
bt_num_blocks_allocated: 449
bt_num_blocks_in_use: 449
bt_size_allocated: 124416093
bt_size_in_use: 123563101
table_schema: test
table_name: toku
table_dictionary_name: key-test_toku_A_B
*************************** 2\. row ***************************
dictionary_name: ./test/test_toku_B_C
internal_file_name: ./_test_toku_B_C.tokudb
bt_num_blocks_allocated: 612
bt_num_blocks_in_use: 612
bt_size_allocated: 215945353
bt_size_in_use: 214784137
table_schema: test
table_name: toku
table_dictionary_name: key-test_toku_B_C
*************************** 3\. row ***************************
dictionary_name: ./test/test_toku-main
internal_file_name: ./_test_toku_main.tokudb
bt_num_blocks_allocated: 486
bt_num_blocks_in_use: 486
bt_size_allocated: 149491745
bt_size_in_use: 148580897
table_schema: test
table_name: toku
table_dictionary_name: main
~~~
`bt_size_allocated`字段是TokuDB内部维护当前数据文件最后分配的offset,跟数据文件磁盘大小基本一致。
再回到刚才的问题:`show table status`里Data_length和Index_length为什么跟实际大小出入这么大呢?
在`ha_tokudb::info()`里:
~~~
stats.data_file_length = dict_stats.bt_dsize;
~~~
bt_dsize的值来自toku_ft_stat64:
~~~
bt_dsize = ft->in_memory_stats.numbytes;
~~~
`in_memory_stats.numbytes`是TokuDB在内存中维护的一个变量,用于记录变更数据的增量大小,每次checkpoint的时候持久化到数据文件(包括索引文件)的header里,所以是个出入比较大的参考变量(无压缩),已不能通过此变量来反应表文件的真实大小。
这么不爽的地方,我们(RDS MySQL)已准备好patch把它修掉,让`show table status`可以拿到TokuDB表文件的真实大小。