Úvod
MySQL nabízí několik různých způsobů analýzy a opravy databází. Chyby a anomálie se objevují z mnoha důvodů, z nichž některé zahrnují:
- Aktualizace nebo downgrade MySQL.
- Rychlé změny v indexech nebo datech.
- Nesrovnalosti v tabulce.
Při kontrole poškozených dat a opravě tabulek závisí kroky podniknuté k opravě chyb na způsobu připojení k databázi, stavu databázového serveru, typu chyby a použitém databázovém stroji.
Tento článek ukazuje několik způsobů, jak odstraňovat problémy a opravovat databázi MySQL.
Předpoklady
- Terminál nebo příkazový řádek s právy root.
- Nainstalováno a nakonfigurováno MySQL verze 8.0.
- Poškozená databáze nebo databázová tabulka.
Jak zkontrolovat chyby v tabulce MySQL
Spuštění diagnostiky je prvním krokem k odstraňování problémů. Existují dva způsoby, jak zkontrolovat chyby v tabulce MySQL:
- Prostřednictvím
CHECK TABLE
MySQL dotaz. - Pomocí terminálového programu
mysqlcheck
.
Zkontrolujte tabulku pomocí CHECK TABLE
CHECK TABLE
dotaz funguje v MySQL, když je služba spuštěna. Obecné použití je:
CHECK TABLE <table name> [, table name, table name] [option] [option];
Nejjednodušší použití je jedna tabulka bez jakýchkoli možností:
CHECK TABLE <table name>;
Výstup CHECK TABLE
dotaz zobrazí informativní tabulku o výsledcích kontroly:
Dostupné možnosti při kontrole tabulek jsou:
FOR UPGRADE
- zjistí nekonzistence verzí. Například MySQL 8.0 nepodporuje dvouciferné roky, takže tabulka obsahující takové hodnoty je označena pro upgrade.QUICK
- nekontroluje řádky na nesprávné propojení. To je užitečné, abyste se vyhnuli časovým limitům.FAST
- provádí kontrolu tabulek, které nejsou správně uzavřeny.CHANGED
- kontroluje pouze tabulky se změnami od poslední kontroly nebo tabulky, které nebyly správně uzavřeny.MEDIUM
- zkontroluje řádky tabulky, aby ověřila platnost smazaných odkazů, a provede kontrolní součet pro řádky.EXTENDED
- zkontroluje úplnou konzistenci.
Bez možnosti CHECK TABLE
provádí MEDIUM
zkontrolujte tabulky a pohledy MyISAM. FOR UPGRADE
a QUICK
provádět kontroly tabulek a pohledů enginu InnoDB, zatímco ostatní možnosti jsou ignorovány.
Možnosti můžete také kombinovat pro podrobnější kontrolu. Chcete-li například provést rychlou kontrolu a zjistit, zda je tabulka uzavřena adekvátně, spusťte:
CHECK TABLE <table name> FAST QUICK;
Všechny možnosti, které se nevztahují na tabulky, jsou ignorovány.
Zkontrolujte tabulku pomocí mysqlcheck
mysqlcheck
příkaz je verze CHECK TABLE
pro příkazový řádek . Program běží v terminálu během provozu služby MySQL. Chcete-li provést kontrolu:
1. Jako uživatel root přejděte do adresáře, kde jsou uloženy databáze:
sudo su
cd /var/lib/mysql
2. Zkontrolujte celou databázi pomocí:
mysqlcheck <database name>
Případně zkontrolujte konkrétní tabulku v databázi zadáním názvu tabulky:
mysqlcheck <database name> <table name>
Jak opravit databázi MySQL
Existuje několik způsobů, jak opravit databázi v MySQL. Mějte však na paměti, že tyto metody nejsou rychlým řešením a mohou vést ke ztrátě dat. Pokud jsou databázové tabulky často poškozeny, identifikujte důvod výskytu.
Před provedením jakýchkoli změn a zahájením oprav vytvořte kopii adresáře:
cp -rfv /var/lib/mysql /var/lib/mysql_copy
Případně vytvořte záložní verzi databáze, než vyzkoušíte jakékoli z opravných řešení. Postupujte podle našeho průvodce:Jak zálohovat a obnovit databázi MySQL.
Níže naleznete tři možnosti, jak opravit databázi MySQL.
Oprava databáze MySQL pomocí dotazu REPAIR TABLE
Po naskenování a vyhledání databáze a tabulek s problémy je nejrychlejší způsob, jak problém vyřešit, pomocí REPAIR TABLE
dotaz:
Pokud se server během opravy vypne, spusťte znovu REPAIR TABLE
operace, když se server znovu spustí. Ujistěte se, že jste to udělali před provedením jakýchkoli dalších operací na stejném stole. Za normálních podmínek nezpůsobí tabulka MyISAM při použití této metody ztrátu dat.
Oprava databáze MySQL pomocí mysqlcheck
mysqlcheck příkaz je alternativou k opravě databázových tabulek v terminálu.
1. Nejprve přejděte do složky databáze MySQL jako uživatel root:
cd /var/lib/mysql
2. Přidejte -r
možnost mysqlcheck
příkaz k opravě databázové tabulky:
mysqlcheck -r <database> <table name>
Parametr mysqlcheck -r
příkaz je terminálová verze REPAIR TABLE
dotaz.
Oprava databáze MySQL pomocí ALTER TABLE
Použijte ALTER TABLE
dotaz k opětovnému sestavení tabulky pomocí stejného úložiště. Pokud máte například tabulku InnoDB, spusťte:
ALTER TABLE <table name> ENGINE = InnoDB;
Chcete-li znovu sestavit tabulku MyISAM, použijte:
ALTER TABLE <table name> ENGINE = MyISAM;
Pokud si nejste jisti, který modul úložiště tabulka používá, spusťte následující dotaz a zjistěte:
SHOW CREATE TABLE <table name>;
Spouštění diagnostiky a oprav specifických pro motor databáze MySQL
V závislosti na použitém databázovém stroji poskytuje MySQL specifické přístupy pro analýzu a opravu databázové tabulky.
Tabulky MyISAM jsou náchylné k poškození. Ve většině případů však lze chyby snadno opravit.
Při práci s databázemi InnoDB se poškození objeví, když se hodnoty kontrolního součtu neshodují. K chybám obvykle dochází v důsledku výpadku napájení nebo jiného hardwarového problému.
Kontrola a oprava tabulek MyISAM pomocí myisamchk
MySQL poskytuje specifickou kontrolu pro tabulky MyISAM.
1. Vypněte server MySQL. Otevřete terminál a spusťte:
systemctl mysql stop
2. Jako uživatel root přejděte do umístění databáze:
cd /var/lib/mysql/<database name>
3. Chcete-li zkontrolovat konkrétní tabulku, spusťte:
myisamchk <table name>
4. Opravte tabulku spuštěním:
myisamchk --recover <table name>
5. Restartujte server MySQL:
systemctl restart mysql
6. Nakonec po obnovení zkontrolujte tabulku v MySQL:
sudo mysql -u <user> -p <password>
USE <database name>;
SELECT * FROM <table name> LIMIT 4;
Spuštění procesu obnovy InnoDB
Dokumentace MySQL navrhuje spustit proces obnovy InnoDB pro databáze InnoDB.
1. Najděte a otevřete globální konfigurační soubor pomocí svého oblíbeného textového editoru. Pro systémy Ubuntu a Debian je umístění:
cd /etc/mysql/my.cnf
2. Přidejte následující možnost do my.cnf soubor:
[mysqld]
innodb_force_recovery=4
Ve výchozím nastavení je možnost vynucené obnovy nastavena na 0 (vypnuto) a jde až na 6. Každá nová úroveň zahrnuje funkce obnovy nižších čísel.
3. Uložte a zavřete soubor.
4. Restartujte server MySQL, abyste se ujistili, že platí nový konfigurační soubor:
systemctl restart mysql
5. V domovské složce exportujte všechny databáze do záložního souboru pomocí mysqldump
příkaz:
sudo mysqldump --all-databases --add-drop-database --add-drop-table --routines > <file name>.sql
6. Spusťte klienta MySQL a zrušte všechny dotčené databázové tabulky. Chcete-li zrušit tabulku databáze, zkuste:
DROP TABLE IF EXISTS <table name>;
Pokud tabulka neklesne, zkuste databázovou tabulku odebrat ručně. Přihlaste se jako uživatel root a přejděte do adresáře, kde jsou databáze:
sudo su
cd /var/lib/mysql/<database name>
Odeberte tabulku databáze:
rm -r <table name>
7. Zastavte server MySQL:
systemctl stop mysql
8. V souboru my.cnf zakomentujte soubor innodb_force_recovery
možnost přidaná v kroku 2 pro deaktivaci režimu obnovení. Poté soubor uložte a zavřete.
9. Znovu spusťte MySQL server:
systemctl start mysql
10. Obnovte databázi ze zálohy .sql soubor v prostředí MySQL. Přihlaste se do klienta MySQL:
sudo mysql -u <username> -p <password>
11. Spusťte následující dotaz pro import databází:
USE <database name>;
# Turning off auto commit is optional and speeds things up for larger databases
SET autocommit=0;
SOURCE <file name>.sql;
12. Nakonec otestujte databázi, abyste se ujistili, že vše funguje správně. Pokud ne, obnovte databázi ze zálohy a vyzkoušejte alternativní metodu.