MySQL · TokuDB · Savepoint漫谈

本文涉及的产品
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 问题描述 某TokuDB实例备库发生复制中断,报错信息甚是诡异: Error executing row event: "Can't lock file (errno: 22 - Invalid argument)" 经过gdb core后,大体知道了发生错误的原因: TokuDB在

问题描述

某TokuDB实例备库发生复制中断,报错信息甚是诡异:

  Error executing row event: "Can't lock file (errno: 22 - Invalid argument)"

经过gdb core后,大体知道了发生错误的原因:

TokuDB在创建子事务的时候,由于嵌套事务过多,FT-index直接返回了错误(TokuDB的嵌套事务最多允许256个,嵌套事务数目的类型为uint8_t)导致。

比较诡异的是主库一切正常,无任何错误。

经过沟通,发现用户使用了大量的savepoint,这是一个突破点。

Savepoint机制

在TokuDB里savepoint的机制是个啥样子呢?

这里我们分两种情况来处理,先来看第一种,SQL1

set autocommit=0;
savepoint s0;
insert into tb1 values(0);
release savepoint s0;
savepoint s1;
insert into tb1 values(1);
release savepoint s1;
...
commit;

TokuDB将会这样处理:

a) savepoint s0:
创建s0子事务
b) release savepoint s0的时候:
commit当前s0事务
c) savepoint s1:
创建s1子事务(此时s0子事务已不存在,已提交)
d) release savepoint s1的时候:
commit当前s1事务

savepoint 间的事务并非嵌套,而是用完就释放,然后再重新创建,这样不会导致事务栈溢出。

再来看另外一种情况,SQL2

set autocommit=0;
savepoint s0;
insert into tb1 values(0);
savepoint s1;
insert into tb1 values(1);
savepoint s2;
insert into tb1 values(2);
...
commit;

这种SQL TokuDB的处理方式是:

a) savepoint的时候:
s1是s0的子事务,s2是s1的子事务,就这样嵌套下去直到事务栈溢出...

b) commit的时候:
会先提交s2,然后提交s1,然后提交s0,最后整个事务提交

问题解决

针对开始时的问题,TokuDB内核君进行了大胆猜测:

在主库执行的是SQL1,一切正常;
在备库执行的是SQL2,事务栈溢出了;

通过翻看 binlog 代码印证了我们的猜测,在 sql/binlog.cc 里只实现了 binlog_savepoint_set 方法,只记录savepoint event到binlog,而未记录release savepoint event!

由于savepoint实现机制不同,对InnoDB引擎来说是没有问题的,但对 TokuDB 来说就是灾难了。解决办法就是实现binlog_savepoint_release方法,记录release savepoint event到binlog。

ApsaraDB MySQL 5.6 最新版已修复这个问题,对savepoint有需求的TokuDB用户(InnoDB不受影响)做下升级即可。

本篇小文从一个用户引发的问题出发,讨论了TokuDB的savepoint机制,当然TokuDB内核组的同学每天都会处理很多类似的问题,从发现问题到解决问题,以及持续的优化,为的就是给大家提供一种“飞”的感觉。有大数据量存储的同学不妨试试我们的 TokuDB 引擎,存储成本大大降低,顺便体验一把下一代存储引擎带来的“优越感”(注意,这不是广告)。

最后广告还是来了:
我们的PB级云数据库 PetaData已开始公测,底层采用TokuDB引擎,存储介质是普通的SATA盘,有兴趣的同学可以去围观下。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
存储 算法 关系型数据库
MySQL · 源码分析 · Tokudb序列化和反序列化过程
序列化和写盘 Tokudb数据节点写盘主要是由后台线程异步完成的: checkpoint线程:把cachetable(innodb术语buffer pool)中所有脏页写回 evictor线程:释放内存,如果victim节点是dirty的,需要先将数据写回。
3170 0
|
存储 算法 关系型数据库
TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘
HybridDB for MySQL(原名petadata)是面向在线事务(OLTP)和在线分析(OLAP)混合场景的关系型数据库。HybridDB采用一份数据存储来进行OLTP和OLAP处理,解决了以往需要把一份数据多次复制来分别进行业务交易和数据分析的问题,极大地降低了数据存储的成本,缩短了数据分析的延迟,使得实时分析决策称为可能。 HybridDB for MySQL兼容MySQL的语法及
3126 0
|
存储 关系型数据库 MySQL
【MySQL】Tokudb安装测试初探
一 前言    TokuDB 是一个高性能、支持MVCC的MySQL 和 MariaDB 的存储引擎。TokuDB 的主要特点是数据压缩功能出色,对高写压力的支持,由美国TokuTek公司(http://www.tokutek.com/) 研发,该公司于2015年4月份被Percona收购,理所当然地提供了TokuDB版本的Percona Server。
1461 0
|
关系型数据库 MySQL 索引
|
存储 关系型数据库 MySQL
MySQL · TokuDB · 日志子系统和崩溃恢复过程
TokuDB日志子系统 MySQL重启后自动加载InnoDB和其他的动态plugin,包括TokuDB。每一plugin在注册的时候指定init和deinit回调函数。TokuDB的init/deinit函数分别是tokudb_init_func和tokudb_done_func。 MySQL重
1889 0
|
存储 缓存 索引
MySQL · TokuDB · TokuDB索引结构--Fractal Tree
背景介绍 TokuDB采用的是Fractal Tree作为索引的数据组织方式。它是一种面向磁盘I/O优化的数据结构,采用“分期偿还”策略减少在数据插入过程中从root节点到leaf节点的搜索过程。这种搜索过程可以简称为locate_position,就是寻找要插入key在Tree中位置的过程。
3243 0
|
SQL Java 关系型数据库
MySQL · TokuDB · 事务子系统和 MVCC 实现
前言 之前有篇月报是关于innodb事务子系统的《MySQL · 引擎特性 · InnoDB 事务子系统介绍》 里面较详细的讲述了 MySQL 如何开启一个事务,感兴趣的同学可以先阅读那篇温习一下。 TokuDB 引擎也支持事务,保证一个事务内的所有操作都执行成功或者都未被执行。TokuDB
1708 0
|
关系型数据库 MySQL
MySQL · TokuDB · TokuDB之黑科技工具
TokuDB之黑科技工具 刚过完年,美女程序员静静想学习下 TokuDB 相关技术,从何处入手呢?TokuDB的技术资料可是出了名的少! 本篇就给大家介绍下两个“黑科技”工具,来帮助我们更深入的了解TokuDB。 黑科技之tokuftdump 此工具用来dump一个Fractal-Tree结
1995 0
|
存储 Java 关系型数据库
MySQL · TokuDB · Cachetable 的工作线程和线程池
介绍 TokuDB也有类似InnoDB的buffer pool叫做cachetable,存储数据节点(包括叶节点和中间节点)和rollback段,本文中为了表达简单,叶节点,中间节点和rollback段统称数据节点。Cachetable是全局唯一的,它与MySQL实例存在一一对应的关系。TokuD
1666 0

相关产品

  • 云数据库 RDS MySQL 版
  • 下一篇
    无影云桌面