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 1mysqlcheck
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.