MySql 存儲大量長字節 Text報錯處理辦法


今天線上版本的錯誤:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.

【導致問題的原因】
總結了下原因是因為mysql-innodb是按照page存儲數據的,每個page max size是16k,然后每個page兩行數據,所以每行最大8k數據。如果你的字段是blob之類的話,會存儲在page之外的溢出區里。
但是innodb默認的approach(羚羊)存儲格式會把每個blob字段的前864個字節存儲在page里,所以你的blob超過一定數量的話,單行大小就會超過8k,所以就報錯了
【解決思路】
解決方式是使用innodb的Barracuda(梭魚) 存儲格式
這種格式對blob字段的處理方式是在page里頭只存儲一個20byte大小的指針,其它全存在溢出區,所以你輕易超不了8k
 
【詳細步驟】
1. 打開mysql的配置my.ini。在innodb配置出添加:innodb_file_per_table=1
大概的意思就是打開mysql每張表都是獨立存儲空間的開關。
 
2. 然后命令檢查下上述開關是否打開。
show variables like '%per_table%';
 
Mysql的大字段問題
如上圖開關就打開了。
 
3. 設置mysql全局變量: innodb_file_format = Barracuda(梭魚)
命令:set GLOBAL innodb_file_format = 'Barracuda';
然后檢查下是否設置好了:
命令:show GLOBAL VARIABLES LIKE '%file_format%';

如上就是好了
 
4. 設置對應表的屬性:ROW_FORMAT=COMPRESSED
然后檢查下標的屬性是否是你設置的:COMPRESSED
 
5. 如上步驟以后,就OK了
 
【補充】
1. 最后一定要檢查下相關表的屬性,一定要是COMPRESSED,如下圖
Mysql的大字段問題

這點一定要注意,這是導致線上事故的一個重要原因


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM