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ę.
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