2011-01-03 9 views
88

Jak sprawdzić wszystkie tabele w bazie danych za jednym razem?Napraw wszystkie tabele za jednym razem

Zamiast wpisywania zapytania check table ''tablename''; dla wszystkich tabel jeden po drugim.

Czy istnieje jakieś proste polecenie, takie jak check all czy coś w tym stylu?

Odpowiedz

3

Nie ma domyślnego polecenia, aby to zrobić, ale można utworzyć procedurę wykonywania pracy. To będzie iterować przez wiersze information_schema i wywołać REPAIR TABLE 'tablename'; dla każdego wiersza. CHECK TABLE nie jest jeszcze obsługiwany dla przygotowanych wyciągów. Oto przykład (zastąpić MyDatabase z nazwą 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 
14
select concat('repair table ', table_name, ';') from information_schema.tables 
where table_schema='mydatabase'; 

Dla 'MyDatabase' wykorzystać swoją nazwę DB.

+16

Um, to tak naprawdę nie naprawia stołów. Po prostu wypisuje ciąg "tabela napraw nazwa_tabeli" dla każdej tabeli. – naught101

+2

Ale działa dobrze! Właśnie skopiowałem wynik i wykonałem go jako zapytanie sql. – Redax

+0

To uratowało mnie ponad godzinę. – redolent

81

Polecenie to:

mysqlcheck -u root -p --auto-repair --check --all-databases 

Musisz podać hasło pytany,

lub można uruchomić ten jeden, ale nie jest to zalecane, ponieważ hasło jest napisane w postaci zwykłego tekstu:

mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases 
+7

mysqlcheck -u root -p --auto-repair --check --optimize --all-databases Błąd: mysqlcheck nie obsługuje wielu sprzecznych poleceń – Alekc

+0

Wystąpił ten sam błąd co Alekc –

+10

Jeśli pojawi się błąd sprzecznych poleceń , wybierz opcję --optimize. – Sarcastron

1

Lubię to z prostego sprawdzania 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> 
+1

możesz użyć 'mysql -ss', aby pominąć nazwy kolumn wyjściowych - to pozwoliłoby usunąć' NR! = 1' z twojego kodu – Fluffy

6

Następujące polecenie pracował dla mnie za pomocą wiersza polecenia (jako administrator) w Windows:

mysqlcheck -u root -p -A --auto-repair 

Run mysqlcheck z użytkownika root, poprosi o hasło, sprawdzić wszystkie bazy danych, a auto-naprawy wszelkich uszkodzone tabele.

Powiązane problemy