产生原因
因为单行数据的大小超过了InnoDB引擎的最大行大小限制,默认是8126字节
。是因为表中有太多的大字段,比如VARCHAR或TEXT类型,导致行大小总和超过了限制
解决方法
1. 临时解决方法
- 调整列类型为TEXT/BLOB类型:
将占用空间较大的VARCHAR列改为TEXT或BLOB类型,此类字段仅存储768字节前缀在行内,其余内容存储于溢出页,可显著减少行大小 - 修改表的行格式:
执行以下SQL调整行格式为DYNAMIC或COMPRESSED:
该格式下,BLOB/TEXT字段仅存储20字节指针,而非768字节前缀LTER TABLE 表名 ROW_FORMAT=DYNAMIC;
- 拆分大字段或分表:
若单行字段过多,可垂直拆分表结构,将部分字段迁移到关联表中
以上方法,不需要重启MySQL,最多就是热部署应用而已,不会有任何影响
2. 最终解决方法
- 关闭InnoDB严格模式
在my.cnf配置文件中添加:
此操作会绕过行大小校验,但可能导致数据截断[mysqld] innodb_strict_mode=0
- 调整InnoDB日志文件大小
修改innodb_log_file_size参数(建议≥512MB):
需删除原有日志文件innodb_log_file_size=1G
完成以后配置后需要重启mysql。 这个建议晚上没有用户的时候操作,否则影响比较大