Dimensiunea rândului este prea mare (> 8126) (Administrarea bazelor de date, Mysql, Innodb, Blob)

Hellon Canella Machado a intrebat.

Mă confrunt cu următoarea problemă.

Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In

formatul curent al rândurilor, prefixul BLOB de 768 de octeți este stocat inline.

Apare doar când încarc o imagine în baza de date (are <1Mb). Mai exact, doar 100kb.

Am încercat o mulțime de lucruri: să schimb proprietățile „max_allowed_packet”, „innodb_log_file_size” (și anume, să măresc dimensiunea la 512M) și nimic…

Nu știu care este cauza problemei.

Pentru a ilustra, tabelul

TABLE(
    `passeio` int(4) unsigned NOT NULL COMMENT 'identitificador do passeio',
      `data_inclusao` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `nome_passeio` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `inicio` date NOT NULL,
      `fim` date NOT NULL,
      `por_que_ir` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `pdf_roteiro` mediumblob NOT NULL,
      `incluso` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `nao_incluso` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `valor_descricao` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `valor_vista` decimal(10,0) NOT NULL,
      `valor_total_parcelado` decimal(10,0) NOT NULL,
      `numero_parcelas` int(2) unsigned NOT NULL,
      `forma_pagamento` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `avisos_importantes` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `foto_principal` blob NOT NULL,
      `foto_2` blob NOT NULL,
      `foto_3` blob NOT NULL,
      `foto_4` blob NOT NULL,
      `foto_5` blob NOT NULL,
      `foto_6` blob NOT NULL,
      `foto_7` blob NOT NULL,
      `foto_8` blob NOT NULL,
      `foto_9` blob NOT NULL,
      `foto_10` blob NOT NULL,
      `foto_11` blob NOT NULL,
      `foto_12` blob NOT NULL,
      `foto_13` blob NOT NULL,
      `foto_14` blob NOT NULL,
      `foto_15` blob NOT NULL,
      `foto_16` blob NOT NULL,
      `foto_17` blob NOT NULL,
      `foto_18` blob NOT NULL,
      `foto_19` blob NOT NULL,
      `foto_20` mediumblob NOT NULL,
      `valor_entrada` decimal(10,0) NOT NULL,
      `data_partida` date NOT NULL,
      `local_partida_1` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `hora_partida_1` time NOT NULL,
      `local_partida_2` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `hora_partida_2` time NOT NULL,
      `local_partida_3` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `hora_partida_3` time NOT NULL,
      `local_partida_4` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `hora_partida_4` time NOT NULL,
      `local_partida_5` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `hora_partida_5` time NOT NULL,
      `local_partida_6` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `hora_partida_6` time NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;    

2 răspunsuri
RolandoMySQLDBA

Bill Karwin a abordat această problemă înainte în răspunsul său la Eroare de dimensiune a rândului cu MySQL

De asemenea, am abordat acest aspect și în trecut : MySQL: Dimensiunea rândului este prea mare (> 8126)

Pe baza postului său și a faptului că aveți încă mai multe câmpuri TEXT și VARCHAR, ar trebui să setați următoarele valori mai mari în my.cnf:

[mysqld]
max_allowed_packet = 1G
innodb_log_file_size = 2G
innodb_log_buffer_size = 512M

Apoi, reporniți mysqld.

ACTUALIZARE 2015-01-26 23:15 EST

Comentariul dvs.

Într-un act de disperare, am șters ieri toate coloanele blob. Am lăsat doar una singură. Problema a dispărut . Dar le voi crea din nou și voi încerca abordarea ta. Cât de repede posibil revin cu rezultatul. Mulțumesc pentru indicație

Nu ar trebui să puneți 20 BLOB într-un singur tabel. Ar trebui să creați un tabel pentru a păstra BLOB-urile

CREATE TABLE mi_fotos
(
    id INT NOT NULL AUTO_INCREMENT,
    passeio INT NOT NULL,
    foto BLOB,
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Să stocați fotografiile în acest tabel și să aveți passeio în acest tabel să facă legătura cu tabelul original.

Comentarii

  • Într-un act de disperare, am șters ieri toate coloanele blob. Am lăsat doar una singură. Problema a dispărut . Dar le voi crea din nou și voi încerca abordarea ta. Cât de repede posibil revin cu rezultatul. Mulțumesc pentru indicație. –  > Por Hellon Canella Machado.
  • Interesantă abordare. Bine, o voi încerca. Nu știam aceste posibilități. Sunt începător cu mysql. Mulțumesc pentru sfaturi. –  > Por Hellon Canella Machado.
  • Am sfârșit prin a folosi sugestia de a folosi două tabele în loc de unul cu un id care le leagă. Mulțumesc pentru asta. –  > Por Matt Cremeens.
Greg

Am încercat să încarc un fișier de descărcare și am dat peste asta. A eșuat la un CREATE TABLE declarație.

Am reușit cel puțin să obțin CREATE TABLE să ruleze prin setarea

innodb_strict_mode = 0

Asta va transforma această eroare într-un avertisment. În timpul încărcării descărcării, această eroare s-a repetat de două ori, dar tabelul a fost creat cu toate câmpurile:

[Warning] InnoDB: Cannot add field `field_GF20140210120838544997000000` in table `mydb`.`mytable` because after adding it, the row size is 7391 which is greater than maximum allowed size (7372) for a record on index leaf page.

Contrar avertismentului, câmpul field_GF20140210120838544997000000 există.

Probabil că îmi lipsesc niște date la nivel local, dar cel puțin refactorizarea este o posibilitate acum că l-am încărcat.