webentwicklung-frage-antwort-db.com.de

MySQL: Fehlercode: 1118 Zeilengröße zu groß (> 8126). Einige Spalten in TEXT oder BLOB ändern

Ich möchte eine Tabelle von 325 column erstellen:

CREATE TABLE NAMESCHEMA.NAMETABLE 
(   
      ROW_ID TEXT NOT NULL ,        //this is the primary key

324 column of these types:
      CHAR(1), 
      DATE, 
      DECIMAL(10,0), 
      DECIMAL(10,7), 
      TEXT, 
      LONG,

) ROW_FORMAT=COMPRESSED;

Ich habe alle VARCHAR durch den TEXT ersetzt und ich habe Barracuda in der my.ini-Datei von MySQL hinzugefügt. Dies sind die hinzugefügten Attribute:

innodb_file_per_table=1
innodb_file_format=Barracuda
innodb_file_format_check = ON

aber ich habe immer noch diesen fehler:

Error Code: 1118
 Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

BEARBEITEN: Ich kann die Struktur der Datenbank nicht ändern, da es sich um ältere Anwendungen/Systeme/Datenbanken handelt. Beim Erstellen einer neuen Tabelle handelt es sich um einen Export der alten Datenbank.

EDIT2: Ich habe diese Frage geschrieben, die anderen ähnlich ist, aber innen gibt es eine Lösung, die ich im Internet gefunden habe, wie VARCHAR und Barracuda, aber ich habe immer noch dieses Problem. Daher habe ich beschlossen, eine neue Frage mit der klassischen Antwort zu öffnen, um zu sehen, ob jemand hat andere Antworten

44
Diego87

Ich hatte kürzlich mit dem gleichen Fehlercode zu kämpfen, aufgrund einer Änderung in MySQL Server 5.6.20 . Ich konnte das Problem durch Ändern der Datei innodb_log_file_size in der Textdatei my.ini lösen.

In den Versionshinweisen wird erklärt, dass eine zu kleine innodb_log_file_size einen "Zeilengrößenfehler zu groß" auslöst. 

http://dev.mysql.com/doc/relnotes/mysql/5.6/de/news-5-6-20.html

48
user2635717

Ich habe alle Lösungen hier ausprobiert, aber nur diesen Parameter

innodb_strict_mode             = 0

meinen Tag gelöst ...

Aus dem Handbuch:

Die Einstellung innodb_strict_mode wirkt sich auf die Behandlung von Syntaxfehlern aus für CREATE TABLE-, ALTER TABLE- und CREATE INDEX-Anweisungen . innodb_strict_mode ermöglicht auch eine Überprüfung der Datensatzgröße, so dass ein INSERT oder UPDATE schlägt nie fehl, weil der Datensatz zu groß für die .__ ist. gewählte Seitengröße.

38
Stefano Brozzi
ERROR 1118 (42000) at line 1852:    
Row size too large (> 8126). Changing some columns to TEXT or 
     BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

[mysqld]

innodb_log_file_size = 512M

innodb_strict_mode = 0

ubuntu 16.04 bearbeitungspfad:

Sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

unter MS Windows lautet der Pfad etwa so:

C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

Vergessen Sie nicht, den Dienst neu zu starten (oder starten Sie Ihren Computer neu)

20

Ich habe vor kurzem eine Tabelle mit 82 Spalten erstellt und hatte den gleichen Fehler mit InnoDB . Um das Problem zu umgehen, haben wir das Tabellenformat auf MyISAM umgestellt, da es nur für ein Basisformular verwendet wurde.

7

(REAL SOLUTION MYSQL 5.7)

Auf dem aktuell neuesten MySQL-Server (5.7.21) ist derselbe Fehler aufgetreten:

Zeilengröße zu groß (> 8126). Das Ändern einiger Spalten in TEXT oder BLOB kann hilfreich sein. Im aktuellen Zeilenformat wird das BLOB-Präfix von 0 Byte inline gespeichert.

Nachdem Sie einige Stunden im Handbuch von MYSQL verbracht haben, haben Sie die Lösung gefunden!

Der Schlüsselparameter ist: innodb_page_size

Unterstützung für 32k- und 64k-Seitengrößen wurde in MySQL 5.7 hinzugefügt. Die maximale Zeilenlänge beträgt für Seitengrößen von 32 KB und 64 KB ungefähr 16000 Byte.

Der Trick ist, dass dieser Parameter nur während der INITIALISIERUNG geändert werden kann der mysql-Dienstinstanz, also Es hat keine Auswirkung, wenn Sie diesen Parameter ändern, nachdem die Instanz bereits initialisiert wurde (der allererste Lauf der Instanz).

innodb_page_size kann nur vor der Initialisierung der MySQL-Instanz konfiguriert und danach nicht mehr geändert werden. Wenn kein Wert angegeben wird, wird die Instanz mit der Standardseitengröße initialisiert. Siehe auch Abschnitt 14.6.1, „InnoDB-Startkonfiguration“.

Wenn Sie diesen Wert in my.ini vor der Initialisierung nicht ändern, beträgt der Standardwert 16 KB, wobei die Zeilengröße auf ~ 8 KB begrenzt ist. Deshalb kommt der Fehler.

Wenn Sie die innodb_page_size erhöhen, muss auch die innodb_log_buffer_size erhöht werden. Stellen Sie ihn auf mindestens 16 MB ein. Auch wenn das ROW_FORMAT auf [~ # ~] Komprimiert [~ # ~] Sie können innodb_page_size nicht auf 32 KB oder 64 KB erhöhen. Es sollte DYNAMISCH sein (Standard in 5.7).

ROW_FORMAT = COMPRESSED wird nicht unterstützt, wenn innodb_page_size auf 32 KB oder 64 KB festgelegt ist. Für innodb_page_size = 32k beträgt die Extent-Größe 2 MB. Für innodb_page_size = 64k beträgt die Extent-Größe 4 MB. innodb_log_buffer_size sollte auf mindestens 16 MB (Standardeinstellung) festgelegt werden, wenn Seitengrößen von 32 KB oder 64 KB verwendet werden.

Außerdem sollte die innodb_buffer_pool_size mindestens von 128M auf 512M erhöht werden sonst erhalten Sie einen Fehler bei der Initialisierung der Instanz (ich habe nicht den genauen Fehler).

Danach ist der Zeilengrößenfehler weg.

Das Problem dabei ist, dass Sie eine neue MySql-Instanz erstellen und Daten von einer alten auf Ihre neue DataBase-Instanz migrieren müssen.

Parameter, die ich geändert habe und die funktionieren (nachdem ich eine neue Instanz erstellt und mit der my.ini initialisiert habe, die zuerst mit diesen Einstellungen geändert wurde):

innodb_page_size=64k
innodb_log_buffer_size=32M
innodb_buffer_pool_size=512M

Alle Einstellungen und Beschreibungen, in denen ich die Lösung gefunden habe, finden Sie hier:

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

Hoffe das hilft!

Grüße!

6
fefe

Ich möchte nur einigen anderen Menschen bei einer ernsteren Variante dieses Problems helfen. In einigen Situationen tritt der Fehler ("Zeilengröße zu groß. Ändern einiger Spalten in TEXT oder BLOB") auch bei Anweisungen "alter table drop column" und "alter table change column" auf!

Folglich können Sie vollständig hängen bleiben, einen varchar nicht in einen Text umwandeln oder Spalten löschen (wenn Sie versuchen, das Problem ironischerweise zu lösen, wird dieselbe Nachricht angezeigt).

Wenn Sie dieses Problem haben, können Sie mehrere Spalten gleichzeitig ändern oder löschen. Sie können dies in MySQL mit der Syntax "alter table example drop column a, drop column b, drop column c" tun. Wenn Sie genug Spalten auf einmal löschen, wird dies ausgeführt, anstatt den Fehler zu melden.

4
Julian

In MySQL ist die maximale Zeilengröße ziemlich klar: 

Jede Tabelle (unabhängig von der Speicher-Engine) hat eine maximale Zeilengröße von 65.535 Bytes. Speicher-Engines setzen möglicherweise zusätzliche Einschränkungen für diese limit, dadurch wird die effektive maximale Zeilengröße reduziert.

. . .

Einzelne Speicher-Engines können zusätzliche Einschränkungen auferlegen, die Anzahl der Tabellenspalten begrenzen. Beispiele:

InnoDB erlaubt bis zu 1000 Spalten.

InnoDB beschränkt die Zeilengröße auf etwas weniger als eine halbe Datenbankseite (ungefähr 8000 Bytes), ohne VARBINARY, VARCHAR, BLOB oder TEXT-Spalten.

Unterschiedliche InnoDB-Speicherformate (COMPRESSED, REDUNDANT) verwenden unterschiedliche Mengen an Seitenkopf- und Trailer-Daten, die sich auf die Menge von .__ auswirken. Speicher für Zeilen verfügbar.

Bei 325 sich wiederholenden Spaltensätzen überschreiten Sie einige der Einschränkungen. Dies ist auch ein verdächtiges Datenformat. Sie sollten 325 Zeilen für jede Zeile in der gewünschten Tabelle haben, eine für jede Spaltengruppe.

4
Gordon Linoff

Für MySQL 5.7 unter Mac OS X El Capitan:

OS X enthält Beispielkonfigurationsdateien unter /usr/local/mysql/support-files/my-default.cnf

Um Variablen hinzuzufügen, halten Sie zuerst den Server an und kopieren Sie die obige Datei nach /usr/local/mysql/etc/my.cnf

cmd : Sudo cp /usr/local/mysql/support-files/my-default.cnf /usr/local/mysql/etc/my.cnf

HINWEIS: Erstellen Sie den Ordner "etc" unter "mysql", falls er nicht vorhanden ist.

cmd : Sudo mkdir /usr/local/mysql/etc

Sobald die my.cnf unter etc. erstellt wurde, ist es Zeit, eine Variable darin zu setzen.

cmd: Sudo nano my.cnf

setze Variablen unter [mysqld]

[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0

starten Sie jetzt einen Server!

3
imbond

Der Wechsel zu MyISAM ist keine Lösung. Denn Innodb-Nachfolger arbeitete für mich.

setze followings auf my.cnf

innodb_strict_mode = 0

3
Karl

Was fixiert war, war hinzuzufügen

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

Am Anfang meiner ".sql" -Datei, wie es gesagt wird in: https://Gist.github.com/tonykwon/8910261

2
Aritz Barrondo

Ich bin auch dem begegnet. Das Ändern von "innodb_log_file_size", "innodb_log_buffer_size" und den anderen Einstellungen in der Datei "my.ini" löste mein Problem nicht. Ich übergebe es, indem ich meinen Spaltentyp "text" in varchar (20) ändere und keine varchar-Werte größer als 20 verwende. Vielleicht können Sie auch die Größe von Spalten verringern, wenn dies möglich ist. _. Text ---> varchar (20) Varchar (256) -> varchar (20) 

2
ÖMER TAŞCI

UPDATE FÜR MYSQL IN DOCKER

Ich verwende @ fefes ausgezeichnete Antwort hier, um zu zeigen, wie dieses Problem innerhalb weniger Minuten behoben werden kann, wenn Docker verwendet wird (über Docker-Compose). Es ist ganz einfach, da Sie die Konfigurationsdateien von MySQL nicht berühren müssen, aber Sie müssen Ihre gesamten Daten exportieren und importieren:

Die Standardsituation Ihres MySQL-Setups sieht wahrscheinlich so aus. Ihre Daten werden im data-mysql Volumen.

mysql:
  image: mysql:5.7.25
  container_name: mysql
  restart: always
  volumes:
    - data-mysql:/var/lib/mysql
  environment:
    - "MYSQL_DATABASE=XXX"
    - "MYSQL_USER=XXX"
    - "MYSQL_PASSWORD=XXX"
    - "MYSQL_ROOT_PASSWORD=XXX"
  expose:
    - 3306
  1. Erstellen Sie eine Sicherungskopie Ihrer gesamten Daten/Datenbank per SQL-Export, sodass Sie eine .sql.gz oder so haben. Ich benutze Admin dafür.

  2. Um das Problem zu beheben (und wie in @ fefes Antwort erklärt), müssen wir die MySQL-Instanz von Null einrichten, dh wir müssen den mysql docker-Container und den mysql volume docker container. Mach ein docker container ls und ein docker volume ls um alle Ihre Container und Volumes zu sehen und die beiden Namen auszuwählen, die Ihre MySQL-Instanz und Ihr MySQL-Volume sind, ist es für mich mysql (Container) und docker_data-mysql (Lautstärke).

  3. Stoppen Sie Ihre laufenden Instanzen über docker-compose down (oder wie auch immer du normalerweise deine Docker-Sachen anhältst).

  4. Um sie zu löschen, mache ich docker container rm mysql und docker volume rm docker_data-mysql (Beachten Sie, dass der Name einen Unterstrich UND einen Bindestrich enthält).

  5. Fügen Sie diese Einstellungen zu Ihrem Mysql-Block in Ihrem Docker-Setup hinzu:

mysql:
  image: mysql:5.7.25
  command: ['--innodb_page_size=64k', '--innodb_log_buffer_size=32M', '--innodb_buffer_pool_size=512M']
  container_name: mysql
  # ...
  1. Starten Sie Ihre Instanzen neu. Das MySQL- und das MySQL-Volume sollten jetzt automatisch mit den neuen Einstellungen erstellt werden.

  2. Importieren Sie Ihre Datenbank-Dump-Datei, möglicherweise mit:

gzip -dc < database.sql.gz | docker exec -i mysql mysql -uroot -pYOURPASSWORD

Voila! Arbeitete sehr gut für mich!

1
Sliq

Habe heute morgen ein ähnliches Problem auf folgende Weise gerettet: 

Versuchen Sie, den innodb_strict_mode auszuschalten?

SET GLOBAL innodb_strict_mode = 0;

und dann erneut zu importieren.

innodb_strict_mode ist unter Verwendung von MySQL> = 5.7.7 auf ON eingestellt, bevor es OFF war.

1
Star

Folgendes hat bei mir funktioniert, sonst nichts -:

SET GLOBAL innodb_log_buffer_size = 80 * 1024 * 1024 * 1024;

und

SET GLOBAL innodb_strict_mode = 0;

Hoffe, das hilft jemandem, weil es ein paar Tage meiner Zeit verschwendet hat, als ich versuchte, dies ohne Freude in my.cnf zu tun.

1
stevensagaar

wenn Sie die MySQLWorkbench verwenden, haben Sie die Möglichkeit, das Feld query_alloc_block_size = 16258 zu ändern und zu speichern. 

Schritt 1. Klicken Sie auf den options file auf der linken Seite .  enter image description here

Schritt 2: Klicken Sie auf General und wählen Sie die checkBox von query_alloc_block_size aus und vergrößern Sie ihre Größe. Ändern Sie zum Beispiel 8129 -> 16258

 enter image description here

0
Prabhat Yadav

In keiner der bisherigen Antworten wurde die Wirkung des Parameters innodb_page_size erwähnt. Möglicherweise, weil das Ändern dieses Parameters vor MySQL 5.7.6 keine unterstützte Operation war. Aus der Dokumentation :

Die maximale Zeilenlänge mit Ausnahme von Spalten mit variabler Länge (VARBINARY, VARCHAR, BLOB und TEXT) beträgt etwas weniger als die Hälfte einer Datenbankseite für die Seitengrößen 4 KB, 8 KB, 16 KB und 32 KB. Beispielsweise beträgt die maximale Zeilenlänge für die Standardgröße innodb_page_size von 16 KB etwa 8000 Byte. Bei einer InnoDB-Seitengröße von 64 KB beträgt die maximale Zeilenlänge etwa 16000 Byte. LONGBLOB- und LONGTEXT-Spalten müssen weniger als 4 GB und die Gesamtzeilenlänge einschließlich BLOB- und TEXT-Spalten muss weniger als 4 GB betragen.

Beachten Sie, dass das Erhöhen der Seitengröße nicht ohne Nachteile ist. Nochmals aus der Dokumentation:

Seit MySQL 5.7.6 werden Seitengrößen von 32 KB und 64 KB unterstützt, ROW_FORMAT = COMPRESSED wird jedoch für Seitengrößen über 16 KB immer noch nicht unterstützt. Für die Seitengrößen 32 KB und 64 KB beträgt die maximale Datensatzgröße 16 KB. Für innodb_page_size = 32k ist die Extent-Größe 2 MB. Für innodb_page_size = 64k ist die Extent-Größe 4 MB.

Eine MySQL-Instanz, die eine bestimmte InnoDB-Seitengröße verwendet, kann keine Datendateien oder Protokolldateien einer Instanz verwenden, die eine andere Seitengröße verwendet. Diese Einschränkung kann Wiederherstellungs- oder Downgrade-Vorgänge mit Daten aus MySQL 5.6 beeinflussen, die andere Seitengrößen als 16 KB unterstützen.

0
Ken Clubok

Wenn Sie diesen Fehler in Google Cloud SQL (z. B. Mysql 5.7) erhalten, ist dies wahrscheinlich keine einfache Lösung, da nicht alle InnoDB-Flags unterstützt werden. Wenn Sie von Mysql 5.5 wie von einem früheren Wordpress-Setup aus auftauchen, kann dies bedeuten, dass Sie vor dem Export einige Spaltentypen in der Quellendatenbank ändern müssen.

Weitere Informationen finden Sie hier .

0
Richard Bown

In meinem Fall handelte es sich um Grenzwerte für die Anzahl der Spalten in der Tabelle und die Zeilengröße. Die Änderungen, die in dieser Antwort beschrieben werden, retteten meinen Tag. 

  1. Fügen Sie der Datei my.cnf im Abschnitt [mysqld] Folgendes hinzu.

    innodb_file_per_table
    innodb_file_format = Barracuda

  2. ALTER die Tabelle, um ROW_FORMAT = COMPRESSED zu verwenden. 

    ALTER TABLE Tabellenname
    ENGINE = InnoDB
    ROW_FORMAT = KOMPRIMIERT
    KEY_BLOCK_SIZE = 8; 

https://stackoverflow.com/a/15585700/2195130

0
Arman Petrosyan