Wenn beim Synchronisieren oder Füllen der Datenbank von Diensten wie Keystone, Glance, Nova und Neutron ein Fehler auftritt, habe ich Folgendes getan, um ihn zu beheben. Sehen Sie sich vorher den Schnappschuss des Fehlers an, der beim Ausführen von keystone-manage db_sync ausgegeben wird und glance-manage db_sync Befehle. Derselbe Fehler wurde jedoch beim Ausführen von nova-manage db_sync angezeigt und neutron-manage db_sync auch. Der Fehler hängt nicht direkt mit OpenStack zusammen, sondern ist auf den nicht unterstützten Zeichensatz der Datenbank zurückzuführen.
Die Lösung, die wir sehen werden, funktioniert für alle oben genannten Befehle.
Momentaufnahme des Fehlers beim Füllen der Keystone-Datenbank:
# 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']
Momentaufnahme des Fehlers beim Füllen der Glance-Datenbank:
# 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']
Lösung:
Der eigentliche Fehler hier ist Indexspaltengröße zu groß. Die maximale Spaltengröße beträgt 767 Byte, was beim Ausführen von query CREATE TABLE migration_version (repository_id VARCHAR(250) NOT NULL, repository_path TEXT, version INTEGER, PRIMARY KEY (repository_id) resultierte
Der Grund für den Fehler ist die Länge, die für die Spalte oder den Schlüssel repository_id verwendet wird ist 250 VARCHAR und 4 Bytes pro Zeichen machen es länger als das von InnoDB erlaubte Limit, das 767 ist.
Um dieses Problem zu beheben, müssen wir nun verstehen, wie Anwendungen Daten mithilfe von Zeichensatz und Sortierung in der Datenbank speichern. Eine Zeichencodierung ist eine Möglichkeit, Zeichen so zu codieren, dass sie in den Speicher passen, und die Sortierung ist eine Gruppe von Regeln zum Vergleichen von Zeichen in einem Zeichensatz. Das bedeutet, dass wir den Zeichensatz und die Sortierung in der MySQL-Konfigurationsdatei anpassen oder die Datenbank ändern müssen, um den richtigen Zeichensatz und die richtige Sortierung zu verwenden.
Das erste, was zu überprüfen ist, ist my.cnf um den aktuellen Wert von Zeichensatz und Sortierung zu sehen.
Hinweis :Überprüfung von my.cnf möglicherweise nicht ausreicht, müssen Sie möglicherweise alle Konfigurationsdateien unter conf.d überprüfen oder mariadb.conf.d Ordner.
character-set-server = utf8mb4 collation-server = utf8mb4_general_ci
Der Zeichensatz utf8mb4 und die Sortierung utf8mb4_general_ci reicht nicht aus, um die Länge von repository_id in der obigen SQL-Abfrage aufzunehmen. Die Lösung besteht also darin, diese Werte durch utf8 zu ersetzen und utf8_general_ci bzw..
Referenz.
Lösung 1:
Sie können schnell alle Konfigurationsdateien von mysql überprüfen und Zeichensatz-Server ersetzen und collation-server Werte auf utf8 wie unten gezeigt und starten Sie mysqld neu Dienst:
/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
Insgesamt müssen Sie die folgenden Schritte ausführen:
- utf8mb4 durch utf8 ersetzen in allen Konfigurationsdateien
- Laden Sie mysqld neu Dämon
- Drop-Datenbank Schlüsselstein oder Blick oder Nova oder Neutron (Für welchen Dienst Sie auch immer einen Fehler erhalten haben und keine Sorge, Sie haben die Datenbank noch nicht gefüllt und können sie sicher entfernen)
- Datenbank erstellen Schlüsselstein oder Blick oder Nova oder Neutron
- Versuchen Sie db_sync oder füllen Sie die Datenbank mit OpenStack-Befehlen. Es sollte wahrscheinlich funktionieren, ansonsten versuchen Sie Fix 2.
Lösung 2:
Schritt 1 :Bei MySQL anmelden
# mysql -u root -p
Schritt 2 :Mit Datenbank verbinden
MariaDB [(none)]> use glance
Schritt 3 :Überprüfen Sie den Zeichensatzwert
MariaDB > select @@character_set_database; +--------------------------+ | @@character_set_database | +--------------------------+ | utf8mb4 | +--------------------------+ 1 row in set (0.00 sec)
Schritt 4 :Ändern Sie den Wert utf8mb4 in utf8 und setzen Sie collate auf utf8_general_ci
MariaDB > ALTER DATABASE glance CHARACTER SET utf8 COLLATE utf8_general_ci; Query OK, 1 row affected (0.00 sec)
Hinweis :Denken Sie daran, den Datenbanknamen entsprechend zu ersetzen.
Schritt 5 :Änderung bestätigen
MariaDB> select @@character_set_database; +--------------------------+ | @@character_set_database | +--------------------------+ | utf8 | +--------------------------+
Schritt 6 :Versucht db_sync die Datenbank und es sollte funktionieren.
su -s /bin/sh -c "glance-manage db_sync" glance