2011-08-16 11 views
11

Gdy mamy do czynienia z bazy danych MySQL korupcji, jeśli plik indeksu MYI brakuje lub jeżeli jego nagłówek jest uszkodzony nie można użyć polecenia myisamchk:Jak naprawić wszystkie tabele we wszystkich bazach danych z wiersza polecenia MySQL, gdy plik MYI jest uszkodzony lub brakuje go?

myisamchk --safe-recover --force --sort_buffer_size=2G --key_buffer_size=2G /var/lib/mysql/*/*.MYI 

Trzeba zrobić naprawę z wiersza poleceń z MySQL opcja use_frm:

repair tbl_name use_frm; 

Per MySQL documentation's on repairing tables

USE_FRM opcja jest dostępna do wykorzystania, jeżeli plik indeksu .myi jest missin g lub jeśli jego nagłówek jest uszkodzony. Ta opcja powoduje, że MySQL nie ma zaufania do informacji zawartych w nagłówku pliku .MYI i do ponownego utworzenia go przy użyciu informacji z pliku .frm. Tego rodzaju naprawy nie można wykonać za pomocą myisamchk.

Z myisamchk, można łatwo wpaść do każdego folderu bazy i naprawić każdy stół za pomocą gwiazdki na końcu polecenia:

/var/lib/mysql/*/*.MYI 

Nie można coś podobnego z wiersza poleceń MySQL zrobić.

Jest kwestią StackOverflow z odpowiedzią, która wyjaśnia how to repair all tables within one specific database from the MySQL command prompt with a procedure:

CREATE DEFINER = 'root'@'localhost' 
PROCEDURE MYDATABASE.repair_all() 
BEGIN 
    DECLARE endloop INT DEFAULT 0; 
    DECLARE tableName char(100); 
    DECLARE rCursor CURSOR FOR SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA`=DATABASE(); 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET endloop=1; 

    OPEN rCursor; 
    FETCH rCursor INTO tableName; 

    WHILE endloop = 0 DO 
    SET @sql = CONCAT("REPAIR TABLE `", tableName, "`"); 
    PREPARE statement FROM @sql; 
    EXECUTE statement; 

    FETCH rCursor INTO tableName; 
    END WHILE; 

    CLOSE rCursor; 
END 

Czy można zmodyfikować procedurę tak pętli wszystkich baz danych MySQL i naprawić każdy stół w tych bazach danych?

Myślę, że może to być przydatne dla każdego, kto ma dużą liczbę baz danych i popada w poważną korupcję.

+0

Czy Twój złośliwy komentarz był naprawdę potrzebny? Znajduję się w sytuacji, w której nie jest możliwe w najbliższej przyszłości przejście na InnoDB. – Drew

Odpowiedz

16

mysqlcheck jest bardziej wygodny interfejs wiersza poleceń do MySQL CHECK, REPAIR, ANALYZE i OPTIMIZE wypowiedzi.

mysqlcheck --repair --use-frm --all-databases 
+0

Podobnie jak myisamchk, mysqlcheck nie działa, jeśli brakuje pliku indeksu .MYI lub jego nagłówek jest uszkodzony. Można ** tylko ** zrobić z wiersza poleceń MySQL. – Drew

+1

Nie testowałem tego samodzielnie, ale istnienie opcji '-use-frm' wydaje się nie zgadzać. Głównie 'mysqlcheck' jest dokładnie równoznaczne z ręcznym uruchomieniem instrukcji. –

+0

Masz rację! MySQL powinien prawdopodobnie zaktualizować swoją dokumentację do REPAIR TABLE, aby dać znać, że mysqlcheck może być również użyty. Dzięki za trwanie w mówieniu mi, że się mylę! "mysqlcheck działa podobnie do myisamchk, ale działa inaczej. ** Główną różnicą operacyjną jest to, że mysqlcheck musi być używany, gdy serwer mysqld działa **, podczas gdy myisamchk powinno być używane, gdy nie jest. Korzyścią z używania mysqlcheck jest że nie musisz zatrzymywać serwera, aby wykonywać konserwację tabeli. " Dziękuję Ci! – Drew

1

Oto moje rozwiązanie, gdy musiałem naprawić wszystkie pliki MyISAM w moim DB:

find ./ -name "*.MYI" -exec myisamchk -r {} \; 

przemierza wszystkich baz danych.

Powiązane problemy