Câu trả lời:
từ dòng lệnh, bạn có thể sử dụng:
mysqlcheck -A --auto-repair
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
Sử dụng truy vấn sau để in REPAIR
cá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ế mydatabase
bằng tên DB mong muốn
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.
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_schema
và gọi REPAIR TABLE 'tablename';
cho mọi hàng. CHECK TABLE
chư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
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>
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 != 1
từ mã của bạn
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!
Nếu bảng bị hỏng vẫn còn sau
mysqlcheck -A --auto-repair
thử
mysqlcheck -A --auto-repair --use-frm