MySQL: row size too large error

在MySQL 5.6以前,Innodb預設的File format是最原始的Antelope,它會把VARCHAR和TEXT之類的彈性長度Column的頭768 bytes放在Index record中作快速搜尋之用,而Innodb的預設Row size limit大約是8KB,所以當table裡面有很多BLOB或TEXT column,這8KB就會很快用完而產生row size too large的問題。

首先檢查MySQL的版本,因為在5.7之後Barracuda已經成為預設,所以如果你的MySQL版本是5.6或以下,首先進到MySQL CLI執行以下指令:

mysql> show variables like "%innodb_file%";

畫面將會列出有關innodb的系統變數,如果出現了Antelope:

那就要執行以下三行指令:

SET GLOBAL innodb_file_format = Barracuda;
SET GLOBAL innodb_file_format_max = Barracuda;
SET GLOBAL innodb_file_per_table="ON";

完成後再檢查一次innodb系統變數:

另外還需要在my.cnf中加入以下的設定:

innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = 1

完成後restart MySQL的服務便可。

下一步是更新table的row format,進到MySQL CLI後執行:

mysql> ALTER TABLE test_table ROW_FORMAT=COMPRESSED;
/* 請修改test_table成為你的table名字 */

然後執行以下指令查看table狀態:

mysql> SHOW TABLE STATUS IN test_db\G
/* 請修改test_db成為你的table所在的database名字 
*/*************************** 1. row ***************************
Name: test_table
Engine: InnoDB
Version: 10
Row_format: Compressed

Row format已經成功轉為Compressed,之後就可以測試一下以確認不再出現row size too large的問題。

Rex補充:

  • MariaDB是my.ini, 位置在 C:/Program Files/MariaDB 10.5/data
  • innodb_file_format var改成Barracuda也不一定有用,還是會發生錯誤
  • 加上 innodb_strict_mode=OFF 才成功

Reference: