Sửa chữa tất cả các bảng trong một lần


112

Làm thế nào để kiểm tra tất cả các bảng trong cơ sở dữ liệu trong một lần?

Thay vì gõ truy vấn check table ''tablename'';cho tất cả từng bảng một.

Có bất kỳ lệnh đơn giản như check allhoặc bất cứ điều gì tương tự?

Câu trả lời:



108

Lệnh này là:

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

Bạn phải cung cấp mật khẩu khi được hỏi,

hoặc bạn có thể chạy cái này nhưng nó không được khuyến khích vì mật khẩu được viết bằng văn bản rõ ràng:

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

7
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases Lỗi: mysqlcheck không hỗ trợ nhiều lệnh mâu thuẫn
Alekc

11
Nếu bạn gặp lỗi lệnh mâu thuẫn, hãy loại bỏ tùy chọn - tối ưu hóa.
Sarcastron

Tôi đoán bạn phải sử dụng một và chỉ một trong các tùy chọn sau: tự động sửa chữa, kiểm tra hoặc tối ưu hóa. Tôi sử dụng tính năng tự động sửa chữa chỉ và làm việc
Packet Tracer

Tôi đã thử những gì bạn nói nhưng tôi nhận được: mysqlcheck: Đã xảy ra lỗi: 1045: Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu: CÓ) khi cố gắng kết nối và tôi biết mình đang sử dụng đúng mật khẩu.
Doug

24

Sử dụng truy vấn sau để in REPAIRcác trạng thái SQL cho tất cả các bảng bên trong cơ sở dữ liệu:

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

Sau đó, sao chép tất cả các truy vấn và thực thi nó mydatabase.

Lưu ý: thay thế mydatabasebằng tên DB mong muốn


9

Không cần nhập mật khẩu, chỉ cần sử dụng bất kỳ lệnh nào trong số các lệnh sau (tự giải thích):

mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize

8

Lệnh sau phù hợp với tôi bằng cách sử dụng dấu nhắc lệnh (Với tư cách là Quản trị viên) trong Windows:

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

Chạy mysqlcheck với người dùng root, nhắc nhập mật khẩu, kiểm tra tất cả cơ sở dữ liệu và tự động sửa chữa bất kỳ bảng nào bị hỏng.


3

Không có lệnh mặc định nào để làm điều đó, nhưng bạn có thể tạo một thủ tục để thực hiện công việc. Nó sẽ lặp qua các hàng information_schemavà gọi REPAIR TABLE 'tablename';cho mọi hàng. CHECK TABLEchưa được hỗ trợ cho các báo cáo chuẩn bị. Đây là ví dụ (thay MYDATABASE bằng tên cơ sở dữ liệu của bạn):

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

1

Tôi thích điều này để kiểm tra đơn giản từ shell:

mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>

1
bạn có thể sử dụng mysql -ssđể làm cho tên cột bỏ qua từ đầu ra - điều này sẽ cho phép để loại bỏ NR != 1từ mã của bạn
Fluffy

1

đối với máy chủ plesk, một trong những điều này nên làm: (cả hai đều làm như nhau)

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

1

Bạn có thể cần tên người dùng và mật khẩu:

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

Bạn sẽ được nhắc nhập mật khẩu.

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

Nếu bạn muốn nhập cron, NHƯNG mật khẩu của bạn sẽ hiển thị ở dạng văn bản thuần túy!


1

Nếu bảng bị hỏng vẫn còn sau

mysqlcheck -A --auto-repair

thử

mysqlcheck -A --auto-repair --use-frm

-use-frm làm gì?
davidman77

--use-frm Đối với các thao tác sửa chữa trên bảng MyISAM, hãy lấy cấu trúc bảng từ từ điển dữ liệu để bảng có thể được sửa ngay cả khi tiêu đề .MYI bị hỏng. (xem dev.mysql.com/doc/refman/8.0/en/… )
Laloi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.