MYSQL - Umgehen des Zeilengrößenlimits von 66 KBytes

7

Ich habe eine mysql db. Ich benutze innodb. Eine meiner Tabellen enthält etwas mehr als 10 Spalten. Die letzte Spalte hat den Typ LONGTEXT und soll HTML-Code enthalten. Das Problem besteht darin, dass dieses Feld für jeden Datensatz nicht den vollständigen Code enthält und immer nach der gleichen Anzahl von Zeichen anhält. Das Gewicht der HTML-Dateien, die ich einfügen möchte, liegt bei 60KO. Also denke ich, dass jeder meiner Datensätze die maximale Zeilengröße von mysql (66KO) überschreitet. Ich würde gerne wissen, ob es Möglichkeiten gibt, diese Grenze zu erreichen. Jede Problemumgehung wäre sehr willkommen. Vielen Dank im Voraus für die Eingaben. Prost. Marc

    
Marc 27.04.2012, 10:56
quelle

5 Antworten

1

Es gibt keine Möglichkeit, dieses Limit zu erweitern, da es nicht von der Speicher-Engine abhängig ist, aber es ist ein hard limit auf dem Server :

  

Jede Tabelle (unabhängig von der Speicher-Engine) hat eine maximale Zeilengröße von   65.535 Bytes. Speicher-Engines können zusätzliche Einschränkungen in diesem Zusammenhang verursachen   begrenzen und die effektive maximale Zeilengröße reduzieren.

In diesem Fall sollten sich die Lösungen darauf konzentrieren, den Speicher von HTML an einen anderen Ort zu verschieben - auf das Dateisystem oder in die Cloud (S3) und dann auf den Dateinamen in der Tabellenspalte zu verweisen.

    
Burhan Khalid 27.04.2012, 11:04
quelle
15

Die akzeptierte Antwort ist falsch (oder zumindest ziemlich eigensinnig) - Ich möchte nicht, dass Daten außerhalb meiner Datenbank gespeichert werden, da dies zu Komplikationen bei Backup-Prozeduren und Transaktionsabfragen führt.

Wie andere darauf hingewiesen haben, gibt das Handbuch wiederholt an, dass BLOB- und TEXT-Spalten nicht zur gesamten Zeilengröße zählen, aber leider ist dies bei den Standardkonfigurationseinstellungen nicht der Fall und Sie erhalten diese Fehlermeldung . (Die Fehlermeldung ist nicht sinnvoll, da Sie angeben, dass Sie TEXT anstelle von VARCHAR verwenden müssen, um das Problem zu beheben, das Sie bereits sind.)

Der Grund für diese Einschränkung ist der Standardspeichermechanismus, Antelope , die die ersten 768 Bytes der Spalten mit variabler Länge in der Zeile speichert - und eine mögliche Lösung ist die Verwendung von INNODB und die Umstellung Ihres Speichermechanismus auf die Alternative Barracuda Speichermechanismus:

%Vor%

Dies hat keine unmittelbare Auswirkung, da diese Einstellung eine Standardeinstellung für neue Datenbankdateien ist. Daher müssen Sie die gesamte Datenbank löschen und neu erstellen.

Alternativ wechseln Sie zu Barracuda (wie oben) und wechseln dann (zusätzlich) zur Datei-pro-Tabelle-Strategie:

%Vor%

Auch dies hat keine unmittelbare Auswirkung, da beide Einstellungen Standardwerte für neue Tabellen sind - also müssen Sie die Tabelle erneut löschen und neu erstellen.

Wenn Sie danach im MySQL-Datenordner nachsehen, können Sie bestätigen, dass separate Dateien erstellt wurden, z. Für eine Datenbank namens "data" und eine Tabelle namens "test" sollten Sie eine Datei mit dem Namen "data / test / bigtable.ibd" sehen.

Wenn Sie die globalen Einstellungen in MySQL nicht ändern möchten, versuchen Sie SET SESSION anstelle von SET GLOBAL , z. unmittelbar bevor Sie Ihre CREATE TABLE -Anweisungen ausführen.

    
mindplay.dk 09.07.2013 21:05
quelle
6

Werte für (LONG) TEXT (und BLOB) werden nicht in der Zeile gespeichert, sondern außerhalb davon. Daher trägt die Größe Ihres HTML nicht zur Größe der einzelnen Zeilen bei.

Aus dem Handbuch:

  

Die interne Darstellung einer Tabelle hat eine maximale Zeilengröße von 65.535 Byte, auch wenn die Speicher-Engine größere Zeilen unterstützen kann. Diese Zahl schließt BLOB- oder TEXT-Spalten aus, die nur 9 bis 12 Byte zu dieser Größe beitragen

     

Bei BLOB- und TEXT-Daten werden die Informationen intern in einem anderen Speicherbereich als dem Zeilenpuffer gespeichert.

(Betonung meiner)

Ссылка

    
a_horse_with_no_name 27.04.2012 11:07
quelle
1

Wenn Sie sagen, dass "dieses Feld nicht den vollständigen Code enthält und es immer nach der gleichen Anzahl von Zeichen anhält", wie bestimmen Sie, was das Feld enthält? Ich vermute, dass das, was Sie gerade ansehen, durch die Variable max_allowed_packet abgeschnitten wurde.

Wie im MySQL-Handbuch angegeben:

  

Die maximale Größe eines Objekts BLOB oder TEXT hängt von seinem Typ ab, aber der größte Wert, den Sie tatsächlich zwischen dem Client und dem Server übertragen können, hängt von der Größe des verfügbaren Arbeitsspeichers und der Größe der Kommunikationspuffer ab . Sie können die Größe des Nachrichtenpuffers ändern, indem Sie den Wert der Variablen max_allowed_packet ändern, aber Sie müssen dies sowohl für den Server als auch für Ihr Client-Programm tun. Zum Beispiel können Sie mit mysql und mysqldump den clientseitigen max_allowed_packet -Wert ändern. Siehe Abschnitt 8.11.2, "Optimierung der Serverparameter" , Abschnitt 4.5.1," mysql - Das MySQL-Befehlszeilentool " und Abschnitt 4.5.4, " mysqldump - A Datenbanksicherungsprogramm ". Möglicherweise möchten Sie auch die Paketgrößen und die Größe der von Ihnen gespeicherten Datenobjekte mit den Speicheranforderungen vergleichen, siehe Abschnitt 11.5," Speicheranforderungen für den Datentyp "

    
eggyal 27.04.2012 11:01
quelle
0

Wir haben es mit den folgenden Schritten gelöst.

Schritt-1: Führen Sie Abfragen unter MySql aus, um globale Variablen festzulegen.

  • SET GLOBAL innodb_file_format = Barracuda;
  • SET GLOBAL innodb_file_per_table = ON;

Schritt-2: Wählen Sie die Tabelle aus, in der der Fehler auftritt, wenn Sie versuchen, große Daten in eine einzelne Zeile zu speichern.

Schritt-3: Gehen Sie zu Operationen

Schritt-4: Wählen Sie COMPRESSED von ROW_FORMAT. (Standardmäßig sind COMPACT und REDUNDANT vorhanden, wenn Sie die globalen Variablen innodb_file_format und innodb_file_per_table setzen. Sie können weitere Optionen wie COMPRESSED und DYNAMIC finden)

Schritt-5: Klicken Sie auf Los.

:)

    
Prakash 29.11.2013 05:51
quelle

Tags und Links