Dans Debian Jessie, j'ai installé le serveur MariaDB 10.0.30 et j'essaie d'augmenter la longueur de clé maximale. AFAIU cela dépend du paramètre de configuration innodb_large_prefix
en cours d'activation. Selon le docs , il nécessite également le format de fichier barracuda
et innodb_file_per_table
. Après les avoir configurés dans la configuration et redémarré le serveur, je vois dans le client que ces paramètres sont correctement définis:
> SHOW GLOBAL VARIABLES LIKE 'innodb_large%';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| innodb_large_prefix | ON |
+---------------------+-------+
1 row in set (0.00 sec)
> SHOW GLOBAL VARIABLES LIKE 'innodb_file%';
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| innodb_file_format | Barracuda |
| innodb_file_format_check | OFF |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | ON |
+--------------------------+-----------+
4 rows in set (0.00 sec)
> SHOW GLOBAL VARIABLES LIKE 'innodb_page%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)
Je ne suis pas sûr pourquoi innodb_file_format_max
est défini Antelope
, mais tandis que innodb_file_format_check
est désactivé, cela ne devrait pas avoir d'importance. En fait, même si je l'avais également défini Barracuda
, cela n'a pas fait de différence.
Si j'essaie maintenant de créer une table avec un grand index comme:
CREATE TABLE `some_table` (
`some_tableID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`column` varchar(750) COLLATE utf8mb4_estonian_ci NOT NULL DEFAULT '',
PRIMARY KEY (`some_tableID`),
KEY `column` (`column`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_estonian_ci;
Je reçois une erreur:
ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
Sur Ubuntu 16.04 avec le serveur mysql 5.7.17, tous les paramètres sont identiques (par défaut) et il n'y a pas de problème avec un grand index (pour utf8mb4, c'est 750 * 4 = 3000).
Quel est le problème avec ma configuration MariaDB?
Cela nécessite plus que ces deux paramètres ...
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
SET GLOBAL innodb_large_prefix=1;
logout & login (to get the global values);
ALTER TABLE tbl ROW_FORMAT=DYNAMIC; -- or COMPRESSED
Il vous suffit peut-être d'ajouter ROW_FORMAT=...
à ton CREATE TABLE
.
Ces instructions sont nécessaires pour les versions 5.6.3 à 5.7.7. À partir de 5.7.7, le système prend par défaut correctement pour gérer des champs plus importants.
Alternativement, vous pouvez utiliser un index "préfixe":
INDEX(column(191))
(Mais l'indexation des préfixes présente de nombreux défauts.)
"Si le serveur crée ultérieurement un format de table supérieur, innodb_file_format_max est défini sur cette valeur" implique que ce paramètre n'est pas un problème.
innodb_large_prefix
ne s'applique qu'aux formats de ligne COMPRESSED
et DYNAMIC
.
MariaDB 10.0 et 10.1 ont InnoDB 5.6, qui crée par défaut des tables avec ROW_FORMAT=Compact
(même si innodb_file_format
est défini sur Barracuda
). Ainsi, pour utiliser de grands préfixes, vous devez spécifier explicitement le format de ligne. Il en va de même pour MySQL 5.6.
InnoDB 5.7 crée par défaut la table avec ROW_FORMAT=DYNAMIC
, c'est pourquoi le même CREATE
s'appuyant sur innodb_large_prefix
fonctionne dans MySQL 5.7 et MariaDB 10.2 sans aucune clause supplémentaire.
Je pense que la solution est répondue ici pour la session, mais si vous redémarrez MySQL, je ne pense pas que ces paramètres fonctionneront.
Pour la solution permanente, vous devez entrer le code suivant dans votre fichier My.Ini-
## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'
J'espère que cela aide à réduire les retouches et les rayures sur la tête :)
Après les étapes fournies par @Rick:
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
SET GLOBAL innodb_large_prefix=1;
-- logout & login (to get the global values);
J'ai changé la dernière étape en
SET GLOBAL innodb_default_row_format=DYNAMIC;
Jusqu'ici tout va bien.