MySQL · TokuDB · TokuDB之黑科技工具

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: TokuDB之黑科技工具 刚过完年,美女程序员静静想学习下 TokuDB 相关技术,从何处入手呢?TokuDB的技术资料可是出了名的少! 本篇就给大家介绍下两个“黑科技”工具,来帮助我们更深入的了解TokuDB。 黑科技之tokuftdump 此工具用来dump一个Fractal-Tree结

TokuDB之黑科技工具

刚过完年,美女程序员静静想学习下 TokuDB 相关技术,从何处入手呢?TokuDB的技术资料可是出了名的少!
本篇就给大家介绍下两个“黑科技”工具,来帮助我们更深入的了解TokuDB。

黑科技之tokuftdump

此工具用来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
...
{key={len=5 data="\000\001\000\000\000"} cI: xid=0000000000000000 val={len=5 data="\375\001\000\000\000"}}
{key={len=5 data="\000\002\000\000\000"} cI: xid=0000000000000000 val={len=5 data="\375\002\000\000\000"}}
{key={len=5 data="\000\003\000\000\000"} cI: xid=0000000000000000 val={len=5 data="\375\003\000\000\000"} pI: xid=000000009a93a265 val={len=5 data="\375\004\000\000\000"}}

可以看到,在数据文件里每一行数据都是一个<key,value>对,再维护一个MVCC结构就可以满足ACID特性了。

最后一条记录就是执行完UPDATE后MVCC:有2个val存在,xid(transaction id)不同,需要注意的是 tokuftdump 会对数据进行重组织展现,并非磁盘上的原生结构。

如果你想深入了解TokuDB的Fractal-Tree结构,这是个必不可少的工具,它不仅可以 dump 数据,还可以 dump Fractal-Tree 的全部信息,让底层存储结构“跃然屏上”。

黑科技之 tdb_logprint

此工具用来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={len=15 data="./test/t1-main\000"} value={len=31 data="./_test_t1_main_90_2_1b.tokudb\000"} crc=d259724f len=95
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
xcommit                  'C': lsn=67 xid=144,2 crc=ffad0139 len=37
change_fdescriptor       'D': lsn=68 filenum=7 xid=144,0 old_descriptor={len=0 data=""} new_descriptor={len=18 data="\011\000\000\000\001\000\000\004\000\005\000\000\000\001\004\000\000\000"} update_cmp_descriptor=true crc=acef9cdb len=68
xcommit                  'C': lsn=69 xid=144,0 crc=ffa0c139 len=37
fclose                   'e': lsn=70 iname={len=32 data="./_test_t1_status_90_1_1b.tokudb"} filenum=5 crc=73c0dbf1 len=61
fclose                   'e': lsn=71 iname={len=30 data="./_test_t1_main_90_2_1b.tokudb"} filenum=7 crc=060f6b9f len=59
fopen                    'O': lsn=72 iname={len=32 data="./_test_t1_status_90_1_1b.tokudb"} filenum=9 treeflags=0 crc=c8de90f1 len=65
fopen                    'O': lsn=73 iname={len=30 data="./_test_t1_main_90_2_1b.tokudb"} 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={len=5 data="\000\001\000\000\000"} value={len=5 data="\375\001\000\000\000"} 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={len=5 data="\000\002\000\000\000"} value={len=5 data="\375\002\000\000\000"} 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={len=5 data="\000\003\000\000\000"} value={len=5 data="\375\003\000\000\000"} 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={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
xcommit                  'C': lsn=85 xid=152,0 crc=ff962939 len=37
fclose                   'e': lsn=86 iname={len=30 data="./_test_t1_main_90_2_1b.tokudb"} filenum=11 crc=8709a890 len=59
fclose                   'e': lsn=87 iname={len=32 data="./_test_t1_status_90_1_1b.tokudb"} 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={len=15 data="tokudb.rollback"} unlink_on_close=0 crc=8606e9b1 len=49
fassociate               'f': lsn=90 filenum=1 treeflags=4 iname={len=18 data="tokudb.environment"} unlink_on_close=0 crc=92dc4c1c len=52
fassociate               'f': lsn=91 filenum=3 treeflags=4 iname={len=16 data="tokudb.directory"} 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以及时间等。

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

如果你对TokuDB某个细节不清楚,请执行下你的SQL,结合这两个工具,再加上源码,基本可以做到胸中有数了。

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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8月前
|
关系型数据库 MySQL
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
75 0
|
4月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
888 4
|
21天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
63 11
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库-概括与常用图形管理工具
MySQL数据库-概括与常用图形管理工具
|
3月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
114 3
|
4月前
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
4月前
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
516 4
|
5月前
|
SQL 监控 关系型数据库
使用 pt-query-digest 工具分析 MySQL 慢日志
【8月更文挑战第5天】使用 pt-query-digest 工具分析 MySQL 慢日志
122 3
使用 pt-query-digest 工具分析 MySQL 慢日志
|
5月前
|
SQL 关系型数据库 MySQL
在Linux中,mysql 数据备份工具有哪些?
在Linux中,mysql 数据备份工具有哪些?
|
5月前
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多