it-swarm.com.de

Zeilengröße zu groß (> 8126)

Ich stehe vor dem folgenden 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

aktuelles Zeilenformat, BLOB-Präfix von 768 Bytes wird inline gespeichert.

Es wird nur angezeigt, wenn ich ein Bild in die Datenbank hochlade (es hat <1 MB). Genau, nur 100kb.

Ich habe viele Dinge versucht: die Eigenschaften "max_allowed_packet", "innodb_log_file_size" zu ändern (nämlich die Größe auf 512 MB zu erhöhen) und nichts ...

Ich kenne die Ursache des Problems nicht.

Zur Veranschaulichung die Tabelle

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;    

Bill Karwin hat dies bereits in seiner Antwort auf Zeilengrößenfehler mit MySQL angesprochen

Ich habe dies auch in der Vergangenheit angesprochen: MySQL: Zeilengröße zu groß (> 8126)

Basierend auf seinem Beitrag und der Tatsache, dass Sie noch mehrere TEXT- und VARCHAR-Felder haben, sollten Sie die folgenden Werte in my.cnf Höher festlegen:

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

Starten Sie dann mysqld neu.

UPDATE 2015-01-26 23:15 EST

Dein Kommentar

Aus Verzweiflung habe ich gestern alle Blob-Spalten gelöscht. Ich habe nur einen verlassen. Das Problem verschwand. Aber ich werde sie erneut erstellen und Ihren Ansatz ausprobieren. Ich kehre so schnell wie möglich mit dem Ergebnis zurück. Danke für den Hinweis

Sie sollten nicht 20 BLOB in eine Tabelle setzen. Sie sollten eine Tabelle für die BLOBs erstellen

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

Speichern Sie Ihre Fotos in dieser Tabelle und lassen Sie passeio in dieser Tabelle auf Ihre ursprüngliche Tabelle zurückgreifen.

9
RolandoMySQLDBA

Ich habe versucht, ein Dumpfile zu laden und bin darauf gestoßen. Es scheiterte an einem CREATE TABLE Aussage.

Ich konnte zumindest die CREATE TABLE Anweisung, die durch Einstellung ausgeführt werden soll

innodb_strict_mode = 0

Dadurch wird dieser Fehler zu einer Warnung. Beim Laden des Dumps wurde dieser Fehler zweimal wiederholt, aber die Tabelle wurde mit allen Feldern erstellt:

[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.

Entgegen der Warnung wird das Feld field_GF20140210120838544997000000 existiert.

Ich vermisse wahrscheinlich einige Daten lokal, aber zumindest Refactoring ist jetzt möglich, da ich sie geladen habe.

1
Greg