Upgrade 15.0.3 => 16.0.3 DB_ERROR_1118

Bonjour

en faisant la màj en 16.0.3 (Debian 11 PHP8.1) j’obtiens ces erreurs:
Erreur DB_ERROR_1118: ALTER TABLE llx_user DROP COLUMN module_comm;
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
Erreur DB_ERROR_1118: ALTER TABLE llx_user DROP COLUMN module_compta;
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
Erreur DB_ERROR_1118: ALTER TABLE llx_user DROP COLUMN ref_int;
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
Erreur DB_ERROR_1118: ALTER TABLE llx_user ADD COLUMN ref_employee varchar(50) DEFAULT NULL AFTER entity;
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
Erreur DB_ERROR_1118: ALTER TABLE llx_user ADD COLUMN national_registration_number varchar(50) DEFAULT NULL;
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Que cela veut il dire et comment m’en sortir? Au passage, je n’utilise pas PHPadmin

Bonjour
Par hasard, vous utilisez quoi comme base de donnée?

mariadb 10.5.15 pour etre précis

Bonjour,

Le row format de vos tables ne doit pas être « dynamic », c’est pourquoi la taille maximale ne peut être dépassée.

Voir ici InnoDB DYNAMIC Row Format - MariaDB Knowledge Base

1 « J'aime »

Parfait, un grand merci. Pour la postérité, cela a été résolu en me connectant à mysql:

mysql -uroot -pMonMotDePasse
MariaDB [(none)]> SET GLOBAL innodb_default_row_format=DYNAMIC;
MariaDB [(none)]> OPTIMIZE TABLE dolibarr.llx_user;

6 « J'aime »

Bonjour,

PHP 8.1 sur une v16 est courageux…la compatibilité 8.1 n’arrivera qu’avec la v17.

Bonne journée

Bonjour,
Allez j’en profite, merci à cette communauté qui aide les autres à résoudre les problèmes que l’on peut rencontrer.
Cette solution a sauvé ma journée.
Que la vôtre soit belle aussi :clap:
Iaorana

Bonjour à tous désole de déterrer un vieux mais je le même problème.

Contexte : MySQL or MariaDB 10.5.21-MariaDB-0+deb11u1

Je suis entrain de créer beaucoup d’extrafield pour la fiche produits.

Mais maintenant quand j’essaie de créer un extrafield supplémentaire j’ai Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs.

J’ai essayé la solution au dessus, mais soit j’ai pas optimiser la bonne table j’ai tenter llx_extrafields, llx_product_extrafield et llx_product.

Par contre lors de l’utilisation d’optimize j’ai eu le résultat suivant:
Table | Op | Msg_type | Msg_text |
±-------------------------±---------±---------±------------------------------------------------------------------+
| dolibarr.llx_extrafields | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| dolibarr.llx_extrafields | optimize | status | OK

sur les trois tables j’ai eu ce résultat

les logs dans dolibarr mettent

2023-11-17 14:38:09 DEBUG DoliDBMysqli::DDLAddField ALTER TABLE llx_product_extrafields ADD testlkj varchar(255) NULL

2023-11-17 14:38:09 DEBUG sql=ALTER TABLE llx_product_extrafields ADD testlkj varchar(255) NULL

023-11-17 14:38:09 ERR DoliDBMysqli::query Exception in query instead of returning an error: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
error
2023-11-17 14:38:09 ERR DoliDBMysqli::query SQL Error message: DB_ERROR_1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Cela serait donc llx_product_extrafields, pourtant j’ai essayé d’optimize apres avoir mis SET GLOBAL innodb_default_row_format=DYNAMIC;

Avez-vous une idée ?

Bonjour,

vous n’avez absolument pas le même problème.

Vous avez tout simplement atteint une limite de mysql avec le nombre visiblement imposant d’extrafields que vous avez créé sur un même objet.

https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html

Si vous consultez les tailles possibles vous pouvez constater que 65536 est la limite maximale possible (innodb_page_size)
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_page_size

Bonjour Hop;

Oui désolé je me suis mal exprimé c’était le même message d’erreur. merci pour la documentation. Je vais creuser mais certainement devoir changer pour postgresql. Désole pour l’erreur de problème

Oui je crains qu’il ne soit pas possible de dépasser cette limite (en tout cas pas à ma connaissance, mais je n’ai jamais creusé le sujet pour tenter de la dépasser).

Si vous avez des champs textes dans vos extrafields vous pouvez tenter de baisser la taille des varchar sur la table qui par défaut est de 255
Par exemple sur une de mes tables extrafields j’en ai quelques uns

Cela devrait vous donner de la marge pour créer des extrafields supplémentaires
Ou alors comme suggéré par le message d’erreur vous pouvez changer varchar en text

une alternative est d’utiliser customtabs qui permet de créer des onglets personnalisés et de répartir dans votre cas les extrafields sur ceux-ci