Je viens de passer à partir de MySQL 5.6 à 5.7 et j'ai eu la mauvaise surprise de découvrir que A WordPress contient des champs 438 ridicules et dépasse la limite de taille de la ligne de 8126 octets.
Voici l'avertissement que j'ai eu lors de la course mysql_upgrade
:
Taille de la rangée trop grande (> 8126). Changer certaines colonnes en texte ou blob ou en utilisant Row_Format = Dynamic ou Row_Format = compressé peut aider. Dans le format de ligne actuel, le préfixe BLOB de 768 octets est stocké en ligne.
C'était juste un avertissement cependant, et la table est toujours là. Je ne peux pas créer une nouvelle table avec la même structure , mais assez intéressante, Je peux garder l'ancienne table et utilisez-le (au moins, SELECT
de celui-ci).
J'ai lu Rolandomysqldba's et Bill Karwin's réponses sur des sujets similaires et aucune solution ne peut m'aider:
ROW_FORMAT=DYNAMIC
ne suffit pas, car la table est pleine d'inline UTF-8 VARCHAR
champs qui seules dépassent la taille maximaleJ'ai signalé l'erreur des développeurs du plugin et j'espère qu'ils répareront la table bientôt, mais entre-temps, je suis coincé avec cette table hors al.
Les questions sont donc:
J'ai mis à jour de MySQL 5.6. J'ai essayé DYNAMIC
et COMPRESSED
formats, mais pas de chance. J'ai calculé la taille des champs entier + Varchar, ils totalisent 17 059 octets. Je n'ai donc aucune chance de réussir de cette façon.
Le plugin est appelé Galerie de photos et la table défectueuse est wp_bwg_theme
.
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
ALTER TABLE tbl ROW_FORMAT=DYNAMIC; -- Or COMPRESSED
C'est ce qui était nécessaire en 5.6, je pense. Depuis Barracuda et File_Per_Table sont des valeurs par défaut de 5,7, la plupart de cela s'en vont. Cependant, la mise à niveau peut avoir laissé la table antilope et/ou non file_per_table.
Donc, je recommande de lancer ces 3 commandes et de voir si elle "corrige" votre problème pour le bien. (Ouais, gardez une sorte de sauvegarde quelque part d'abord.)
Vous avez mentionné UTF8; Peut-être que vous voulez utf8mb4 aussi?
ALTER TABLE tbl CONVERT TO utf8mb4;
(Je ne sais pas maintenant si la réplication sera un problème. Vraisemblablement après les modifications ci-dessus, ce ne sera pas un problème sur un esclave 5.7.)
modifier
Mais ... étant la valeur par défaut (pour 5,7) non signifie que vous avez ces valeurs pour un existant fichier après une mise à niveau.
Regarder dans information_schema.INNODB_SYS_TABLES
Pour voir ce que le file_format
et row_format
sommes. La colonne space
indique File_Per_Table si la valeur est> 0.
Un moyen drastique de faire face au problème: Changez la taille de la page InnoDB. La valeur par défaut est de 16 kb, mais 32kb est possible. Si je ne me trompe pas, Tous Tables sur le système doivent être converties à la nouvelle taille de la page, il s'agit donc d'une entreprise non triviale et peut avoir d'autres ramifications.
la manipulation de VARCHAR
in DYNAMIC
/COMPRESSED
Quand la chaîne est-elle stockée dans la partie principale de l'enregistrement, versus stockée dans un autre bloc?
"Enregistrez trop gros": lorsque la ligne est trop longue, les colonnes les plus longues sont stockées dans le stockage hors page. C'est-à-dire, parfois une colonne sera entièrement hors page, parfois à la page, en fonction du maquillage de la ligne entière.
VARCHAR
et TEXT
et BLOB
sont traités les mêmes pour DYNAMIC
ou COMPRESSED
.
Le format DYNAMIC
est basé sur l'idée que si une partie d'une valeur de données longue est stockée hors page, il est généralement plus efficace de stocker toute la valeur hors page ("tout ou aucune").
COMPRESSED
= DYNAMIC
+ compression. KEY_BLOCK_SIZE
contrôle la quantité de données de colonnes stockées dans l'indice en cluster et la quantité de pages de débordement.
5.7 référence et plus vieux, plus détaillé, discussion ; et d'autres pages.
Après avoir lu Rick James 'réponse (+1 pour lui) , la seule chose que j'ajouterais pour celui-ci est juste de configurer un plus grand piscine de tampon InnoDb si vous allez avec ROW_FORMAT=COMPRESSED
. Pourquoi ?
J'avais mentionné dans mon ancien post innodb_file_format barracuda Comment augmenter la taille du pool tampon pour accueillir la décompression des pages que vous accédez.
Plagiaire de mon propre post ...
key_block_size=8
8
est 50.00%
de 16
50.00%
de 8G
est 4G
innodb_buffer_pool_size
à 12G
(8G
+ 4G
)key_block_size=4
4
est 25.00%
de 16
25.00%
de 8G
est 2G
innodb_buffer_pool_size
à 10G
(8G
+ 2G
)key_block_size=2
2
est 12.50%
de 16
12.50%
de 8G
est 1G
innodb_buffer_pool_size
à 9G
(8G
+ 1G
)key_block_size=1
1
est 06.25%
de 16
06.25%
de 8G
est 0.5G
(512M
)innodb_buffer_pool_size
à 8704M
(8G
(8192M
) + 512M
)Morale de l'histoire : Le pool de tampons Innodb a besoin d'une salle de respiration supplémentaire lors de la manipulation de données et de pages d'index compressées.