GNU/Linux >> Tutoriels Linux >  >> Linux

Erreur OpenStack - Taille de colonne d'index trop grande. La taille de colonne maximale est de 767 octets [Résolu]

Si vous rencontrez une erreur lors de la synchronisation ou du remplissage de la base de données de services tels que Keystone, Glance, Nova et Neutron, voici ce que j'ai fait pour y remédier. Avant cela, jetez un œil à l'instantané de l'erreur générée lors de l'exécution de keystone-manage db_sync et glance-manage db_sync commandes. Cependant, la même erreur s'est produite lors de l'exécution de nova-manage db_sync et neutron-manage db_sync aussi bien. L'erreur n'est pas directement liée à OpenStack, mais est due au jeu de caractères de base de données non pris en charge.

La solution que nous allons voir fonctionnera pour toutes les commandes ci-dessus.

Instantané de l'erreur lors du remplissage de la base de données Keystone :

# su -s /bin/sh -c "keystone-manage db_sync" keystone
 ERROR keystone DBError: (pymysql.err.InternalError) (1709, u'Index column size too large. The maximum column size is 767 bytes.') [SQL: u'\nCREATE TABLE migrate_version (\n\trepository_id VARCHAR(250) NOT NULL, \n\trepository_path TEXT, \n\tversion INTEGER, \n\tPRIMARY KEY (repository_id)\n)\n\n']

Instantané de l'erreur lors du remplissage de la base de données Glance :

# su -s /bin/sh -c "glance-manage db_sync" glance
 ERROR glance DBError: (pymysql.err.InternalError) (1709, u'Index column size too large. The maximum column size is 767 bytes.') [SQL: u'\nCREATE TABLE migrate_version (\n\trepository_id VARCHAR(250) NOT NULL, \n\trepository_path TEXT, \n\tversion INTEGER, \n\tPRIMARY KEY (repository_id)\n)\n\n']

Solution :

L'erreur réelle ici est Taille de la colonne d'index trop grande. La taille de colonne maximale est de 767 octets, qui a résulté lors de l'exécution de la requête CREATE TABLE migrate_version (repository_id VARCHAR(250) NOT NULL, repository_path TEXT, version INTEGER, PRIMARY KEY (repository_id)

La raison de l'erreur est la longueur utilisée pour la colonne ou la clé repository_id est 250 VARCHAR et 4 octets par caractère le rend plus long que la limite autorisée par InnoDB, qui est de 767.

Maintenant, pour résoudre ce problème, nous devons comprendre comment les applications stockent les données dans la base de données à l'aide du jeu de caractères et de la collation. Un encodage de caractères est un moyen d'encoder des caractères afin qu'ils tiennent dans la mémoire et le classement est un groupe de règles permettant de comparer des caractères dans un jeu de caractères. Cela signifie que nous devons ajuster le jeu de caractères et le classement dans le fichier de configuration MySQL ou modifier la base de données pour utiliser le jeu de caractères et le classement corrects.

La première chose à vérifier est mon.cnf pour voir la valeur actuelle du jeu de caractères et du classement.

Remarque  :Vérification de mon.cnf peut ne pas suffire, vous devrez peut-être vérifier tous les fichiers de configuration sous conf.d ou mariadb.conf.d dossiers.

character-set-server = utf8mb4
 collation-server = utf8mb4_general_ci

Le jeu de caractères utf8mb4 et le classement utf8mb4_general_ci  n'est pas suffisant pour contenir la longueur de repository_id dans la requête SQL ci-dessus. La solution consiste donc à remplacer ces valeurs par utf8 et  utf8_general_ci respectivement.

Référence.

Correction 1 :

Vous pouvez rapidement vérifier tous les fichiers de configuration de mysql et remplacer character-set-server et collation-server valeurs en utf8 comme indiqué ci-dessous et redémarrez mysqld service :

/etc/mysql# grep -lr "utf8mb4" *
 conf.d/openstack.cnf
 conf.d/mysql.cnf
 mariadb.conf.d/50-mysql-clients.cnf
 mariadb.conf.d/50-server.cnf
 mariadb.conf.d/50-client.cnf
# grep utf8 conf.d/mysql.cnf
character-set-server = utf8
collation-server = utf8_general_ci

Dans l'ensemble, vous devez effectuer les étapes ci-dessous :

  1. Remplacer utf8mb4 par utf8 dans tous les fichiers de configuration
  2. Recharger mysqld démon
  3. Drop base de données clé de voûte ou regard ou nova ou neutron (quel que soit le service pour lequel vous obteniez une erreur et ne vous inquiétez pas, vous n'avez pas encore rempli la base de données et vous pouvez la supprimer en toute sécurité)
  4. Créer une base de données clé de voûte ou regard ou nova ou neutron
  5. Essayez db_sync ou remplissez la base de données à l'aide des commandes OpenStack. Cela devrait probablement fonctionner, sinon essayez le correctif 2.

Correction 2 :

Étape 1 :Connectez-vous à MySQL

# mysql -u root -p

Étape 2 :Se connecter à la base de données

MariaDB [(none)]> use glance

Étape 3 :Vérifiez la valeur du jeu de caractères

MariaDB > select @@character_set_database;
 +--------------------------+
 | @@character_set_database |
 +--------------------------+
 | utf8mb4 |
 +--------------------------+
 1 row in set (0.00 sec)

Étape 4 :Modifiez la valeur utf8mb4 en utf8 et définissez l'assemblage sur utf8_general_ci

MariaDB > ALTER DATABASE glance CHARACTER SET utf8 COLLATE utf8_general_ci;
 Query OK, 1 row affected (0.00 sec)

Remarque :N'oubliez pas de remplacer le nom de la base de données en conséquence.

Étape 5 :Confirmer le changement

MariaDB> select @@character_set_database;
 +--------------------------+
 | @@character_set_database |
 +--------------------------+
 | utf8 |
 +--------------------------+

Étape 6 :Essayer db_sync la base de données et cela devrait fonctionner.

 su -s /bin/sh -c "glance-manage db_sync" glance

Linux
  1. Comment réparer l'erreur OpenStack - Échec de la suppression du réseau ? [Résolu]

  2. Comment réparer l'erreur Metasploit - nécessite l'installation du gem bundler ? [Résolu]

  3. Erreur OpenCA Impossible de charger le certificat à partir de la base de données

  4. Qu'est-ce qui définit la taille maximale d'un seul argument de commande ?

  5. Quelle est la taille maximale d'une valeur de variable d'environnement Linux ?

Correction de l'erreur Nginx :413 Entité de requête trop grande

Pourquoi Ls et Hexdump ne sont-ils pas d'accord sur la taille du fichier ?

Comment dépanner l'erreur :Cpanel::Exception::Database::Error/(XID 9a8sak) ?

Obtenir la taille de la base de données dans MySQL

Puis-je supposer que la taille de long int est toujours de 4 octets?

Pourquoi la taille d'un répertoire est-elle toujours de 4096 octets sous Unix ?