Přeskočit obsah

Velký soubor ibdata1

V MySQL při používání postupně narůstá velikost souboru ibdata1. MySQL, i všechny forky jako MariaDB nebo Percona, si s sebou nesou historickou chybu, která je zareportovaná již více než 15 let (MySQL bug 1341) a dosud nebyla vyřešena - pokud se do ibdata souboru nahraje nějaká informace a následně se prostor uvolní, neexistuje způsob jak soubor následně zmenšit. Jediným řešením takové situace je dump všech dat, inicializace nového úložiště a import dat zpět. To je především u větších databází časově velmi náročná operace, která pochopitelně znamená odstávku služeb.

Soubor ibdata1 historicky obsahoval vše, co mělo souvislost s InnoDb tabulkami - tedy data, indexy, undo logy apod. Díky zmíněnému bugu, vznikaly postupně možnosti, jak některá data umisťovat jinam.

Řešení

Asi nejpoužívanější je direktiva innodb_file_per_table, která umístí data i s indexy do samostatných souborů. Tuto změnu je možné provést i nad existujícím úložištěm dat a data přesunout do samostatných souborů. Nicméně uvolněné místo v souboru ibdata1 se pouze uvolní pro jiné potřeby a disková alokace se nezmění.

Na první pohled by po odsunu dat měl být problém vyřešen, nicméně nemusí. Pokud taková situace nastane, je třeba provést analýzu souboru ibdata1 například nástrojem innochecksum nebo innodb_space. Tím je možné zjistit jaká data v souboru jsou. Nejčastějším důvodem pro narůstání souboru je UNDO_LOG. Je to aktuálně také jediný typ dat, který je možné přesunout ze souboru ibdata1 UNDO_LOG se používá při práci s transakcemi (obsahuje data, díky kterým je možné transakci rollbacknout). Pokud se v aplikaci vyvarujete dělání velkých transakcí, problému se vyvarujete. Pomocí direktiv innodb_undo_tablespaces a innodb_undo_directory se vytvoří samostatné úložiště pro UNDO_LOGy, problém se přesune do těchto souborů. Direktivou innodb_undo_log_truncate je pak možné zajistit jejich čištění. Tato rekonfigurace není možná nad existujícím úložištěm dat, je tedy nutné provést dump všech dat, inicializace nového úložiště s novou konfigurací a následný import všech dat.