Errore di dimensione della riga con MySQL


11

Sto eseguendo un server MySQL sul mio Macbook (per i test). La versione è 5.6.20 da Homebrew. Ho iniziato a riscontrare errori "Dimensione riga troppo grande" e sono stato in grado di ridurlo a questo caso di prova. Tavolo:

mysql> describe test;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| stuff | longtext | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+

Stato della tabella:

mysql> show table status where Name = 'test';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| test | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |            0 |   5242880 |              2 | 2014-08-28 23:51:12 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+

L'errore viene visualizzato quando provo a inserire una riga nella tabella in cui la stuffcolonna ha più di 5033932 byte.

mysql> select length(stuff) from test;
+---------------+
| length(stuff) |
+---------------+
|       5033932 |
+---------------+

mysql> update test set stuff = concat(stuff, 'a');
ERROR 1118 (42000): 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.

Ho cercato questo errore, la maggior parte delle risposte coinvolge avere troppe colonne TEXT e ognuna ha 768 byte memorizzati in linea. Come puoi vedere, non è questo il caso per me. Inoltre, il numero 5033932 rimane lo stesso indipendentemente dal numero di colonne che ho nella tabella. Nella mia applicazione originale, c'erano cinque colonne e gli aggiornamenti non riuscivano ancora quando la dimensione della colonna superava 5033932.

Ho anche visto le persone risolvere il problema cambiando i formati di riga, che proverò tra poco, ma vorrei capire esattamente cosa sta causando questo errore.

Grazie in anticipo!

Risposte:


12

Una modifica nelle note di rilascio 5.6.20:

La scrittura del registro di ripetizione per campi BLOB di grandi dimensioni e memorizzati esternamente potrebbe sovrascrivere il checkpoint più recente. La patch 5.6.20 limita la dimensione del registro di ripetizione BLOB scrive al 10% della dimensione del file di registro di ripetizione. La patch 5.7.5 risolve il bug senza imporre una limitazione. Per MySQL 5.5, il bug rimane una limitazione nota.

Come risultato del limite di scrittura BLOB del registro di ripetizione introdotto per MySQL 5.6, innodb_log_file_size dovrebbe essere impostato su un valore maggiore di 10 volte la dimensione dei dati BLOB più grande trovata nelle righe delle tabelle più la lunghezza di altri campi di lunghezza variabile (VARCHAR, VARBINARY e campi di tipo TEXT). In caso contrario, potrebbero verificarsi errori "Dimensione riga troppo grande".

(enfatizzare il mio)

L'impostazione predefinita innodb_log_file_sizeè 50331648, il che significa che il valore BLOB / TEXT più grande che è possibile creare, indipendentemente dal tipo di dati, è vicino a 5033164 e si è scoperto che il valore esatto è 5033932. Suppongo che internamente il calcolo implichi un fattore di sfumatura.

Quindi è necessario aumentare innodb_log_file_sizese si desidera archiviare dati BLOB / TEXT più grandi. Fortunatamente, la modifica delle dimensioni del file di registro è molto più semplice in 5.6 rispetto alle versioni precedenti di InnoDB. Aggiungi una riga nel tuo my.cnf con il nuovo valore e riavvia mysqld.


piccolo avviso, è necessario riavviare o arrestare e ricominciare per fare in modo che il cambiamento sia interessato, la ricarica non funziona
Hieu Vo

1
Questo limite di ripristino è ridotto al 10% del totale combinato innodb_log_file_size (innodb_log_file_size * innodb_log_files_in_group) da mysql 5.6.22. E il longblob può avere una lunghezza massima di 4294967295 (2 ^ 32 - 1) caratteri, ovvero 4 GB circa. Per memorizzare questo valore longblob dovremmo avere almeno 40 GB combinati innodb_log_file_size (innodb_log_file_size * innodb_log_files_in_group).
Kasi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.