Tokudb的安装和使用

Easter79
• 阅读 785

安装

安装主要包括两种方法:1)rpm安装  2)源码编译

1. rpm安装

此方式是比较简单的方式,按照Percona安装说明文档指示的方法操作即可。

首先安装Percona yum repository

sudo rpm -i percona-release-0.0-1.x86_64.rpm

接下来安装Percona-Server-tokudb-56.x86_64

sudo yum install Percona-Server-tokudb-56.x86_64

在这一步安装过程中,安装程序会向屏幕输出很多信息,可根据具体信息查找问题或直接success。tokudb和mysqld存在冲突,强烈建议使用rpm包安装时机器上不存在mysqld,否则会报错。

安装好后,就可以启动mysqld_safe,然后可以正常访问mysqld。

2.  源码编译

Percona的tokudb是以一个单独的包进行发布的,因此源码编译需要分别安装Percona 5.6.19和tokudb 

tokudb下载当前最新版:

http://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.17-66.0/source/tarball/

选择其中的percona-server-5.6.17-66.0.tokudb.tar.gz,下载后解压缩,将其中的storage/tokudb放到Mysql相关目录。

编译时cmake需要指定DWITH_TOKUDB_STORAGE_ENGINE=1,然后执行make /make install。

编译tokudb需要gcc版本大于4.8,cmake版本大于2.8.9。

使用TokuDB存储引擎

tokuDB默认是使用Module方式编译的,因此在使用前需要首先Install,具体方式如下

INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_lock_waits SONAME 'ha_tokudb.so';

后续通过

show engines/show plugins/ select @@tokudb_version 就可以看到tokudb相关的内容。

建表

在install相关so之后,可以直接创建tokudb类型的表,Percona给出了一个例子,看起来和创建innodb的表没有什么区别。

mysql> CREATE TABLE `City` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `Name` char(35) NOT NULL DEFAULT '',
 `CountryCode` char(3) NOT NULL DEFAULT '',
 `District` char(20) NOT NULL DEFAULT '',
 `Population` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`ID`),
 KEY `CountryCode` (`CountryCode`)
) ENGINE=TokuDB

也可以将其他存储引擎的表修改成tokudb:

mysql> ALTER TABLE City ENGINE=TokuDB;

经确认可以在innodb和tokudb两个存储引擎之间相互转换。

同一事务内对不同存储引擎表进行操作

经测试,同一个事务内可以对innodb/tokudb分别进行操作,如下:

mysql> insert into City_tokudb(ID) values(1);
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into City_innodb(ID) values(1);
Query OK, 1 row affected (0.00 sec)
 
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into City_innodb(ID) values(2);
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into City_tokudb(ID) values(2);
Query OK, 1 row affected (0.00 sec)
 
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from City_innodb;
+----+------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+----+------+-------------+----------+------------+
| 1 | | | | 0 |
| 2 | | | | 0 |
+----+------+-------------+----------+------------+
2 rows in set (0.00 sec)
 
mysql> select * from City_tokudb;
+----+------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+----+------+-------------+----------+------------+
| 1 | | | | 0 |
| 2 | | | | 0 |
+----+------+-------------+----------+------------+
2 rows in set (0.00 sec)

复制相关

由于binlog和存储引擎是相互独立的,因此理论上复制不应受到TokuDB的影响。此处,以常规的主备搭建为基础,在主库上对TokuDB的表分别执行建表,增删改查操作,并在备库上确认复制数据无误。

常规的主备搭建流程参见:

http://dev.mysql.com/doc/refman/5.6/en/replication-howto-newservers.html

主库执行的操作:

mysql> CREATE TABLE `City_repl` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT NULL DEFAULT '', `CountryCode` char(3) NOT NULL DEFAULT '', `District` char(20) NOT NULL DEFAULT '', `Population` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `CountryCode` (`CountryCode`) ) ENGINE=TokuDB;
Query OK, 0 rows affected (0.01 sec)
 
mysql> insert into City_repl(ID) values(1);
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into City_repl(ID) values(2);
Query OK, 1 row affected (0.00 sec)
 
mysql> delete from City_repl where ID=1;
Query OK, 1 row affected (0.00 sec)
 
mysql> update City_repl set ID=3 where ID=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

相应的备库同步执行查询结果如下:

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| City_repl |
+----------------+
1 row in set (0.00 sec)
 
mysql> select * from City_repl;
+----+------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+----+------+-------------+----------+------------+
| 1 | | | | 0 |
| 2 | | | | 0 |
+----+------+-------------+----------+------------+
2 rows in set (0.00 sec)
 
mysql> select * from City_repl;
+----+------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+----+------+-------------+----------+------------+
| 2 | | | | 0 |
+----+------+-------------+----------+------------+
1 row in set (0.00 sec)
 
mysql> select * from City_repl;
+----+------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+----+------+-------------+----------+------------+
| 3 | | | | 0 |
+----+------+-------------+----------+------------+

可见简单的针对TokuDB的增删改查操作,备份是可以正常工作的

备份相关

Percona Xtrabackup当前并不支持TokuDB tables的备份,从Percona官方观点来看,其在近期内也并没有支持TokuDB的计划。

TokuDB企业版提供Hot Backup的方案,其实现原理参见:TokuDB Hot Backup – Part 1  TokuDB Hot Backup – Part 2, 当然这不会是我们考虑的方案。

Percona推荐使用LVM或是mysqldumper来备份TokuDB表,而网易在《程序员》上发表的一篇文章中提到其使用mysqldump对TokuDB进行备份。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
VirtualBox导入已安装好的操作系统的方法
VirtualBox导入已安装好的操作系统的方法1、修改UUID进入VirtualBox安装目录,运行VBoxManage修改UUID,命令运行如下:D:\\VirtualBoxVBoxManage.exe internalcommands setvdiuuid E:\\VirtualX
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k