内容提要
最近发现一个警告信息,表中添加字段后行大小超过允许的最大大小。警告出现在表对象加载到表定义缓存中时,当缓存过小无法容纳所有用户表时会偶尔出现。删除列以符合限制时,MySQL执行命令没有投诉但记录错误。尝试重新添加有问题的列时会触发两个警告。错误消息有时出乎意料,不要盲目相信,而是尝试找到核心问题。
关键要点
-
最近发现一个警告信息,表中添加字段后行大小超过允许的最大大小。
-
警告出现在表对象加载到表定义缓存中时,偶尔出现。
-
删除列以符合限制时,MySQL执行命令没有投诉但记录错误。
-
尝试重新添加有问题的列时会触发两个警告。
-
错误消息有时出乎意料,不要盲目相信,而是尝试找到核心问题。
-
创建表时违反最大行大小限制会导致错误。
-
使用旧的COMPACT行格式时,最大行大小限制较低。
-
innodb_strict_mode开启时,防止创建违反限制的表。
-
表定义缓存过小会导致加载时出现警告。
-
在表定义不在缓存中时,访问表会触发警告。
-
删除列后,MySQL执行命令没有警告,但仍记录错误。
-
重新添加列时会触发两个警告,一个是临时表的警告。
-
错误消息可能会误导,需深入分析问题。
延伸问答
InnoDB行大小限制是什么?
InnoDB行大小限制是每条记录在索引叶页上允许的最大大小,通常为8126字节。
为什么在添加字段时会出现行大小超过限制的警告?
当表的行大小超过最大允许大小时,MySQL会在加载表对象到表定义缓存时发出警告。
如何解决行大小过大的问题?
可以通过将某些列更改为TEXT或BLOB类型,或使用ROW_FORMAT=DYNAMIC或ROW_FORMAT=COMPRESSED来解决行大小过大的问题。
innodb_strict_mode的作用是什么?
innodb_strict_mode开启时,MySQL会防止创建违反行大小限制的表。
表定义缓存过小会有什么影响?
表定义缓存过小可能导致在访问表时出现警告,尤其是在表对象未加载到缓存中时。
删除列后为什么没有警告但仍记录错误?
虽然删除列的操作没有警告,但MySQL仍会记录错误,因为行大小仍然违反了限制。