GNU/Linux >> Znalost Linux >  >> Linux

Chyba OpenStack – velikost sloupce indexu je příliš velká. Maximální velikost sloupce je 767 bajtů [Vyřešeno]

Pokud se při synchronizaci nebo naplňování databáze služeb, jako jsou Keystone, Glance, Nova a Neutron, zobrazuje chyba, pak jsem to opravil takto. Předtím se podívejte na snímek chyby vyvolané při provádění keystone-manage db_sync a glance-manage db_sync příkazy. Stejná chyba však byla zaznamenána při provádění nova-manage db_sync a neutron-manage db_sync také. Chyba nesouvisí přímo s OpenStack, ale kvůli nepodporované znakové sadě databáze.

Řešení, které uvidíme, bude fungovat pro všechny výše uvedené příkazy.

Snímek chyby při naplňování databáze 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']

Snímek chyby při vyplňování databáze 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']

Řešení:

Skutečná chyba zde je Velikost sloupce indexu je příliš velká. Maximální velikost sloupce je 767 bajtů, což se projevilo při provádění dotazu CREATE TABLE migrate_version (repository_id VARCHAR(250) NOT NULL, repository_path TEXT, version INTEGER, PRIMARY KEY (repository_id)

Důvodem chyby je délka použitá pro sloupec nebo klíč repository_id je 250 VARCHAR a 4 bajty na znak je delší než limit povolený InnoDB, který je 767.

Nyní, abychom tento problém vyřešili, musíme pochopit, jak aplikace ukládají data do databáze pomocí znakové sady a řazení. Kódování znaků je způsob, jak zakódovat znaky tak, aby se vešly do paměti, a řazení je skupina pravidel pro porovnávání znaků ve znakové sadě. Znamená to, že musíme upravit znakovou sadu a řazení v konfiguračním souboru MySQL nebo změnit databázi tak, aby používala správnou znakovou sadu a řazení.

První věc, kterou je třeba zkontrolovat, je my.cnf zobrazíte aktuální hodnotu znakové sady a řazení.

Poznámka :Ověřování my.cnf nemusí stačit, možná budete muset zkontrolovat všechny konfigurační soubory pod conf.d nebo mariadb.conf.d složky.

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

Znaková sada utf8mb4 a řazení utf8mb4_general_ci  nestačí k udržení délky repository_id ve výše uvedeném SQL dotazu. Řešením je tedy nahradit tyto hodnoty utf8 a  utf8_general_ci respektive.

Reference.

Oprava 1:

Můžete rychle ověřit všechny konfigurační soubory mysql a nahradit character-set-server a porovnávací server hodnoty na utf8 jak je uvedeno níže a restartujte mysqld služba:

/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

Celkově je třeba provést následující kroky:

  1. Nahraďte utf8mb4 za utf8 ve všech konfiguračních souborech
  2. Znovu načtěte mysqld démon
  3. Drop databáze keystone nebo pohled nebo nova nebo neutron (u kterékoli služby se vám zobrazila chyba a nebojte se, databázi jste ještě nenaplnili a lze ji bezpečně odstranit)
  4. Vytvořte databázi keystone nebo pohled nebo nova nebo neutron
  5. Vyzkoušejte db_sync nebo naplňte databázi pomocí příkazů OpenStack. Pravděpodobně by to mělo fungovat, jinak zkuste Fix 2.

Oprava 2:

Krok 1 :Přihlaste se do MySQL

# mysql -u root -p

Krok 2 :Připojení k databázi

MariaDB [(none)]> use glance

Krok 3 :Zkontrolujte hodnotu znakové sady

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

Krok 4 :Změňte hodnotu utf8mb4 na utf8 a nastavte třídění na utf8_general_ci

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

Poznámka :Nezapomeňte odpovídajícím způsobem nahradit název databáze.

Krok 5 :Potvrďte změnu

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

Krok 6 :Zkouším db_sync databáze a mělo by to fungovat.

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

Linux
  1. Chyba OpenStack Neutron db_sync – Nelze přidat sloupec NOT NULL s výchozí hodnotou NULL [Vyřešeno]

  2. OpenStack Compute Error – Žádný záznam výpočetního uzlu pro hostitele [Vyřešeno]

  3. Chyba spouštění virtuálního počítače OpenStack – poslední výjimka:Vazba selhala pro port [Vyřešeno]

  1. Co definuje maximální velikost pro jeden příkazový argument?

  2. Získejte velikost databáze v MySQL

  3. Jak odstranit X bajtů z konce velkého souboru bez přečtení celého souboru?

  1. Jak zjistím maximální velikost zásobníku?

  2. Proč je velikost adresáře v unixu vždy 4096 bajtů?

  3. Databáze fail2ban je příliš velká (přes 500 MB). Jak to dostanu na rozumnou velikost?