Odpowiedzi:
z linii poleceń możesz użyć:
mysqlcheck -A --auto-repair
Polecenie jest takie:
mysqlcheck -u root -p --auto-repair --check --all-databases
Na żądanie musisz podać hasło,
lub możesz uruchomić ten, ale nie jest to zalecane, ponieważ hasło jest zapisane zwykłym tekstem:
mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
Użyj następującego zapytania, aby wydrukować REPAIR
instrukcje SQL dla wszystkich tabel w bazie danych:
select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables
where table_schema='mydatabase';
Następnie skopiuj wszystkie zapytania i wykonaj je na mydatabase
.
Uwaga: zastąp mydatabase
żądaną nazwą bazy danych
Nie musisz wpisywać hasła, po prostu użyj jednego z następujących poleceń (oczywiste):
mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
Następujące polecenie działało dla mnie przy użyciu wiersza polecenia (jako administrator) w systemie Windows:
mysqlcheck -u root -p -A --auto-repair
Uruchom mysqlcheck z użytkownikiem root, zapytaj o hasło, sprawdź wszystkie bazy danych i automatycznie napraw wszystkie uszkodzone tabele.
Nie ma domyślnego polecenia, które mogłoby to zrobić, ale możesz utworzyć procedurę wykonującą to zadanie. Będzie przechodzić przez wiersze information_schema
i wywoływać REPAIR TABLE 'tablename';
każdy wiersz. CHECK TABLE
nie jest jeszcze obsługiwany dla przygotowanych wyciągów. Oto przykład (zamień MYDATABASE na nazwę swojej bazy danych):
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
Podoba mi się to dla prostego sprawdzenia z powłoki:
mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>
mysql -ss
do pominięcia nazw kolumn w wynikach - pozwoliłoby to usunąć NR != 1
z twojego kodu
Możesz potrzebować nazwy użytkownika i hasła:
mysqlcheck -A --auto-repair -uroot -p
Zostaniesz poproszony o podanie hasła.
mysqlcheck -A --auto-repair -uroot -p{{password here}}
Jeśli chcesz umieścić w cronie, ALE twoje hasło będzie widoczne w postaci zwykłego tekstu!
Jeśli uszkodzone tabele pozostaną po
mysqlcheck -A --auto-repair
próbować
mysqlcheck -A --auto-repair --use-frm