设为首页 收藏本站
查看: 1589|回复: 0

[经验分享] MySQL row_format引发的案例一则

[复制链接]

尚未签到

发表于 2018-10-2 12:02:34 | 显示全部楼层 |阅读模式
  背景知识:
  InnoDB存储引擎和大多数数据库一样,记录是以行的形式存储的,这意味着页中保存着表中一行行的数据。另外MYSQL对每个页存放的记录数又有硬性的规定,最少2行,最多16KB/2 - 200,即7992行。
  在InnoDB 1.0.X之前,InnoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据。Redundant是mysql5.0版本之前的行记录存储方式,之后仍然支持这个格式是为了兼容之前版本的格式,5.1之后很少用到了,因为Compact的结构设计比它好得多,compact格式消耗的磁盘空间和备份耗时更小,Redundant相比之下大了一些。compact格式更适用于大多数的业务场景。
  在InnoDB 1.0.X版本开始又引入了新的文件格式(file format),
  以前支持Compact和Redundant格式称为Antelope文件格式,
  新引入的文件格式称为Barracuda文件格式。
  Barracuda文件格式下拥有两种新的行记录格式:Compressed和Dynamic,
  同时,Barracuda文件格式也包括了Antelope所有的文件格式。
  这样Barracuda文件格式支持4种row_format:
  

Redundant、Compact、Compressed、Dynamic  

  而Antelope文件格式只支持2种row_format:
  

Redundant、Compact  

  参数innodb_file_format用来指定文件格式,可以通过下面的方式来查看当前所使用的InnoDB存储引擎的文件格式:
  

show variables like 'innodb_file_format';  

  现在基本上都是Barracuda
  Dynamic和Compact基本是类似的,但是它们在行溢出数据的处理上却完全不同:
  

compact格式下,溢出列存储前768字节,而dynamic格式下,溢出的列只存储前20字节,一旦发生了行溢出,  
dynamic其实就存储一个指针,数据都放在溢出页里,dynamic代表将长字段(发生行溢出)完全off-page存储。
  

  Row_format 引发异常的一个案例:
  前几天生产MYSQL遇到的一个问题,在录入数据时,整行数据完全录不进去,报以下错:
  

Cause:java.sql.SQLException: com.taobao.tddl.common.exception.TddlException:java.sql.SQLException:
  
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Row>  
some columns to TEXT or BLOB or usingROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
  
may help. In current row format,BLOB prefix of 768 bytes is stored inline.; nested exception
  
iscom.ibatis.common.jdbc.exception.NestedSQLException:
  

  该表是一个产品介绍详情表,有20多个TEXT 字段,刚好碰到了一个产品,每个字段录入的数据都很长,
  而mysql 中有了个限制,一个页(这里pagesize 是16K)必须至少存2行,也就是说每行的存储长度必须小于等于8192,而这么多 TEXT 字段,一行肯定是存不下来,也就是会发生溢出,而即例发生溢出,每个列仍然会存储前768字节(该表的row_formart  是compact),字段一多还是超过了8192,于是就报错,插不进了。
  最后将表的row_format 改为 dynamic 得以解决。alter table …  row_format=dynamic;
  所以,如果大家遇到一些表TEXT 或 VARCHAR 大字段很多,又不好拆解时,可能需要考虑下溢出后列的长度了,如果溢出后列的长度还是太大,则要看一下表的 row_format :
  

show table status like '%xxx%'\G    

  必要时需要将其实设置为 dynamic 如:
  

create table test(id int,name text,...... ) row_format=dynamic;  

  
alter table test row_format=dynamic;



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607537-1-1.html 上篇帖子: Mysql修改字段类型,修改字段名 下篇帖子: 【20180613】MySQL innodb 引擎如何解决幻读
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表