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 ...
随机推荐
- 解决chkconfig设置开机启动时出现missing LSB的错误
0x00 主要原因是脚本不符合LSB tags规范,在#!/bin/bash下面添加如下代码即可 以tomcat为例 ### BEGIN INIT INFO # Provides: bbzhh.com ...
- Java-Reflection反射-获取包括父类在内的所有字段
前言 今天Android移动端要加个新功能,所以回归Android程序员的身份.开发的过程中,发现了之前的代码写的有很多问题,真的应该把时间抽出来重构一下了. 其中有反射的一个坑,工具类某方法反射获取 ...
- SSO - 开篇引例
进公司以来, 所做的产品中, 下面的子系统就没有少于10个的, 其中有的是.net做的, 有的是java做的, 还有安卓端, ios端. 那么这么多子系统, 我可能需要访问其中的多个(同一平台), 我 ...
- C++关于sort和priority_queue的运算符重载
C++中的sort函数默认是将元素升序排列的,而priority_queue默认是将元素降序排列的(默认实现的是大顶堆). 自定义运算符用的比较多,以下2种对sort和priority_queue运算 ...
- 【杂谈】从CGI到Servlet
访问服务器的静态页面 每个Web服务器都运行着一个HTTP服务软件,用于响应web浏览器的请求,返回客户想要的页面.HTTP服务器都会有一个文件夹用于放置相关的页面文件,默认是 /user/loca ...
- 如何优雅的控制goroutine的数量
1,为什么要控制goroutine的数量? goroutine固然好,但是数量太多了,往往会带来很多麻烦,比如耗尽系统资源导致程序崩溃,或者CPU使用率过高导致系统忙不过来.比如: ; i < ...
- js实现四叉树算法
最近在看canvas动画方面教程,里面提到了采用四叉树检测碰撞.之前也看到过四叉树这个名词,但是一直不是很懂.于是就又找了一些四叉树方面的资料看了看,做个笔记,就算日后忘了,也可以回来看看. Quad ...
- multimap多重映照容器(常用的方法总结)
multimap和map的不同之处在于前者允许重复键值的元素出现. /*关于C++STL中mulitmap的学习,与map不同的是,multimap允许插入重复键值的元素*/ #include < ...
- C# 如何判断ie版本号和获取注册表中的信息
1.获取ie版本号 string ver = (new WebBrowser()).Version.ToString(); 例如:11.0.10586.103 int mainVer = (new W ...
- Extjs4处理后台json数据中日期和时间的方法
当ASP.NET后台使用JavaScriptSerializer这个组件将对象序列化为json,或者使用ScriptMethod特性的json [ScriptMethod(ResponseFormat ...