Wie kann ich das Limit ändern?
Zeilengröße zu groß (> 8126). Das Ändern einiger Spalten in TEXT oder BLOB oder das Verwenden von ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
kann hilfreich sein. Im aktuellen Zeilenformat wird das BLOB
Präfix 768 Byte inline gespeichert.
Tabelle:
id int(11) No
name text No
date date No
time time No
schedule int(11) No
category int(11) No
top_a varchar(255) No
top_b varchar(255) No
top_c varchar(255) No
top_d varchar(255) No
top_e varchar(255) No
top_f varchar(255) No
top_g varchar(255) No
top_h varchar(255) No
top_i varchar(255) No
top_j varchar(255) No
top_title_a varchar(255) No
top_title_b varchar(255) No
top_title_c varchar(255) No
top_title_d varchar(255) No
top_title_e varchar(255) No
top_title_f varchar(255) No
top_title_g varchar(255) No
top_title_h varchar(255) No
top_title_i varchar(255) No
top_title_j varchar(255) No
top_desc_a text No
top_desc_b text No
top_desc_c text No
top_desc_d text No
top_desc_e text No
top_desc_f text No
top_desc_g text No
top_desc_h text No
top_desc_i text No
top_desc_j text No
status int(11) No
admin_id int(11) No
No
angezeigt?Antworten:
Die Frage wurde auch bei Serverfault gestellt .
Die Methode, die für das OP dort funktionierte, war:
Fügen Sie der
my.cnf
Datei unter[mysqld]
Abschnitt Folgendes hinzu .ALTER
die zu verwendende TabelleROW_FORMAT=COMPRESSED
.Es besteht die Möglichkeit, dass die oben genannten Probleme immer noch nicht behoben werden. Es ist ein bekannter (und verifizierter) Fehler mit der InnoDB- Engine, und eine vorübergehende Lösung besteht derzeit darin, auf die MyISAM- Engine als temporären Speicher zurückzugreifen. Also, in Ihrer
my.cnf
Datei:quelle
innodb_file_per_table=1
diese Option, um diese Option zu aktivieren.Ich bin kürzlich auf dieses Problem gestoßen und habe es auf andere Weise gelöst. Wenn Sie MySQL Version 5.6.20 ausführen, ist ein Fehler im System bekannt. Siehe MySQL-Dokumente
In meiner Situation war der beleidigende Blob-Tisch ungefähr 16 MB groß. Die Art und Weise, wie ich es gelöst habe, war das Hinzufügen einer Zeile zu my.cnf, die sicherstellte, dass ich mindestens das 10-fache dieses Betrags hatte und noch einige mehr:
innodb_log_file_size = 256M
quelle
longblob
Feld verschwand, sobald ich deninnodb_log_file_size
Parameter erhöhte . Lief auch 5.6.20.Stellen Sie Folgendes in Ihrer my.cnf-Datei ein und starten Sie den MySQL-Server neu.
quelle
innodb_strict_mode=0
-> keine Leerzeichen. Andernfalls führt ein Neustart von mariaDB 10.2 zu einem Fehler :-PWenn Sie den ENGINE wechseln und MyISAM anstelle von InnoDB verwenden können, sollte dies helfen:
ENGINE=MyISAM
Es gibt zwei Einschränkungen bei MyISAM (wohl mehr):
quelle
Ich möchte eine tolle Antwort teilen, es könnte hilfreich sein. Credits Bill Karwin siehe hier /dba/6598/innodb-create-table-error-row-size-too-large
Sie variieren je nach InnoDB-Dateiformat. Derzeit gibt es zwei Formate, Antelope und Barracuda.
Die zentrale Tablespace-Datei (ibdata1) ist immer im Antelope-Format. Wenn Sie Datei pro Tabelle verwenden, können Sie die einzelnen Dateien im Barracuda-Format verwenden, indem Sie in my.cnf innodb_file_format = Barracuda festlegen.
Grundlegende Punkte:
Eine 16-KB-Seite mit InnoDB-Daten muss mindestens zwei Datenzeilen enthalten. Außerdem hat jede Seite eine Kopf- und Fußzeile mit Seitenprüfsummen, Protokollsequenznummer usw. Hier erhalten Sie ein Limit von etwas weniger als 8 KB pro Zeile.
Datentypen mit fester Größe wie INTEGER, DATE, FLOAT, CHAR werden auf dieser primären Datenseite gespeichert und zählen zur Beschränkung der Zeilengröße.
Datentypen mit variabler Größe wie VARCHAR, TEXT, BLOB werden auf Überlaufseiten gespeichert, sodass sie nicht vollständig für die Zeilengrößenbeschränkung angerechnet werden. In Antelope werden bis zu 768 Bytes solcher Spalten zusätzlich zur Überlaufseite auf der Primärdatenseite gespeichert. Barracuda unterstützt ein dynamisches Zeilenformat, sodass möglicherweise nur ein 20-Byte-Zeiger auf der Primärdatenseite gespeichert wird.
Datentypen mit variabler Größe werden außerdem 1 oder mehr Bytes vorangestellt, um die Länge zu codieren. Das InnoDB-Zeilenformat verfügt auch über eine Reihe von Feldversätzen. Es gibt also eine interne Struktur, die mehr oder weniger in ihrem Wiki dokumentiert ist.
Barracuda unterstützt auch ROW_FORMAT = COMPRESSED, um die Speichereffizienz für Überlaufdaten zu erhöhen.
Ich muss auch kommentieren, dass ich noch nie gesehen habe, dass eine gut gestaltete Tabelle die Zeilengrößenbeschränkung überschreitet. Es ist ein starker "Code-Geruch", dass Sie gegen die Bedingung der sich wiederholenden Gruppen der ersten Normalform verstoßen.
quelle
Ich hatte das gleiche Problem, das löste es für mich:
Aus der MYSQL- Dokumentation :
quelle
Warnings from last query: InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope
Row size too large (>8126)
my_table
ROW_FORMAT = DYNAMIC; wiederNachdem ich Stunden verbracht habe, habe ich die Lösung gefunden: Führen Sie einfach die folgende SQL in Ihrem MySQL-Administrator aus, um die Tabelle in MyISAM zu konvertieren:
quelle
create table
hat die gleiche Option:CREATE TABLE ... ENGINE=MyISAM ...
Ich bin auf dieses Problem gestoßen, als ich versucht habe, eine gesicherte MySQL-Datenbank von einem anderen Server wiederherzustellen. Was dieses Problem für mich gelöst hat, war das Hinzufügen bestimmter Einstellungen zu my.conf (wie in den obigen Fragen) und das zusätzliche Ändern der SQL-Sicherungsdatei:
Schritt 1: Fügen Sie die folgenden Zeilen in my.conf hinzu oder bearbeiten Sie sie:
Schritt 2 Fügen Sie ROW_FORMAT = DYNAMIC zur Anweisung create create in der SQL-Sicherungsdatei für die Tabelle hinzu, die diesen Fehler verursacht:
Die wichtige Änderung oben ist ROW_FORMAT = DYNAMIC. (das war nicht in der ursprünglichen SQL-Sicherungsdatei enthalten)
Quelle, die mir bei der Lösung dieses Problems geholfen hat: MariaDB und InnoDB MySQL Zeilengröße zu groß
quelle
innodb_page_size=32K
funktionierte nicht, da es in meinem Fall zu einem Fehler beim Neustart von MariaDB 10.2 kam. Stattdessen habe ichinnodb_strict_mode=0
Zeile hinzugefügt , wie hierinnodb_page_size
eineibdata*
Neuerstellung erfordert , was eine destruktive Operation ist. Weitere Informationen finden Sie in Ihrem SyslogDie anderen Antworten beziehen sich auf die gestellte Frage. Ich werde auf die zugrunde liegende Ursache eingehen: schlechtes Schemadesign.
Spreizen Sie ein Array nicht über Spalten. Hier haben Sie 3 * 10 Spalten, die in 10 Zeilen mit 3 Spalten in einer neuen Tabelle (plus
id
usw.) umgewandelt werden sollen.Ihr
Main
Tisch hätte nurIhre zusätzliche Tabelle (
Top
) hätteEs würde 10 sein (oder weniger? Oder mehr?) Zeilen
Top
für jedenid
.Dies beseitigt Ihr ursprüngliches Problem und bereinigt das Schema. (Dies ist keine "Normalisierung", wie in einigen Kommentaren diskutiert.)
Wechseln Sie nicht zu MyISAM. es geht weg.
Mach dir keine Sorgen
ROW_FORMAT
.Sie müssen Ihren Code ändern, um das zu tun
JOIN
und mehrere Zeilen anstelle mehrerer Spalten zu verarbeiten.quelle
Ich verwende MySQL 5.6 unter AWS RDS. Ich habe folgendes in der Parametergruppe aktualisiert.
Ich musste die DB-Instanz neu starten, damit Änderungen an Parametergruppen wirksam wurden.
Außerdem wurde ROW_FORMAT = COMPRESSED nicht unterstützt. Ich habe DYNAMIC wie unten verwendet und es hat gut funktioniert.
quelle
Die maximale Zeilengröße für eine InnoDB-Tabelle, die für lokal auf einer Datenbankseite gespeicherte Daten gilt, beträgt für 4 KB, 8 KB, 16 KB und 32 KB etwas weniger als eine halbe Seite
Für 16-KB-Seiten (Standard) können wir Folgendes berechnen:
Grundsätzlich können Sie eine Reihe maximal nutzen mit:
Denken Sie daran, dass eine Überlaufseite nur dann überläuft, wenn das Feld> 767 Byte ist. Wenn zu viele Felder mit 767 Bytes vorhanden sind, wird es kaputt gehen (über max row_size hinaus). Nicht üblich mit latin1, aber sehr gut möglich mit utf-8, wenn die Entwickler nicht vorsichtig sind.
In diesem Fall könnten Sie möglicherweise die innodb_page_size auf 32 KB erhöhen.
in my.cnf:
Verweise:
quelle
Ich bin auch auf das gleiche Problem gestoßen. Ich löse das Problem, indem ich die folgende SQL ausführe:
Aber ich denke, du solltest etwas über den Zeilenspeicher wissen .
Es gibt zwei Arten von Spalten: Spalten mit variabler Länge (z. B. VARCHAR-, VARBINARY-, BLOB- und TEXT-Typen) und Spalten mit fester Länge . Sie werden auf verschiedenen Seitentypen gespeichert.
und wenn der Zweck der Einstellung von ROW_FORMAT ist
Möchten Sie mehr über die Zeilenformate DYNAMIC und COMPRESSED erfahren?
quelle
Wenn dies bei einem SELECT mit vielen Spalten auftritt, kann dies daran liegen, dass MySQL eine temporäre Tabelle erstellt. Wenn diese Tabelle zu groß ist, um in den Speicher zu passen, verwendet sie das Standardformat für temporäre Tabellen, InnoDB, um sie auf der Festplatte zu speichern. In diesem Fall gelten die Größenbeschränkungen für InnoDB.
Sie haben dann 4 Möglichkeiten:
Ändern Sie das Standardformat für temporäre Tabellen in MYISAM. Dies habe ich getan. Änderung in my.cnf:
Starten Sie MySQL neu, die Abfrage funktioniert.
quelle
Hier ist ein einfacher Tipp für alle Interessierten:
Nach dem Upgrade von Debian 9 auf Debian 10 mit 10.3.17-MariaDB habe ich einige Fehler in Joomla-Datenbanken:
[Warnung] InnoDB: Feld
field
in Tabelle kann nicht hinzugefügt werdendatabase
.table
da nach dem Hinzufügen die Zeilengröße 8742 beträgt, was größer ist als die maximal zulässige Größe (8126) für einen Datensatz auf der Indexblattseite.Nur für den Fall, ich habe innodb_default_row_format = DYNAMIC in /etc/mysql/mariadb.conf.d/50-server.cnf gesetzt (es war sowieso Standard)
Dann habe ich phpmyadmin verwendet, um "Tabelle optimieren" für alle Tabellen in der Joomla-Datenbank auszuführen. Ich denke, die von phpmyadmin durchgeführte Tabellenerholung hat dabei geholfen. Wenn Sie phpmyadmin installiert haben, sind es nur wenige Klicks.
quelle