GNU/Linux >> LINUX-Kenntnisse >  >> Linux

OpenStack-Fehler – Indexspaltengröße zu groß. Die maximale Spaltengröße beträgt 767 Bytes [Gelöst]

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:

  1. utf8mb4 durch utf8 ersetzen in allen Konfigurationsdateien
  2. Laden Sie mysqld neu Dämon
  3. 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)
  4. Datenbank erstellen Schlüsselstein oder Blick oder Nova oder Neutron
  5. 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

Linux
  1. Wie behebt man den Metasploit-Fehler – erfordert die Installation des Bundler-Gems? [Gelöst]

  2. OpenCA-Fehler Zertifikat kann nicht aus der Datenbank geladen werden

  3. Was definiert die maximale Größe für ein einzelnes Befehlsargument?

  4. Der maximale Wert der Prozess-ID?

  5. Wie kann man den Fehler beheben:Cpanel::Exception::Database::Error/(XID 9a8sak)?

Behebung des Nginx-Fehlers:413 Request Entity Too Large

Warum stimmen Ls und Hexdump nicht über die Dateigröße überein?

Wie groß darf der Wert einer Linux-Umgebungsvariablen maximal sein?

Wie entferne ich X Bytes vom Ende einer großen Datei, ohne die gesamte Datei zu lesen?

Wie finde ich die maximale Stapelgröße?

Kann ich davon ausgehen, dass die Größe von long int immer 4 Bytes beträgt?