IT-MÜCKE

MySQL-Datenbank bringt Fehler: Row size too large

Beitragsdatum 14.09.2021
Letzte Aktualisierung -
Betrifft mysql/mariadb u.ä., diverese Versionen

Problem

  • Ich benutze Xataface für verschiedene Datenbank-Lösungen. Xataface ist ein relativ einfach anpassbares Framework für Datenbanken. Damit können sehr schnell und einfach Anwendungen für Datenbanken gebaut werden, ohne selbst programmieren zu müssen. Man spart sich also die Arbeit, eine PHP (o.ä.) Anwendung zu bauen und kann sofort mit der Umsetzung der Anwendung beginnen.
  • Ich hatte eine Tabelle erstellt mit vielen Text-Feldern
  • Nachdem ich in dieser einige Textfelder ausgefüllt hatte, wurde die folgende Fehlermeldung beim Speichern angezeigt:
    Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
  • In der Logfile las sich das so:
    [Mon Sep 13 10:14:30.897690 2021] [proxy_fcgi:error] [pid 18956] [client xxx] AH01071: Got error 'PHP message: PHP Fatal error:  Row size too large (> 8126).
     Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. in /
    var/www/vhosts/xxx/xataface-xxx/Dataface/HistoryTool.php on line 142', referer: https://xxx/index.php?-table=tabelle&-action=edit
    &-cursor=2&-skip=0&-limit=200&-mode=list&-recordid=xxx

Ursache

  • Die genaue Ursache ist mir nicht klar. Klar, eine Row size ist zu groß. Aber was genau das Problem ist, konnte ich mir nicht erschließen bzw. eine tiefere Recherche lag nicht im Rahmen meiner Motivation. Ich wollte das Problem gelöst haben.
  • Recherchen ergaben immer wieder die selben Empfehlungen für eine Lösung des Problems.
  • Dabei ergab sich, dass nicht alle Vorschläge bei mir funktionierten, andere schon. Auch auf die Besonderheiten gehe ich weiter unten ein.

Lösung

  • text als Datentyp nutzen
    • Wie in der Fehlermeldung bereits beschrieben, sollten varchar-Felder in text oder blob umgewandelt werden. Dies war bei mir von Anfang an der Fall (text), da sich für größere Texteingaben text-Felder mit max. 64kiB Größe wesentlich besser eignen, als varchar-Felder, bei denen die Größe explizit angegeben werden muss.
    • Das war also keine Ursache.
  • Anpassen des ROW-Formats der Tabelle(n)
    • Das ROW-Format der betroffenen Tabelle(n) anpassen.
    • Dazu die Datenbank über mysql direkt anpassen.
    • Aufruf bei einem Plesk-System wie folgt:
      plesk db
    • Vorgehen wie folgt:
      # Datenbank auswählen:
      # use [db]
      # zB
      use database
      
      # ROW-Format der Tabelle(n) anpassen:
      # alter table [tabelle] ROW_FORMAT=Dynamic;
      alter table tabelle ROW_FORMAT=Dynamic;
      
      # dabei eine möglicherweise vorhandene history-Tabelle nicht vergessen:
      alter table tabelle__histroy ROW_FORMAT=Dynamic;
  • innodb_strict_mode=OFF einstellen für die Datenbank
    • :!: Diese Änderung war bei mir unnötig und sollte nicht durchgeführt werden!
    • In der Datei /etc/mysql/my.cnf folgende Änderung einfügen:
      innodb_strict_mode=OFF
    • Danach die DB neu starten:
      service mysql restart || service mariadb restart || service mysqld restart
    • Generell wird davon abgeraten, den strict_mode auszuschalten. Da diese Änderung bei mir keine Wirkung zeigte (der Fehler blieb bestehen), machte ich diese Änderung rückgängig.
    • Ein Ausschalten des strict_mode ist (in meinem Fall) unnötig!

Bei mir führte das Anpassen des ROW-Formats in beiden Tabellen zum Erfolg.

Zusätzliche Prüfungen

ROW-Format der Tabellen prüfen

Der folgende MySQL-Befehl listet alle Tabellen auf, bei denen das Row-Format auf Compact steht:

SELECT NAME, ROW_FORMAT FROM information_schema.INNODB_SYS_TABLES WHERE ROW_FORMAT IN('Redundant', 'Compact') AND NAME NOT IN('SYS_DATAFILES', 'SYS_FOREIGN', 'SYS_FOREIGN_COLS', 'SYS_TABLESPACES', 'SYS_VIRTUAL', 'SYS_ZIP_DICT', 'SYS_ZIP_DICT_COLS');

Alle Tabellen mit dem selben Problem finden

Auf der Seite mariadb.com findet sich ein Skript, mit dessen Hilfe alle Tabellen einer Datenbank mit dem selben Problem ermittelt werden können. Sie dazu Abschnitt Finding All Tables That Currently Have the Problem.


Quellen:


Ähnliche Themen im blog:
xataface, sql


zurück