innodb compressed 表碰到的问题,BUG么?
innodb compressed 表碰到的问题
compressed innodb 表是MySQL 5.5开始提供的功能,可以把innodb表压缩,对于这个操作,很多人已经说到了,主要要注意两点:
压缩的语法是:
alter/create table …. engine=innodb row_format=compressed key_block_size=8;
其中,row_format=compressed 代表要做压缩表了,key_block_size可选(1,2,4,8,16),16是不压缩,innodb的默认值,比16小都压缩。非这几个值的话,语句无效。
同时要实现这个功能需要配置:
innodb_file_per_table
innodb_file_format = Barracuda
另外,要注意 InnoDB “strict mode” 的时候,也会报错。
这次碰到的问题其实跟上面的没有关系,所以,上面是废话。
下面说事儿:
一个同事有个表是 row_format=compressed key_block_size=8 的,他想把它改回row_format=compact的非压缩模式。但是碰到了问题:
mysql 5.5>alter table t engine =innodb row_format=compact;
ERROR 1005 (HY000): Can’t create table ‘test.#sql-684d_924′ (errno: 140 “Wrong create options”)
这两个error是:
+———+——+—————————————————————————–+
| Level | Code | Message |
+———+——+—————————————————————————–+
| Warning | 140 | InnoDB: cannot specify ROW_FORMAT = COMPACT with KEY_BLOCK_SIZE. |
| Error | 1005 | Can’t create table ‘test.#sql-684d_924′ (errno: 140 “Wrong create options”) |
+———+——+—————————————————————————–+
这是在5.5下面的结果,改不回来了!
接下来我们在5.6.13和MariaDB10下面测试,仅仅报了一个warning,说compact的时候不用指定 key_block_size了,这是可以理解的。
显然5.6做了bug修复。
通过竹峰大侠的指点,我们来看看源码:
这个判断是在 storage/innobase/handler/ha_innodb.cc 里面的create_options_are_valid函数实现的:
在5.5里面是这么写:
首先定义一个变量:
ibool kbs_specified = FALSE;
然后判断有key_block_size的话,设置kbs_specified = TRUE;
if (create_info->key_block_size) {
kbs_specified = TRUE;
…..
}
结束这个if之后,在外面case row type:
case ROW_TYPE_COMPACT:
case ROW_TYPE_REDUNDANT:
if (kbs_specified) {
push_warning_printf(
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_ILLEGAL_HA_CREATE_OPTION,
“InnoDB: cannot specify ROW_FORMAT = %s”
” with KEY_BLOCK_SIZE.”,
get_row_format_name(row_format));
ret = FALSE;
}
break;
通过上面的代码可以看到,在row type为 C或者R的时候,如果kbs_specified 指定了,直接给报错退出了!
也就是,你的语法是 create/alter table …. engine =innodb row_format=compact key_block_size=xx;
这样的语句在5.5的时候是不能执行的,直接报错退出。就是上面我们看的错误。
那么,如果create/alter table …. engine =innodb row_format=compact ;这样的语句在平时没问题,但是如果表原来是compressed的模式的,你即便不指定 key_block_size,它原来还是存在的,也会报错退出!
再来看看5.6的代码,也是老地方 storage/innobase/handler/ha_innodb.cc ,只是函数名改为了create_options_are_invalid,看出区别了么?哈哈。
实现基本一样,也是有个变量
ibool kbs_specified = FALSE;
if (create_info->key_block_size) {
kbs_specified = TRUE;
。。。。。。
}
只是不同之处是:
在
case ROW_TYPE_COMPACT:
case ROW_TYPE_REDUNDANT:
if (kbs_specified) {
push_warning_printf(
thd, Sql_condition::WARN_LEVEL_WARN,
ER_ILLEGAL_HA_CREATE_OPTION,
“InnoDB: cannot specify ROW_FORMAT = %s”
” with KEY_BLOCK_SIZE.”,
get_row_format_name(row_format));
ret = “KEY_BLOCK_SIZE”;
}
break;
在case里面,即便是发现kbs_specified,设置了 ret = “KEY_BLOCK_SIZE”,而不是5.5里面的False。
从而语句能顺利执行。
那么回过头来,5.5里面怎么做呢?DBA能被尿憋死么?
我们发现,在定义的时候
ibool kbs_specified = FALSE;
这个变量设置为true的时候是在
if (create_info->key_block_size) {
kbs_specified = TRUE;
。。。。。。
}
那么,如果我们的语句写成
alter table t engine =innodb row_format=compact key_block_size=0;
是不是就没问题了?
实践一下,答案是YES!
这个,不知道是innodb的bug,还是故意留的后门?
这个或许只能求《走进科学》解答了。。。
innodb compressed 表碰到的问题,BUG么?的更多相关文章
- InnoDB:表
数据在表中是如何进行组织存放的?下面我们就来看看: InnoDB引擎表的类型 InnoDB表都会有一个主键. 如果没有显示的指定主键,首先会去查找,看是否有非空的唯一索引, 如果有,则该列为主键:如果 ...
- ibdata1文件损坏时恢复InnoDB单表测试
Preface ibdata1 file is a shared system tablespace of innodb engine.Although we always set v ...
- 9. InnoDB通用表空间
9. InnoDB通用表空间 通用表空间是InnoDB 使用CREATE TABLESPACE语法创建的共享表空间.本节中的以下主题描述了常规表空间功能和功能: 通用表空间功能 创建通用表空间 将表添 ...
- innodb的表最大限制
相信大多数人都不知道,innodb的表最大限制为64TB,但是why? Each space is divided into pages, normally 16 kib each (this can ...
- 开启InnoDB每表一个独立的表空间
mysql> show variables like '%innodb%'; +---------------------------------+----------------------- ...
- 14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小
14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小 这个章节描述如何增加或者减少 InnoDB 系统表空间的大小 增加InnoDB ...
- InnoDB 数据表压缩原理与限制
http://liuxin1982.blog.chinaunix.net/uid-24485075-id-3523032.html 压缩理念 通过提高CPU利用率和节约成本,降低数据库容量及I/O负载 ...
- mysql-5.7 扩展innodb系统表空间详解
一.innodb系统表空间的简介: innodb 系统表空间是由若干个文件组成的,表空间的大小就是对应文件的大小,表空间文件是由innodb_data_file_path 这人参数来定义的.下面我们来 ...
- 【转载】Innodb共享表空间VS独立表空间
http://www.mysqlsupport.cn/innodb%E5%85%B1%E4%BA%AB%E8%A1%A8%E7%A9%BA%E9%97%B4vs%E7%8B%AC%E7%AB%8B%E ...
随机推荐
- VIM学习网址和资料收集
摘要:这篇博客主要收集一些学习VIM的好网址和资料 娄老师的一篇VIM 原文地址:http://www.cnblogs.com/rocedu/p/6012444.html Github上VIM的学习 ...
- WPF中的Visual Tree和Logical Tree与路由事件
1.Visual Tree和Logical TreeLogical Tree:逻辑树,WPF中用户界面有一个对象树构建而成,这棵树叫做逻辑树,元素的声明分层结构形成了所谓的逻辑树!!Visual Tr ...
- js写的一个简单的手风琴菜单
1 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&q ...
- http缓存详解,http缓存推荐方案
前言 通过本文,你将了解到http缓存机制是怎样的,no-cache到底有没有缓存,地址栏回车,F5,ctrl+F5的区别,以及当下较为推荐的缓存方案等. 自从和前端组的同事一起整了个前端扫盲计划,想 ...
- springboot+cloud 学习(一)高可用服务注册中心(Eureka)
先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...
- python的Web框架,Django模板变量,过滤器和静态文件引入
HTML模板的路径查找 在setting中设置查找路径: #默认的查找在此处填写,优先级最高,为在manage.py的同级路径中,添加(常规是template)文件夹,在(template)文件夹中配 ...
- [转]C# NPOI 导入与导出Excel文档 兼容xlsx, xls
本文转自:https://www.cnblogs.com/lazyneal/p/6148912.html 参考:http://www.cnblogs.com/restran/p/3889479.htm ...
- 为PartialView传递一个参数
看这篇之前,得先了解这个<在MVC应用程序中动态加载PartialView>http://www.cnblogs.com/insus/p/3547985.html. 因为是从这篇重构而来. ...
- async和await学习笔记
结论: (1)asyc方法的返回类型必须为:void.Task或者Task<T>.返回类型为Task的异步方法中无需使用return返回值,而返回类型为Task<TResult> ...
- Redis简介及应用场景
一丶Redis介绍 Redis是一个开源的 key—value型 单线程 数据库,支持string.list.set.zset和hash类型数据. 默认端口:6379 默认数据库数量:16 二.优点: ...