/ / Jak można naprawić wszystkie tabele we wszystkich bazach danych z wiersza polecenia MySQL, gdy plik MYI jest uszkodzony lub go brakuje? - mysql

W jaki sposób można naprawić wszystkie tabele we wszystkich bazach danych z wiersza polecenia MySQL, gdy plik MYI jest uszkodzony lub brakuje go? - mysql

W przypadku uszkodzenia bazy danych MySQL, jeśli brakuje pliku indeksu MYI lub jego nagłówek jest uszkodzony, nie można użyć polecenia myisamchk:

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

Musisz wykonać naprawę z wiersza poleceń MySQL za pomocą opcji use_frm:

repair tbl_name use_frm;

Za Dokumentacja MySQL na temat naprawiania tabel

Opcja USE_FRM jest dostępna do użycia, jeśli.Brak pliku indeksu MYI lub jego nagłówek jest uszkodzony. Ta opcja mówi MySQL, aby nie ufał informacjom w nagłówku pliku .MYI i nie tworzył go ponownie przy użyciu informacji z pliku .frm. Tego rodzaju naprawy nie można wykonać za pomocą myisamchk.

Za pomocą myisamchk można łatwo upuścić do każdego folderu bazy danych i naprawić każdą tabelę, używając gwiazdek na końcu polecenia:

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

Nie można zrobić nic podobnego z wiersza polecenia MySQL.

Istnieje pytanie StackOverflow z odpowiedzią, która wyjaśnia jak naprawić wszystkie tabele w ramach jednej konkretnej bazy danych z wiersza polecenia MySQL za pomocą procedury:

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ć taką procedurę, aby przeglądać wszystkie bazy danych MySQL i naprawiać każdą tabelę w tych bazach?

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

Odpowiedzi:

16 dla odpowiedzi nr 1

mysqlcheck jest wygodniejszym interfejsem wiersza poleceń do MySQL CHECK, REPAIR, ANALYZE i OPTIMIZE sprawozdania.

mysqlcheck --repair --use-frm --all-databases

1 dla odpowiedzi nr 2

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

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

Przechodzi przez wszystkie bazy danych.