MySQL:Got error 139 from storage engine

转载自:http://www.cnblogs.com/analytics/archive/2010/10/05/1844262.html

 

做网站总是觉得很烦人,那边总是修修改改,每一次都要求改数据库,虽然项目并不复杂,依然给我造成了许多麻烦,任谁拿着一个东东改了又改也会烦的。前几天交用邮件发出去,却发现测试的的时候出现了一个错误:Got error 139 from storage engine。Google了一下,找到了原因,原来MySQL每条记录最长约是8000字节,而项目中有两个数据库数据项长达40项,并且大约有20个text类型。因为当时这些数据比较紧密,而且与外部没有关联,自己对数据库本身研究也不是很深,就没有分解出来。而且我做完之后只是拿了几个小数据随便测了一下,没发现这个bug。以下是这几天查找资料得到的一些知识,稍微整理下。

上面说到MySQL Innodb数据引擎默认innodb_page_size的大小为2*8196,而每条记录约为半页小一点,所以大约为8000。这个bug在MySQL官网上的报告地址为:http://bugs.mysql.com/bug.php?id=10035,并且MySQL文档里有关于对InnoDB的限制:

· 一个表不能包含超过1000列。 
· 内部最大键长度是3500字节,但MySQL自己限制这个到1024字节。 
· 除了VARCHAR, BLOB和TEXT列,最大行长度稍微小于数据库页的一半。即,最大行长度大约8000字节。LONGBLOB和LONGTEXT列必须小于4GB, 总的行长度,页包括BLOB和TEXT列,必须小于4GB。InnoDB在行中存储VARCHAR,BLOB或TEXT列的前768字节,余下的存储的分散的页面中。 
· 虽然InnoDB内部地支持行尺寸大于65535,你不能定义一个包含VARCHAR列的,合并尺寸大于65535的行。 
· 在InnoDB中默认数据库页的大小是16KB。通过编译代码,你可以在8KB到64KB之间来设置这个值。你不得不更新在univ.i源文件中的UNIV_PAGE_SIZE和UNIV_PAGE_SIZE_SHIFT的值。

从上面可以看出,虽然text类型并不完全算在行中,但是它的前768个字节却在里面,于是一个数据库大约只能有10个text左右。所以我建的那个“超大型”表肯定是行不通的。于是我在想尝试重试重新编译MySQL来解决这个问题,因为上面说了“最大行长度稍微小于数据库页的一半”,如果我将页大小重新设为64KB,那么问题基本上迎刃而解。但是,没想到这才是真正的让人发狂的开始。

关于MySQL源代码的下载可以从这个站点下载到:http://download.softagency.net/MySQL/Downloads/。它里面包括了MySQL从3.23到6.0的所有版本。好了,现在就可以开始修改了,找到storage/innobase/incluce/univ.i 文件在里面找到UNIV_PAGE_SIZE,可以看到这个值现在是16KB(默认值),由于我自己是windows系统,也装了vs08,所以我尝试用vs来重新编译。源文件里面有一个INSTALL-WIN-SOURCE的文件,应该就是说的编译方法的,打开看看还真是,然后你想照着来就OK了你就大错特错了!你可能会遇到无数你想也想不到的错误。

预备:不管怎么样,你先把系统装一个CMake,再装一个Bison,当然在windows下安装就要选windows版本。还要有个VS05或08,这样基本要求就可能达到了。然后你可能会遇到N个错误就是在sql_locale.cc这个文件显示是乱码,你可以先用UltraEdit打开,然后用UTF-8无BOM格式存储,这样在VS中打开就会显示正常了。

好了,现在基本可以按照INSTALL-WIN-SOURCE来了,先进入到源文件根目录中:
1.win\configure.js options, 关于options选项这里就不详细说了,大家可以从源文件里面看。一般就输入下面这个命令就OK了:cscript win\configure.js WITH_INNOBASE_STORAGE_ENGINEWITH_PARTITION_STORAGE_ENGINE MYSQL_SERVER_SUFFIX=-pro,它会在#mysql#/win/下生成一个文件:configure.data。
2.运行win/build-vs*.bat,根据你的系统和编译器选择相应的bat文件运行。但我发现对于不同版本提供的bat文件并不相同,如果没有你要的,没关系,打开bat文件瞧一瞧,发现原来才一句话:cmake -G "Visual Studio 9 2008",它调用了CMake完成了操作,把"Visual Studio 8 2005"不是一样可以用么?事实证明就是这样。
3.好了,有了前面两部的操作,你就可以发现生成了一个.sln的文件,双击它用VS打开就可以编译了。好了,如果在编译里面遇到了除上面说的sql_locale.cc这个问题我也无能为力了。我也是如神农尝百草一样,其中印象较为深刻的当属这个bug:http://lists.mysql.com/commits/106896,但是我根据方案做了以后问题并没有解决,但是最后不知道哪里抽疯了改回来之后竟然好了(当然这是发生在第二天的事儿了)。
4. 编译成功可以安装否?到这一步我是心情“鸡冻”得不得了啊。INSTALL-WIN-SOURCE里面说了新建几个文件夹,把文件拷过去就行啊Q!然后我竟然发现目录结构完全与里面说得不是那么回事……文件还得自己一个一个找,应该是找全了,应该试试运行一下程序了。先在windows(系统)目录中新建一个my.ini的文件,里面内容如下:

 

现在这个问题还没解决,暂时决定把表拆了重写(万一那边要装在linux机器,我不是还要在linux上编译一下给他们装上么,经得起这么折腾么)……

 

[mysql]
#MySQL目录
basedir=#目录#
#MySQL数据库存放目当
datadir=#目录#

在cmd里运行:mysql install mysql 提示服务注册成功,哇,难道成功了?启动一下试试:net start mysql 于是发现一直是1607异常。但我也不能发现到底是哪个地方出问题了,从Google里找到很多方法都对我不适应。

转载于:https://www.cnblogs.com/markqian/p/3389933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值