更改“Mysql Row size too large"的限制

2021-11-20 00:00:00 mysql

如何更改限制

行大小太大 (> 8126). 将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助.在当前行格式中,内联存储 768 字节的 BLOB 前缀.

表格:

id int(11) 否姓名 文字 否日期 日期 否时间 时间 否调度 int(11) 否类别 int(11) 否top_a varchar(255) 否top_b varchar(255) 否top_c varchar(255) 否top_d varchar(255) 否top_e varchar(255) 否top_f varchar(255) 否top_g varchar(255) 否top_h varchar(255) 否top_i varchar(255) 否top_j varchar(255) 否top_title_a varchar(255) 否top_title_b varchar(255) 否top_title_c varchar(255) 否top_title_d varchar(255) 否top_title_e varchar(255) 否top_title_f varchar(255) 否top_title_g varchar(255) 否top_title_h varchar(255) 否top_title_i varchar(255) 否top_title_j varchar(255) 否top_desc_a 文本 否top_desc_b 文本 否top_desc_c 文本 否top_desc_d 文本 否top_desc_e 文本 否top_desc_f 文本 否top_desc_g 文本 否top_desc_h 文本 否top_desc_i 文本 否top_desc_j 文本 否状态 int(11) 否admin_id int(11) 否

解决方案

serverfault 上也有人问过这个问题.><块引用>

你可能想看看这个文章解释了很多关于 MySQL 行大小.需要注意的是,即使您使用TEXT 或 BLOB 字段,您的行大小仍可能超过 8K(限制为InnoDB) 因为它存储了每个内联字段的前 768 个字节页面.

解决此问题的最简单方法是使用 Barracuda 文件格式与 InnoDB.这基本上完全摆脱了这个问题仅存储指向文本数据的 20 字节指针而不是存储前 768 个字节.

<小时>

适用于 OP 的方法是:

  1. 将以下内容添加到 [mysqld] 部分下的 my.cnf 文件中.

    innodb_file_per_table=1innodb_file_format = 梭子鱼

  2. ALTER 表使用ROW_FORMAT=COMPRESSED.

    ALTER TABLE nombre_tabla引擎=InnoDBROW_FORMAT=压缩KEY_BLOCK_SIZE=8;

<小时>

上述方法可能仍不能解决您的问题.这是InnoDB的已知(并验证)错误strong> 引擎,现在的临时修复是回退到 MyISAM 引擎作为临时存储.所以,在你的 my.cnf 文件中:

internal_tmp_disk_storage_engine=MyISAM

How can I change the limit

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.

Table:

id  int(11) No       
name    text    No       
date    date    No       
time    time    No       
schedule    int(11) No       
category    int(11) No       
top_a   varchar(255)    No       
top_b   varchar(255)    No       
top_c   varchar(255)    No       
top_d   varchar(255)    No       
top_e   varchar(255)    No       
top_f   varchar(255)    No       
top_g   varchar(255)    No       
top_h   varchar(255)    No       
top_i   varchar(255)    No       
top_j   varchar(255)    No       
top_title_a varchar(255)    No       
top_title_b varchar(255)    No       
top_title_c varchar(255)    No       
top_title_d varchar(255)    No       
top_title_e varchar(255)    No       
top_title_f varchar(255)    No       
top_title_g varchar(255)    No       
top_title_h varchar(255)    No       
top_title_i varchar(255)    No       
top_title_j varchar(255)    No       
top_desc_a  text    No       
top_desc_b  text    No       
top_desc_c  text    No       
top_desc_d  text    No       
top_desc_e  text    No       
top_desc_f  text    No       
top_desc_g  text    No       
top_desc_h  text    No       
top_desc_i  text    No       
top_desc_j  text    No       
status  int(11) No       
admin_id    int(11) No 

解决方案

The question has been asked on serverfault too.

You may want to take a look at this article which explains a lot about MySQL row sizes. It's important to note that even if you use TEXT or BLOB fields, your row size could still be over 8K (limit for InnoDB) because it stores the first 768 bytes for each field inline in the page.

The simplest way to fix this is to use the Barracuda file format with InnoDB. This basically gets rid of the problem altogether by only storing the 20 byte pointer to the text data instead of storing the first 768 bytes.


The method that worked for the OP there was:

  1. Add the following to the my.cnf file under [mysqld] section.

    innodb_file_per_table=1
    innodb_file_format = Barracuda
    

  2. ALTER the table to use ROW_FORMAT=COMPRESSED.

    ALTER TABLE nombre_tabla
        ENGINE=InnoDB
        ROW_FORMAT=COMPRESSED 
        KEY_BLOCK_SIZE=8;
    


There is a possibility that the above still does not resolve your issues. It is a known (and verified) bug with the InnoDB engine, and a temporary fix for now is to fallback to MyISAM engine as temporary storage. So, in your my.cnf file:

internal_tmp_disk_storage_engine=MyISAM

相关文章