Comment puis-je changer la limite
Taille de ligne trop grande (> 8126). Changer certaines colonnes en TEXT ou BLOB ou utiliser ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
peut aider. Dans le format de ligne actuel, le BLOB
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
No
affiché?Réponses:
La question a également été posée sur serverfault .
La méthode qui a fonctionné pour l'OP là-bas était:
Ajoutez ce qui suit au
my.cnf
fichier sous la[mysqld]
section.ALTER
la table à utiliserROW_FORMAT=COMPRESSED
.Il est possible que ce qui précède ne résout toujours pas vos problèmes. Il s'agit d'un bogue connu (et vérifié) avec le moteur InnoDB , et un correctif temporaire pour l'instant est de se replier sur le moteur MyISAM comme stockage temporaire. Donc, dans votre
my.cnf
dossier:la source
innodb_file_per_table=1
pour activer cette option.J'ai récemment rencontré ce problème et je l'ai résolu d'une manière différente. Si vous utilisez la version 5.6.20 de MySQL, il existe un bogue connu dans le système. Voir la documentation MySQL
Dans ma situation, la table blob incriminée était d'environ 16 Mo. Ainsi, la façon dont j'ai résolu le problème était en ajoutant une ligne à my.cnf qui m'assurait d'avoir au moins 10 fois ce montant et plus encore:
innodb_log_file_size = 256M
la source
longblob
champ a disparu dès que j'ai augmenté leinnodb_log_file_size
paramètre. Courait également 5.6.20.Définissez les éléments suivants sur votre fichier my.cnf et redémarrez le serveur mysql.
la source
innodb_strict_mode=0
-> pas d'espaces. Sinon, le redémarrage de mariaDB 10.2 entraîne une erreur :-PSi vous pouvez changer de MOTEUR et utiliser MyISAM au lieu d'InnoDB, cela devrait aider:
ENGINE=MyISAM
Il y a deux mises en garde avec MyISAM (sans doute plus):
la source
J'aimerais partager une excellente réponse, cela pourrait être utile. Crédits Bill Karwin voir ici /dba/6598/innodb-create-table-error-row-size-too-large
Ils varient selon le format de fichier InnoDB. À l'heure actuelle, il existe 2 formats appelés Antelope et Barracuda.
Le fichier de tablespace central (ibdata1) est toujours au format Antelope. Si vous utilisez fichier par 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 de base:
Une page de 16 Ko de données InnoDB doit contenir au moins deux lignes de données. De plus, chaque page a un en-tête et un pied de page contenant les sommes de contrôle de page et le numéro de séquence du journal, etc. C'est là que vous obtenez votre limite d'un peu moins de 8 Ko par ligne.
Les types de données de taille fixe tels que INTEGER, DATE, FLOAT, CHAR sont stockés sur cette page de données principale et comptent dans la limite de taille de ligne.
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, il peut donc stocker uniquement un pointeur de 20 octets sur la page de données principale.
Les types de données de taille variable sont également précédés d'un octet ou plus pour coder la longueur. Et le format de ligne InnoDB a également un tableau de décalages de champ. Il y a donc une structure interne plus ou moins documentée dans leur wiki.
Barracuda prend également en charge un ROW_FORMAT = COMPRESSED pour gagner en efficacité de stockage pour les données de débordement.
Je dois également dire que je n'ai jamais vu un tableau bien conçu dépasser la limite de taille de ligne. C'est une forte "odeur de code" que vous violez la condition de groupes répétitifs de First Normal Form.
la source
J'ai eu le même problème, cela l'a résolu pour moi:
À partir de la documentation MYSQL :
la source
Warnings from last query: InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope
Row size too large (>8126)
my_table
ROW_FORMAT = DYNAMIC; à nouveauAprès avoir passé des heures, j'ai trouvé la solution: exécutez simplement le SQL suivant dans votre administrateur MySQL pour convertir la table en MyISAM:
la source
create table
a la même option:CREATE TABLE ... ENGINE=MyISAM ...
J'ai rencontré ce problème lorsque j'essayais de restaurer une base de données mysql sauvegardée à partir d'un serveur différent. 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:
Étape 2 ajoutez ROW_FORMAT = DYNAMIC à l'instruction de création de table dans le fichier de sauvegarde SQL pour la table à l'origine de cette erreur:
le changement important ci-dessus est ROW_FORMAT = DYNAMIC; (qui n'était pas inclus dans le fichier de sauvegarde SQL d'origine)
source qui m'a aidé à résoudre ce problème: MariaDB et InnoDB MySQL Row size too large
la source
innodb_page_size=32K
ne fonctionnait pas, car elle provoquait une erreur lors du redémarrage de MariaDB 10.2 dans mon cas. Au lieu de cela, j'ai ajouté uneinnodb_strict_mode=0
ligne, comme décrit iciinnodb_page_size
nécessite uneibdata*
recréation, ce qui est une opération destructrice. Regardez votre syslog pour plus d'informationsLes autres réponses répondent à la question posée. Je vais aborder la cause sous-jacente: une mauvaise conception du schéma.
Ne répartissez pas un tableau sur des colonnes. Ici, vous avez 3 * 10 colonnes qui doivent être transformées en 10 lignes de 3 colonnes dans un nouveau tableau (plus
id
, etc.)Votre
Main
table n'aurait queVotre table supplémentaire (
Top
) auraitIl y aurait 10 (ou moins? Ou plus?) Lignes
Top
pour chaqueid
.Cela élimine votre problème d'origine et nettoie le schéma. (Il ne s’agit pas de «normalisation», comme l’ont débattu certains commentaires.)
Ne passez pas à MyISAM; il s'en va.
Ne t'inquiète pas
ROW_FORMAT
.Vous devrez changer votre code pour faire le
JOIN
et pour gérer plusieurs lignes au lieu de plusieurs colonnes.la source
J'utilise MySQL 5.6 sur AWS RDS. J'ai mis à jour la suite dans le groupe de paramètres.
J'ai dû redémarrer l'instance de base de données pour que les changements de groupe de paramètres soient effectifs.
De plus, ROW_FORMAT = COMPRESSED n'était pas pris en charge. J'ai utilisé DYNAMIC comme ci-dessous et cela a bien fonctionné.
la source
La taille de ligne maximale pour une table InnoDB, qui s'applique aux données stockées localement dans une page de base de données, est légèrement inférieure à une demi-page pour 4 Ko, 8 Ko, 16 Ko et 32 Ko
Pour les pages de 16 Ko (par défaut), nous pouvons calculer:
Fondamentalement, vous pouvez maximiser une ligne avec:
N'oubliez pas qu'il ne débordera vers une page de débordement que si le champ est> 767 octets. S'il y a trop de champs de 767 octets, il sera interrompu (passant au-delà de max row_size). 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 faire passer innodb_page_size à 32 ko.
dans my.cnf:
Références:
la source
J'ai également rencontré le même problème. Je résous le problème en exécutant le sql suivant:
Mais, je pense que vous devriez savoir sur le stockage en rangée .
Il existe deux types de colonnes: une colonne de longueur variable (comme les types VARCHAR, VARBINARY et BLOB et TEXT) et une colonne de longueur fixe . Ils sont stockés dans différents types de pages.
et lorsque le but de la définition de ROW_FORMAT est
Voulez en savoir plus sur les formats de lignes DYNAMIQUE et COMPRIMÉ
la source
Si cela se produit sur un SELECT avec de nombreuses colonnes, la cause peut être que mysql crée une table temporaire. Si cette table est trop grande pour tenir en mémoire, elle utilisera son format de table temporaire par défaut, qui est InnoDB, pour la stocker sur le disque. Dans ce cas, les limites de taille InnoDB s'appliquent.
Vous avez alors 4 options:
changez le format de table temporaire par défaut en MYISAM, c'est ce que j'ai fait. Changement dans my.cnf:
Redémarrez mysql, la requête fonctionne.
la source
Voici un conseil simple pour toute personne intéressée:
Après la mise à niveau de Debian 9 vers Debian 10 avec 10.3.17-MariaDB, j'ai des erreurs de bases de données Joomla:
[Avertissement] InnoDB: Impossible d'ajouter un champ
field
dans la tabledatabase
.table
car après l'ajout, la taille de ligne est 8742, ce qui est supérieur à la taille maximale autorisée (8126) pour un enregistrement sur la page feuille d'index.Juste au cas où, j'ai mis innodb_default_row_format = DYNAMIC dans /etc/mysql/mariadb.conf.d/50-server.cnf (c'était quand même par défaut)
Ensuite, j'ai utilisé phpmyadmin pour exécuter "Optimiser la table" pour toutes les tables de la base de données Joomla. Je pense que la récréation de table effectuée par phpmyadmin dans le processus a aidé. Si phpmyadmin est installé, ce n'est que quelques clics à faire.
la source