Vor kurzem kam es bei einem Kunden zu einem ungewöhnlichem Problem beim speichern von Attributen (s_articles_attributes). Diese liesen sich weder im Backend noch über die API speichern.
Fehler
'UPDATE s_articles_attributes attr6 ....'
MySQL: Error Code: 1118 Row size too large (> 8126). Changing some columns to TEXT or BLOB
Datenbankversion
10.1.38-MariaDB-1~stretch
Ursache
Wir haben also das Problem, dass die entsprechende Row einfach zu groß ist. Das passierte in diesem Fall nach ca. 150 Attributsfeldern, von denen viele Text waren.
Ob diese alle nötig sind oder noch alle gebraucht werden, darüber lässt sich sicher streiten, aber wir wollen ja das Problem lösen. Also wie machen wir das.
Laut MariaDB und MySQL Doku treten solche Probleme auf, wenn Datenbanken aus älteren Versionen migriert wurden, in welchen es das Row Format Dynamic noch nicht gab.
Lösung
Für das Problem gibt es mehrere Lösungen die Ihr hier finden könnt. In dem konkreten Fall hat das anpassen des ROW_FORMAT eine schnelle Lösung erbracht.
Prüfung des Row Formats
SELECT row_format FROM information_schema.tables WHERE table_schema="c1_staging" AND table_name="s_articles_attributes" LIMIT 1;
Aktuelles Format: compact
Anpassung des Row Formats
ALTER TABLE s_articles_attributes ROW_FORMAT=DYNAMIC;
Neues Format: dynamic
Vorsicht: Prüft das ganze natürlich vorher auf einer anderen DB des Servers oder dem Staging System. Dynamic gibt es erst ab einer gewissen Mysql/MariaDB Version und wird nur unterstützt wenn Ihr das Fileformat Barracuda aktiv habt (mehr hier)
Sicherlich kein konkretes Shopware Problem, ich kann mir aber vorstellen, dass der ein oder andere dieses Row Format noch einsetzt und eine ähnlich hohe Anzahl an Attributen hat.