Perbaiki semua tabel sekaligus

112

Bagaimana cara memeriksa semua tabel dalam database sekaligus?

Daripada mengetik kueri check table ''tablename'';untuk semua tabel satu per satu.

Apakah ada perintah sederhana seperti check allatau semacamnya?

AMD
sumber

Jawaban:

108

Perintahnya adalah ini:

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

Anda harus memberikan kata sandi saat diminta,

atau Anda dapat menjalankan yang ini tetapi tidak disarankan karena kata sandi ditulis dalam teks yang jelas:

mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
Constantin Galbenu
sumber
7
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases Error: mysqlcheck tidak mendukung beberapa perintah yang bertentangan
Alekc
11
Jika Anda mendapatkan kesalahan perintah yang bertentangan, ambil opsi --optimize.
Sarcastron
saya rasa Anda harus menggunakan satu dan hanya satu dari opsi ini: perbaikan otomatis, periksa atau optimalkan. Saya hanya menggunakan perbaikan otomatis dan bekerja
Packet Tracer
Saya mencoba apa yang Anda katakan tetapi saya mendapatkan: mysqlcheck: Mendapat kesalahan: 1045: Akses ditolak untuk pengguna 'root' @ 'localhost' (menggunakan kata sandi: YA) ketika mencoba untuk terhubung dan saya tahu saya menggunakan kata sandi yang benar.
Doug
24

Gunakan kueri berikut untuk mencetak REPAIRpernyataan SQL untuk semua tabel di dalam database:

select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables 
where table_schema='mydatabase'; 

Setelah itu salin semua kueri dan jalankan di mydatabase.

Catatan: ganti mydatabasedengan nama DB yang diinginkan

SenthilKumar
sumber
9

Tidak perlu mengetikkan kata sandi, cukup gunakan salah satu dari perintah ini (cukup jelas):

mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
Orang Serbia Gila
sumber
8

Perintah berikut berfungsi untuk saya menggunakan prompt perintah (Sebagai Administrator) di Windows:

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

Jalankan mysqlcheck dengan pengguna root, minta kata sandi, periksa semua database, dan perbaiki otomatis tabel yang rusak.

contactmatt
sumber
3

Tidak ada perintah default untuk melakukan itu, tetapi Anda dapat membuat prosedur untuk melakukan pekerjaan itu. Ini akan mengulang melalui baris information_schemadan memanggil REPAIR TABLE 'tablename';setiap baris. CHECK TABLEbelum didukung untuk pernyataan yang disiapkan. Berikut contohnya (ganti MYDATABASE dengan nama database Anda):

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
St.Woland
sumber
1

Saya suka ini untuk pemeriksaan sederhana dari shell:

mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>
jerrygarciuh
sumber
1
Anda dapat menggunakan mysql -ssuntuk membuat nama kolom dihilangkan dari keluaran - ini akan memungkinkan untuk menghapus NR != 1dari kode Anda
Fluffy
1

untuk host plesk, salah satu dari ini harus dilakukan: (keduanya melakukan hal yang sama)

mysqlrepair -uadmin -p$(cat /etc/psa/.psa.shadow) -A
# or
mysqlcheck -uadmin -p$(cat /etc/psa/.psa.shadow) --repair -A
sjas
sumber
1

Anda mungkin membutuhkan nama pengguna dan kata sandi:

mysqlcheck -A --auto-repair -uroot -p

Anda akan dimintai kata sandi.

mysqlcheck -A --auto-repair -uroot -p{{password here}}

Jika Anda ingin memasukkan cron, TETAPI kata sandi Anda akan terlihat dalam teks biasa!

Mike Zriel
sumber
1

Jika tabel yang rusak tetap ada setelahnya

mysqlcheck -A --auto-repair

mencoba

mysqlcheck -A --auto-repair --use-frm
Laloi
sumber
apa yang -use-frm lakukan?
davidman77
--use-frm Untuk operasi perbaikan pada tabel MyISAM, dapatkan struktur tabel dari kamus data sehingga tabel dapat diperbaiki meskipun header .MYI rusak. (cf. dev.mysql.com/doc/refman/8.0/en/… )
Laloi