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 :
- Remplacer utf8mb4 par utf8 dans tous les fichiers de configuration
- Recharger mysqld démon
- 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é)
- Créer une base de données clé de voûte ou regard ou nova ou neutron
- 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