数据库内核月报 - 2015 / 09-MySQL · TokuDB · 文件目录谈

TokuDB的数据库文件组织方式比较随意,给我们一种“乱”的假象,今天就来漫谈下TokuDB数据库文件。

一个“新生”的TokuDB数据库,基础文件是这样的:

tokudb.directory --表/索引文件信息
tokudb.environment --TokuDB版本号信息
tokudb.rollback --undo记录
log000000000001.tokulog27 --redo记录
__tokudb_lock_dont_delete_me_* --文件锁,保证同一个datadir只能被一个TokuDB进程使用

在test数据库下面新建个表t1,并写几条数据:

CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`a`),
KEY `bc` (`b`,`c`)
) ENGINE=TokuDB

就会发现目录下多出3个文件,表t1:

file1: _test_t1_key_bc_90_3_1b.tokudb --索引(bc)文件
file2: _test_t1_main_90_2_1b.tokudb --主文件
file3: _test_t1_status_90_1_1b.tokudb --表元数据文件

可以发现每个表最少2个文件,命名规则为:

_database_table_main*.tokudb
_database_table_status*.tokudb

索引是一个单独的.tokudb文件。

好了,下面是问题时间。

问题1: TokuDB如何知道哪些文件属于表t1

现在来dump下tokudb.directory:

{key={len=17 data="./test/t1-key-bc\000"} xid=0000000000000003 val={len=33 data="./_test_t1_key_bc_90_3_1b.tokudb\000"}}
{key={len=15 data="./test/t1-main\000"} xid=0000000000000002 val={len=31 data="./_test_t1_main_90_2_1b.tokudb\000"}}
{key={len=17 data="./test/t1-status\000"} xid=0000000000000001 val={len=33 data="./_test_t1_status_90_1_1b.tokudb\000"}}

TokuDB在启动的时候,会读取tokudb.directory,根据key信息组织出表t1的相关文件,并写到information_schema.tokudb_file_map表。

问题2: TokuDB如何知道表t1有哪些索引以及列信息

这些信息全部存在_test_t1_status_90_1_1b.tokudb文件里。

问题3: TokuDB的分区表文件是怎样的

实验走起来,首先创建一个按时间的分区表t2:

CREATE TABLE `t2` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `date` datetime NOT NULL,
  KEY `id` (`id`),
  KEY `c1` (`c1`)
) ENGINE=TokuDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE ( TO_DAYS(date))
(PARTITION p201508 VALUES LESS THAN (736176) ENGINE = TokuDB,
 PARTITION p201509 VALUES LESS THAN (736207) ENGINE = TokuDB,
 PARTITION rxMORES VALUES LESS THAN MAXVALUE ENGINE = TokuDB) */

现在分区表的文件是什么样的呢?

data/_test_t2_P_p201508_key_c1_ba_4_1b.tokudb
data/_test_t2_P_p201508_key_id_ba_3_1b.tokudb
data/_test_t2_P_p201508_main_ba_2_1b.tokudb
data/_test_t2_P_p201508_status_ba_1_1b.tokudb
data/_test_t2_P_p201509_key_c1_bb_4_1b.tokudb
data/_test_t2_P_p201509_key_id_bb_3_1b.tokudb
data/_test_t2_P_p201509_main_bb_2_1b.tokudb
data/_test_t2_P_p201509_status_bb_1_1b.tokudb
data/_test_t2_P_rxMORES_key_c1_bc_4_1b.tokudb
data/_test_t2_P_rxMORES_key_id_bc_3_1b.tokudb
data/_test_t2_P_rxMORES_main_bc_2_1b.tokudb
data/_test_t2_P_rxMORES_status_bc_1_1b.tokudb

可以看到每个分区表有4个文件:1个main文件,1个status文件,还有2个key索引文件。
对于分区表来说,总的文件数目基本是:分区数目 * (1 + 1 + 索引数目)。

所以如果您的分区非常多,open-files-limit 配置可要小心了,要尽可能的大点,否则可能会出现”Too many open files”,从而导致实例crash!

希望本文能帮助您了解到TokuDB的文件组织结构,祝玩得开心!

时间: 2024-10-12 09:39:33

数据库内核月报 - 2015 / 09-MySQL · TokuDB · 文件目录谈的相关文章

阿里数据库内核月报:2015年09月

# 01 MySQL · 引擎特性 · InnoDB Adaptive hash index介绍 # 02 PgSQL · 特性分析 · clog异步提交一致性.原子操作与fsync # 03 MySQL · 捉虫动态 · BUG 几例 # 04 PgSQL · 答疑解惑 · 诡异的函数返回值 # 05 MySQL · 捉虫动态 · 建表过程中crash造成重建表失败 # 06 PgSQL · 特性分析 · 谈谈checkpoint的调度 # 07 MySQL · 特性分析 · 5.6 并行复制

阿里数据库内核月报:2015年11月

# 01 MySQL · 社区见闻 · OOW 2015 总结 MySQL 篇 # 02 MySQL · 特性分析 · Statement Digest # 03 PgSQL · 答疑解惑 · PostgreSQL 用户组权限管理 # 04 MySQL · 特性分析 · MDL 实现分析 # 05 PgSQL · 特性分析 · full page write 机制 # 06 MySQL · 捉虫动态 · MySQL 外键异常分析 # 07 MySQL · 答疑解惑 · MySQL 优化器 ran

阿里数据库内核月报合辑

阿里数据库内核月报:2017年05月 阿里数据库内核月报:2017年04月 阿里数据库内核月报:2017年03月 阿里数据库内核月报:2017年02月 阿里数据库内核月报:2017年01月 阿里数据库内核月报:2016年12月 阿里数据库内核月报:2016年11月 阿里数据库内核月报:2016年10月 阿里数据库内核月报:2016年09月 阿里数据库内核月报:2016年08月 阿里数据库内核月报:2016年07月 阿里数据库内核月报:2016年06月 阿里数据库内核月报:2016年05月 阿里数

阿里数据库内核月报:2016年04月

# 01 MySQL · 参数故事 · innodb_additional_mem_pool_size # 02 GPDB · 特性分析 · Segment事务一致性与异常处理 # 03 GPDB · 特性分析 · Segment 修复指南 # 04 MySQL · 捉虫动态 · 并行复制外键约束问题二 # 05 PgSQL · 性能优化 · 如何潇洒的处理每天上百TB的数据增量 # 06 Memcached · 最佳实践 · 热点 Key 问题解决方案 # 07 MongoDB · 最佳实践 

阿里数据库内核月报:2015年04月

# 01 MySQL · 引擎特性 · InnoDB undo log 漫游 # 02 TokuDB · 产品新闻 · RDS TokuDB小手册 # 03 TokuDB · 特性分析 · 行锁(row-lock)与区间锁(range-lock) # 04 PgSQL · 社区动态 · 说一说PgSQL 9.4.1中的那些安全补丁 # 05 MySQL · 捉虫动态 · 连接断开导致XA事务丢失 # 06 MySQL · 捉虫动态 · GTID下slave_net_timeout值太小问题 #

阿里数据库内核月报:2015年07月

# 01 MySQL · 引擎特性 · Innodb change buffer介绍 # 02 MySQL · TokuDB · TokuDB Checkpoint机制 # 03 PgSQL · 特性分析 · 时间线解析 # 04 PgSQL · 功能分析 · PostGIS 在 O2O应用中的优势 # 05 MySQL · 引擎特性 · InnoDB index lock前世今生 # 06 MySQL · 社区动态 · MySQL内存分配支持NUMA # 07 MySQL · 答疑解惑 · 外

阿里数据库内核月报:2015年06月

# 01 MySQL · 引擎特性 · InnoDB 崩溃恢复过程 # 02 MySQL · 捉虫动态 · 唯一键约束失效 # 03 MySQL · 捉虫动态 · ALTER IGNORE TABLE导致主备不一致 # 04 MySQL · 答疑解惑 · MySQL Sort 分页 # 05 MySQL · 答疑解惑 · binlog event 中的 error code # 06 PgSQL · 功能分析 · Listen/Notify 功能 # 07 MySQL · 捉虫动态 · 任性的 

阿里数据库内核月报:2015年08月

# 01 MySQL · 社区动态 · InnoDB Page Compression # 02 PgSQL · 答疑解惑 · RDS中的PostgreSQL备库延迟原因分析 # 03 MySQL · 社区动态 · MySQL5.6.26 Release Note解读 # 04 PgSQL · 捉虫动态 · 执行大SQL语句提示无效的内存申请大小 # 05 MySQL · 社区动态 · MariaDB InnoDB表空间碎片整理 # 06 PgSQL · 答疑解惑 · 归档进程cp命令的core

阿里数据库内核月报:2015年12月

# 01 MySQL · 引擎特性 · InnoDB 事务子系统介绍 # 02 PgSQL · 特性介绍 · 全文搜索介绍 # 03 MongoDB · 捉虫动态 · Kill Hang问题排查记录 # 04 MySQL · 参数优化 ·RDS MySQL参数调优最佳实践 # 05 PgSQL · 特性分析 · 备库激活过程分析 # 06 MySQL · TokuDB · 让Hot Backup更完美 # 07 PgSQL · 答疑解惑 · 表膨胀 # 08 MySQL · 特性分析 · Ind