Answers:
命令是这样的:
mysqlcheck -u root -p --auto-repair --check --all-databases
询问时必须提供密码,
或者您可以运行此密码,但不建议这样做,因为密码以明文形式编写:
mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
使用以下查询为REPAIR
数据库内的所有表打印SQL语句:
select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables
where table_schema='mydatabase';
之后,复制所有查询并执行 mydatabase
。
注意:替换mydatabase
为所需的数据库名称
没有默认命令可以执行此操作,但是您可以创建一个过程来执行此操作。它将遍历的每一行information_schema
并REPAIR TABLE 'tablename';
为每一行调用。CHECK TABLE
预备语句尚不支持。这是示例(用数据库名称替换MYDATABASE):
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
我喜欢这样从外壳进行简单检查:
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
用来使列名称从输出中省略-这将允许NR != 1
从您的代码中删除
如果损坏的表在之后仍然存在
mysqlcheck -A --auto-repair
尝试
mysqlcheck -A --auto-repair --use-frm