注意InnoDB的记录长度,控制Blob字段的数量
来源:互联网 发布:深圳网络维护 编辑:程序博客网 时间:2024/05/19 15:39
注意InnoDB的记录长度,控制Blob字段的数量
由于熊熊内测希望换64位MySQL DB。有点担心稳定问题,研究了半天kavin当年给的innodb db bug 记录。我们用的MySQL都是5.0。
090609 22:09:41InnoDB: Assertion failure in thread 696346 in file btr0cur.c line 3781
InnoDB: Failing assertion: copied_len == local_len + extern_len
InnoDB: We intentionally generate a memory trap.
后面又仔细看了robinfu和jackai的总结帖。 发现可能是由于InnoDB,Got error 139 from storage engine错误导致的。
又看了半天MySQL的innodb 的手册,发现对于Got error 139 from storage engine 错误,innodb有比较详细的解释。
http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html
http://dev.mysql.com/doc/refman/5.0/en/innodb-file-space.html
简单说就是一个记录(行)的长度不要超过的1半(默认大约8K),行的长度一般情况下就是字段数据长度综合,但数据字段中如果有BLOB(TEXT)。
BLOB(TEXT)的长度如果大于768字节,就会在这个页面上放一部分(768个字节)的数据,其他数据放到其他页面上,所以当BLOB字段的总数大约10,
且每个字段都大于768个字节时,总长度就会大于8000(准确可能是8192),就会出现Got error 139 from storage engine 错误,(注意这个错误只是修改失败,不会Crash)
但注意这个是充分条件。不是必要条件。充分必要条件就是数据记录长度大于8000,你要考虑你还有其他字段也要占用空间。
解决这个问题的最简单的方法就是减少blob的字段,同时老老实实的估计自己的行长度。(熊熊现在的BLOB字段5个。)
对于这个错误的最简单的规避方法还可以调整innodb_page_size(默认长度是16K)的长度。这样你可以容纳更多的BLOB字段了。但扩大可能会引发脏空间的问题。
当然你还可以不用innodb,但是innodb现在已经是用的最广泛的MYSQL引擎了,靠的是实力。
随便说一句,我看一个修改记录MYSQL3.23的某个版本就说过Innodb解决了一行8000的限制问题,怎么改着改着又改回去了。
但这个问题是否会引发innodb crash,我的观点和jackai类似,出现这个错误后的确出现了Crash,但是未必是这个错误导致的。从crash的断言附近的代码看,应该是出现了数据异常。我google半天发现一个比较类似的问题报告。(断言发发生的地方一样)http://bugs.mysql.com/bug.php?id=18410
但是没有结论,MySQL的开发者认为可能是磁盘或者硬件异常导致的,或者说是出现故障后错误的修复导致的。由于无法了解当时场景和是否操作(有点怀疑我收到的错误信息是否正确),所以我也无从判断是否有这类可能。
另外的可能是在错误处理上没有回滚好。导致了某些数据的异常,但我无法重现。据说公司出现过多起这类事故。但MYSQL的开发者信誓旦旦No bug has ever been found in InnoDB that could explain the file corruption cases that have been reported from Linux in the past 5 years. (2006年)
看过新的版本5.0.85的版本感觉在这个代码附近也没有什么修正。
谢谢robinfu和jackai的总结。
BTW,看了一下最近的MySQL的发展,惊讶的发现google居然帮助了MySQL进行了很多修补。MySQL的5.4版本和Innodb新的plugin都是和Google帮助有关。
Google的境界和实力不服不行。
- 注意InnoDB的记录长度,控制Blob字段的数量
- 查询BLOB字段的长度
- 查询blob的长度
- ASP中控制字段长度的函数
- Blob 字段的插入
- blob字段的修改
- blob字段的读取
- 查找一表中一字段记录集行数相同的数量
- Blob、Clob字段的映射
- BLOB字段类型的示例
- 线程的数量控制
- MySQL如何查询某个字段长度最大的记录
- 在innodb中的blob字段怎样存储?
- varchar字段的长度
- 关于ORACLE中BLOB,CLOB字段增加记录的另一种方式
- group by 下 没有记录的分组字段的数量显示为0的方法
- innodb的多版本控制
- Oracle数据库BLOB字段的存取
- 马遍历棋盘高效算法(10*10),10*10以下的棋盘基本可以迅速计算出结果。
- 协同软件
- 通信毕业生求职
- Vegamap移植小结
- WordPress开发者文档
- 注意InnoDB的记录长度,控制Blob字段的数量
- 利用伪造内核文件来绕过IceSword的检测
- 当vim遇上C++
- 需求评审与需求测试
- 开篇之作
- Java各种排序算法实现与探讨
- MMX技术
- log4j简单配置解释
- PDSN