Komprese databáze a defragmentace v MySQL a MariaDB

V tomto článku se budeme zabývat metodami komprese a defragmentace tabulek a databází v MySQL / MariaDB, které vám umožní ušetřit místo na disku z databáze.

Ve velkých projektech časem databáze rostou do obrovské velikosti a vždy vyvstává otázka, jak se s tím vypořádat. Tento problém lze vyřešit několika způsoby. Množství dat v samotné databázi můžete snížit odstraněním starých informací, rozdělením databáze na několik, zvětšením místa na disku na serveru nebo komprimováním tabulek.

Dalším důležitým aspektem fungování databáze je potřeba periodické defragmentace tabulek a databází, což může výrazně urychlit jejich práci.

Obsah:

  • Komprese a optimalizace databáze s typem tabulky InnoDB
  • Komprimujte tabulky MyISAM v MySQL
  • Optimalizace tabulek a databází v MySQL / MariaDB

Komprese a optimalizace databáze s typem tabulky InnoDB

Soubory Ibdata1 a ib_log

Na mnoha projektech s tabulkami Innodb je problém s obrovskými velikostmi souborů ibdata1 a ib_log. Důvodem je ve většině případů nesprávné nastavení serveru MySQL / MariaDB nebo architektura databáze. Všechny informace z tabulek Innodb uloženy v souboru ibdata1, jehož prostor není sám o sobě uvolněn. Raději ukládám data tabulky do samostatných souborů ibd *. To provedete v konfiguračním souboru my.cnf přidat řádek:

innodb_file_per_table

nebo

innodb_file_per_table = 1

Pokud je váš server již nakonfigurován a máte několik pracovních databází s tabulkami Innodb, musíte udělat následující:

  1. Vytvořte zálohu všech databází na serveru (kromě mysql a performance_schema). Základny výpisu lze odstranit pomocí následujícího příkazu: # mysqldump -u [uživatelské jméno] -p [heslo] [jméno_databáze]> [dump_file.sql]
  2. Po zálohování databáze zastavte server mysql / mariadb;
  3. Změňte nastavení v souboru my.cfg;
  4. Mazat soubory ibdata1 a ib_log Soubory
  5. Spusťte server mysql / mariadb;
  6. Obnovení všech databází ze zálohy:# mysql -u [uživatelské jméno] -p [heslo] [jméno_databáze] < [dump_file.sql]

Po dokončení tohoto postupu jsou všechny tabulky Innodb budou uloženy v samostatných souborech a souborech ibdata1 nebude růst exponenciálně.

Komprese tabulky InnoDB

Tabulky můžete komprimovat daty typu text / BLOB. Pokud máte podobné tabulky, můžete ušetřit spoustu místa na disku.

Mám databázi innodb_test s tabulkami, které by mohly být komprimovány a uvolněny místo na disku. Před každou prací důrazně doporučujeme zálohovat všechny své databáze. Připojte se k serveru mysql:

# mysql -u root -p

V konzole mysql se přihlaste do požadované databáze:

# use innodb_test;

Chcete-li zobrazit tabulky a jejich velikost, použijte dotaz:

SELECT název_tabulky AS "Tabulka",
ROUND (((datová délka + indexová délka) / 1024/1024), 2) AS „Velikost v (MB)“
FROM information_schema.TABLES
WHERE table_schema = "innodb_test"
OBJEDNÁVKA (data_length + index_length) DESC;

Kde innodb_test je název vaší databáze.

Je pravděpodobné, že některé tabulky lze komprimovat. Jako příklad vezměte tabulku b_crm_event_relations. Spusťte požadavek:

mysql> ALTER TABLE b_crm_event_relations ROW_FORMAT = COMPRESSED;

Dotaz je v pořádku, 0 ovlivněných řádků (3,27 s) Záznamy: 0 Duplikáty: 0 Varování: 0

Po spuštění můžete vidět, že v důsledku komprese se velikost tabulky snížila z 26 na 11 MB.

Díky komprimaci tabulky můžete na serveru ušetřit spoustu místa na disku. Při práci s komprimovanými tabulkami se však zatížení procesoru zvýší. Komprese tabulky by měla být použita, pokud nemáte problémy s prostředky procesoru, ale je zde problém s diskovým prostorem.

Komprimujte tabulky MyISAM v MySQL

Komprimovat formátovací tabulky Myisam, musíte použít speciální požadavek ze serverové konzole, nikoli z konzole mysql. Chcete-li komprimovat požadovanou tabulku, proveďte následující kroky:

# myisampack -b / var / lib / mysql / test / modx_session

Kde / var / lib / mysql / test / modx_session je cesta k vaší tabulce. Bohužel jsem neměl nafouklou databázi a musel jsem provádět komprimaci na malých tabulkách, ale výsledek je stále viditelný (soubor byl komprimován z 25 na 18 MB):

# du -sh modx_session.MYD

25M modx_session.MYD

# myisampack -b / var / lib / mysql / test / modx_session

Komprese /var/lib/mysql/test/modx_session.MYD: (4933 záznamů) - Výpočet statistiky - Komprimace souboru 29,84% Nezapomeňte spustit komprimovanou tabulku myisamchk -rq 

# du -sh modx_session.MYD

18M modx_session.MYD

V požadavku jsme určili přepínač -b, když je přidán, před kompresí je vytvořena záloha tabulky a označena jako OLD:

# ls -la modx_session.OLD

-rw-r ----- 1 mysql mysql 25550000 17. prosince 15:20 modx_session.OLD

# du -sh modx_session.OLD

25M modx_session.OLD

Optimalizace tabulek a databází v MySQL / MariaDB

Pro optimalizaci tabulek a databází se doporučuje provést defragmentaci. Zkontrolujte, zda v databázi nejsou tabulky, které vyžadují defragmentaci.

Pojďme vstoupit do konzole MySQL, vyberte databázi, kterou potřebujete, a spusťte dotaz:

vyberte table_name, round (data_length / 1024/1024) jako data_length_mb, round (data_free / 1024/1024) jako data_free_mb z information_schema.tables kde round (data_free / 1024/1024)> 50 řádek podle data_free_mb;

Zobrazíme tedy všechny tabulky, které mají minimálně 50 MB nevyužitého prostoru:

+-------------------------------+----------------+--------------+ | TABLE_NAME | data_length_mb | data_free_mb | + ----------------------------------- + ---------------- + -------------- + | b_disk_deleted_log_v2 | 402 | 64 | | b_crm_timeline_bind | 827 | 150 | | b_disk_object_path | 980 | 72 |

data_length_mb - celková velikost tabulky

data_free_mb - nevyužitý tabulkový prostor

Můžeme defragmentovat tyto tabulky. Předtím zkontrolujte místo na disku:

# ls -lh / var / lib / mysql / innodb_test / | grep b_

-rw-r ----- 1 mysql mysql 402M 17. prosince 15:43 b_disk_deleted_log_v2.MYD -rw-r ----- 1 mysql mysql 828M 17.prosince 14:52 b_crm_timeline_bind.MYD -r-r ----- 1 mysql mysql 981M 17. prosince 15:45 b_disk_object_path.MYD

Chcete-li tyto tabulky optimalizovat, použijte v konzole mysql následující příkaz:

# OPTIMALIZOVAT TABULKU b_disk_deleted_log_v2, b_disk_object_path, b_crm_timeline_bind;

Po úspěšné defragmentaci byste měli mít něco jako tento výstup:

+-------------------------------+----------------+--------------+ | TABLE_NAME | data_length_mb | data_free_mb | + ----------------------------------- + ---------------- + -------------- + | b_disk_deleted_log_v2 | 74 | 0 | | b_crm_timeline_bind | 115 | 0 | | b_disk_object_path | 201 | 0 |

Jak vidíte, data_free_mb je nyní 0 a celková velikost tabulky se výrazně snížila (3-4krát).

Můžete také defragmentovat pomocí obslužného programu mysqlcheck z konzoly serveru:

# mysqlcheck -o innodb_test b_workflow_file -u root -p innodb_test.b_workflow_file

Kde je vaše databáze innodb_test

A b_workflow_file je název požadované tabulky

Chcete-li optimalizovat všechny potřebné tabulky databáze, spusťte příkaz v konzole serveru:

# mysqlcheck -o innodb_test -u root -p

Kde innodb_test je název požadované databáze.

Nebo spusťte optimalizaci všech databází na serveru:

# mysqlcheck -o --all-database -u root -p

Pokud zkontrolujete velikost databáze před a po optimalizaci, velikost jako celek se snížila:

# du -sh

2,5G

# mysqlcheck -o innodb_test -u root -p

Zadejte heslo: innodb_test.b_admin_notify poznámka: Tabulka nepodporuje optimalizaci, místo toho provádí recreate + analyzovat stav: OK innodb_test.b_admin_notify_lang poznámka: Tabulka nepodporuje optimalizaci, dělá znovu + analyzovat místo stavu: OK innodb_test.b_adv_banner poznámka: Tabulka nepodporuje optimalizovat, místo toho znovu vytvářet + analyzovat stav: OK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ 

# du -sh

1,7 G

Chcete-li tedy ušetřit místo na serveru, můžete pravidelně optimalizovat a komprimovat své tabulky a databáze. Před provedením jakékoli optimalizační práce opakuji vytvoření záložní kopie databáze.