124 votes

Modification de la limite pour "Mysql Row size too large".

Comment puis-je modifier la limite

La taille de la rangée est trop grande (> 8126). Changer certaines colonnes en TEXTE ou BLOB ou utiliser ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED peut aider. Dans le format actuel des lignes, BLOB Le préfixe de 768 octets est stocké en ligne.

Table :

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

13voto

Aman Chhabra Points 597

Je voudrais partager une réponse géniale, elle pourrait être utile. Crédits Bill Karwin voir ici https://dba.stackexchange.com/questions/6598/innodb-create-table-error-row-size-too-large

Ils varient selon le format de fichier InnoDB. 2 formats existent actuellement, Antelope et Barracuda.

Le fichier du tablespace central (ibdata1) est toujours au format Antilope. Si vous utilisez file-per-table, vous pouvez faire en sorte que les fichiers individuels utilisent le format Barracuda en définissant innodb_file_format=Barracuda dans my.cnf.

Points essentiels :

  1. Une page de 16 Ko de données InnoDB doit contenir au moins deux rangées de données. De plus, chaque page comporte un en-tête et un pied de page contenant les sommes de contrôle des pages, le numéro de séquence du journal, etc. C'est de là que vient la limite d'un peu moins de 8 Ko par ligne.

  2. Les types de données à taille fixe tels que INTEGER, DATE, FLOAT, CHAR sont stockés sur cette page de données primaires et comptent dans la limite de taille de ligne.

  3. Les types de données de taille variable tels que VARCHAR, TEXT, BLOB sont stockés sur des pages de débordement, de sorte qu'ils ne comptent pas entièrement dans la limite de taille de ligne. Dans Antelope, jusqu'à 768 octets de ces colonnes sont stockés sur la page de données principale en plus d'être stockés sur la page de débordement. Barracuda prend en charge un format de ligne dynamique et ne peut donc stocker qu'un pointeur de 20 octets sur la page de données principale.

  4. Les types de données de taille variable sont également préfixés d'un ou plusieurs octets pour coder la longueur. Et le format de ligne InnoDB possède également un tableau de décalages de champs. Il y a donc une structure interne plus ou moins documentée dans leur wiki.

Barracuda supporte également un ROW_FORMAT=COMPRESSED pour gagner en efficacité de stockage pour les données de débordement.

Je dois également faire remarquer que je n'ai jamais vu un tableau bien conçu dépasser la limite de taille des lignes. C'est une forte "odeur de code" que vous violez la condition de groupes répétitifs de la première forme normale.

7voto

Iftikhar Khan Points 39

Après avoir passé des heures, j'ai trouvé la solution : il suffit d'exécuter le SQL suivant dans votre administration MySQL pour convertir la table en MyISAM :

USE db_name;
ALTER TABLE table_name ENGINE=MYISAM;

5voto

U0001 Points 525

La taille maximale des lignes d'une table InnoDB, qui s'applique aux données stockées localement dans une page de base de données, est la suivante un peu moins d'une demi-page pour 4KB, 8KB, 16KB, et 32KB

Pour des pages de 16kb (par défaut), nous pouvons calculer :

Slightly less than half a page 8126 / Number of bytes to threshold for overflow 767 = 10.59 fields of 767 bytes maximum

En gros, vous pourriez maximiser une rangée avec :

  • 11 champs varchar > 767 caractères (latin1 = 1 octet par caractère) ou
  • 11 champs varchar > 255 caractères (utf-8 sur mysql = 3 octets par caractère).

N'oubliez pas qu'il ne débordera sur une page de débordement que si le champ est > 767 octets. S'il y a trop de champs de 767 octets, il se plantera (en dépassant le max row_size). Ce n'est pas habituel avec latin1 mais très possible avec utf-8 si les développeurs ne font pas attention.

Dans ce cas, je pense que vous pourriez éventuellement augmenter la taille de la page innodb_page_size à 32kb.

dans mon.cnf :

innodb_page_size=32K

Références :

3voto

matyas Points 25

J'ai rencontré ce problème lorsque j'ai essayé de restaurer une base de données mysql sauvegardée à partir d'un autre serveur. Ce qui a résolu ce problème pour moi a été d'ajouter certains paramètres à my.conf (comme dans les questions ci-dessus) et de modifier en plus le fichier de sauvegarde sql :

Étape 1 : ajoutez ou modifiez les lignes suivantes dans my.conf :

innodb_page_size=32K
innodb_file_format=Barracuda
innodb_file_per_table=1

Étape 2 ajoutez ROW_FORMAT=DYNAMIC à l'instruction de création de table dans le fichier de sauvegarde sql pour la table qui cause cette erreur :

DROP TABLE IF EXISTS `problematic_table`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `problematic_table` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
  ...
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 ROW_FORMAT=DYNAMIC;

le changement important ci-dessus est ROW_FORMAT=DYNAMIQUE ; (qui n'était pas inclus dans le fichier de sauvegarde sql original)

source qui m'a aidé à résoudre ce problème : Taille des rangées MySQL MariaDB et InnoDB trop importante

3voto

Soubhagya Kumar Points 282

Vous devez apporter quelques modifications au my.ini fichier

Ajoutez ceci sous [mysqld].

innodb_strict_mode=0

Mise à jour de ces deux lignes

innodb_log_file_size=256M
innodb_log_buffer_size=256M

innodb_strict_mode : Lorsqu'elle est activée, certains avertissements InnoDB deviennent des erreurs à la place.

Référence : https://mariadb.com/kb/en/innodb-strict-mode/

innodb_log_file_size & innodb_log_buffer_size doit augmenter en taille.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X