MySQL ile satır boyutu hatası


11

MacBook'umda (test için) bir MySQL sunucusu çalıştırıyorum. Sürüm Homebrew 5.6.6. "Satır boyutu çok büyük" hatalarla karşılaşmaya başladım ve bunu bu test senaryosuna indirgedim. Tablo:

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

Tablo durumu:

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 |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+

stuffSütunun 5033932 bayttan fazla olduğu tabloya bir satır eklemeye çalıştığımda hata alıyorum .

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.

Bu hatayı araştırdım, cevapların çoğu çok fazla METİN sütununu içeriyor ve her birinde satır içi 768 bayt var. Gördüğünüz gibi, benim için durum böyle değil. Ayrıca, tablodaki sütun sayısından bağımsız olarak 5033932 sayısı aynı kalır. Orijinal uygulamamda beş sütun vardı ve sütun boyutu 5033932'yi aştığında güncellemeler hala başarısız oldu.

Ayrıca insanların biraz deneyeceğim satır biçimlerini değiştirerek sorunu çözdüğünü gördüm, ancak tam olarak bu hataya neyin neden olduğunu anlamak istiyorum.

Şimdiden teşekkürler!

Yanıtlar:


12

5.6.20 sürüm notlarındaki bir değişiklik:

Büyük, harici olarak depolanan BLOB alanları için günlükleri yeniden yaz, en son denetim noktasının üzerine yazabilir. 5.6.20 düzeltme eki, yeniden yazma günlüğünün boyutunu sınırlandırır BLOB, yineleme günlüğü dosya boyutunun% 10'una yazar. 5.7.5 düzeltme eki, bir sınırlama getirmeden hatayı giderir. MySQL 5.5 için, hata bilinen bir sınırlama olarak kalır.

MySQL 5.6 için getirilen BLOB yazma sınırını yeniden yazma sonucunda, innodb_log_file_size, tablolarınızın satırlarında bulunan en büyük BLOB veri boyutunun artı diğer değişken uzunluk alanlarının uzunluğunun 10 katından daha büyük bir değere ayarlanmalıdır (VARCHAR, VARBINARY ve TEXT türü alanlar). Bunu yapmamak "Satır boyutu çok büyük" hatalarına neden olabilir.

(benimkini vurgula)

Varsayılanı innodb_log_file_size50331648'dir, yani veri türünden bağımsız olarak oluşturabileceğiniz en büyük BLOB / TEXT değeri 5033164'e yakındır ve kesin değerin 5033932 olduğunu keşfettiniz.

Bu nedenle, innodb_log_file_sizedaha büyük BLOB / TEXT verilerini saklamak istiyorsanız artmanız gerekir. Neyse ki, günlük dosyası boyutunu değiştirmek 5.6'da InnoDB'nin önceki sürümlerine göre çok daha kolay. Yeni değerle my.cnf'nize bir satır ekleyin ve mysqld'yi yeniden başlatın.


küçük bir uyarı, değişikliği etkilemek için yeniden başlatmanız veya durdurmanız ve yeniden başlatmanız gerekir, yeniden yükleme işe yaramaz
Hieu Vo

1
Bu yeniden boyut sınırı, mysql 5.6.22'den toplam kombine innodb_log_file_size (innodb_log_file_size * innodb_log_files_in_group) değerinin% 10'una kadar rahatlar. Ve longblob en fazla 4294967295 (2 ^ 32 - 1) karakter uzunluğunda olabilir, yani 4GB civarında olabilir. Bu longblob değerini saklamak için en az 40 GB kombine innodb_log_file_size (innodb_log_file_size * innodb_log_files_in_group) olmalıdır.
kasi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.