在對數據進行導入到新的機器時,出現錯誤 Row size too large (> 1982). 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.致使數據不能錄入。html
baidu了一下發現,是表中有多個text字段致使的。mysql
解決方式是在建表增長 ROW_FORMAT=COMPRESSED,而後再錄入數據就正常了。sql
詳細問題的描述、解決參考:http://blog.sina.com.cn/s/blog_8e9cceee0101k65j.htmlapp
原文以下:google
前段時間在項目壓測的時候出現了mysql的大字段問題,致使數據層沒法存儲。各方找人求助,都無果,最後求助萬能的google,找到國外高人的解決方案,一步步來,終於解決了。這後來也沒寫總結,只是寫了一篇簡單的有道雲筆記,結果今天線上的版本又出了這個問題,才難免責怪本身怎麼沒有發一篇詳細博文記錄,以及及時的分享給兄弟們(沒辦法最近太忙了,忙出翔來了)。url
【問題描述】3d
最先mysql端報這個錯指針
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBsorm
今天線上版本的錯誤:htm
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
2. 而後命令檢查下上述開關是否打開。
show variables like '%per_table%';
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了
今天又讓tx折騰一天,MD。長記性,再忙也要記錄,要給團隊分享,但願咱們團隊,個人兄弟們,咱們公司積累愈來愈多的財富。
【補充】
1. 最後必定要檢查下相關表的屬性,必定要是COMPRESSED,以下圖
這點必定要注意,這是致使線上事故的一個重要緣由