MySQL · TokuDB · Savepoint漫谈

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

问题描述

某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
MySQL · myrocks · collation 限制
背景 MyRocks中的数据是按索引列以memcmp方式进行排序的。对于一些数字类型,需要进行转化才能直接通过memcmp进行比较, 例如有符号数在计算机中是用补码表示的,那么如果负数和正数直接按字节比较,结果负数会比正数大,实际存储时会将符号会反转存储,读取时再转化回来。
1615 0
|
关系型数据库 MySQL
MySQL · RocksDB · TransactionDB 介绍
1. 概述 得益于LSM-Tree结构,RocksDB所有的写入并非是update in-place,所以他支持起来事务的难度也相对较小,主要原理就是利用WriteBatch将事务所有写操作在内存缓存打包,然后在commit时一次性将WriteBatch写入,保证了原子,另外通过Sequence和Key锁来解决冲突实现隔离。
3031 0
|
关系型数据库 MySQL 索引
MySQL · myrocks · 事务锁分析
概述 MyRocks中RocksDB作为基于快照的事务引擎,其在事务支持上有别于InnoDB,有其自身的特点。在早期的月报[myrocks之事务处理] 中,我们对锁的实现有过简单的分析,本文会以一些例子来介绍MyRocks是如果来加锁解锁的。
2113 0
|
监控 关系型数据库 MySQL
MySQL · myrocks · myrocks监控信息
rocksdb本身提供了丰富的监控信息,myrocks通过information_schema下的表和show命令等将这些信息展示出来,下面主要以示例的形式来简单介绍下 先创建测试表 CREATE TABLE t1 (a INT, b CHAR(8), pk INT AUTO_INCREMENT ,PRIMARY KEY(pk) comment 'cf_1', key idx2(b) comm
1936 0
|
存储 关系型数据库 MySQL
MySQL · myrocks · myrocks之事务处理
前言 mysql目前支持的事务引擎有innodb,tokudb。 rocksdb加入mysql阵营后,mysql支持的事务引擎增长至3个。 myrocks目前支持的事务隔离级别有read-committed和repeatable-read。 同innodb一样,myrocks也支持MVCC机制。 可以说,myrocks提供了很好的事务支持,能够满足的一般业务的事务需求。 sequence n
2446 0
|
关系型数据库 MySQL
MySQL · myrocks · myrocks之备份恢复
myrocks支持逻辑备份和物理备份,逻辑备份仍然采用mysqldump,物理备份采用自己开发的myrocks_hotbackup工具,传统的物理备份工具Xtrabackup不支持rocksdb。由于rocksdb的存储特性,myrocks不管是逻辑备份还是物理备份,与innodb的备份恢复均有较大差别。 逻辑备份 myrocks的mysqldump工具支持rocksdb的逻辑备份,其使用方式
3398 0