一次性修复所有表


111

如何一次性检查数据库中的所有表?

而不是check table ''tablename'';一个一个地为所有表键入查询。

有没有像这样的简单命令check all

Answers:



107

命令是这样的:

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

询问时必须提供密码,

或者您可以运行此密码,但不建议这样做,因为密码以明文形式编写:

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

7
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases错误:mysqlcheck不支持多个矛盾的命令
Alekc

11
如果遇到矛盾的命令错误,请取出--optimize选项。
萨卡斯特龙2014年

我猜您只需要使用以下选项之一:自动修复,检查或优化。我仅使用自动修复并且可以工作
Packet Tracer

我尝试了您说的内容,但得到:mysqlcheck:得到错误:1045:尝试连接时,用户'root'@'localhost'的访问被拒绝(使用密码:是),我知道我使用的密码正确。
道格

24

使用以下查询为REPAIR数据库内的所有表打印SQL语句:

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

之后,复制所有查询并执行 mydatabase

注意:替换mydatabase为所需的数据库名称


9

无需输入密码,只需使用以下命令之一(不言自明):

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

8

以下命令在Windows中使用命令提示符(以管理员身份)为我工作:

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

以root用户运行mysqlcheck,提示输入密码,检查所有数据库,并自动修复任何损坏的表。


3

没有默认命令可以执行此操作,但是您可以创建一个过程来执行此操作。它将遍历的每一行information_schemaREPAIR 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

1

我喜欢这样从外壳进行简单检查:

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

1
您可以mysql -ss用来使列名称从输出中省略-这将允许NR != 1从您的代码中删除
Fluffy 2014年

1

对于plesk主机,以下其中一项应执行:(两者都应相同)

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

1

您可能需要用户名和密码:

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

系统将提示您输入密码。

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

如果您要放入cron,则您的密码将以纯文本显示!


1

如果损坏的表在之后仍然存在

mysqlcheck -A --auto-repair

尝试

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

-use-frm有什么作用?
davidman77

--use-frm对于MyISAM表的修复操作,请从数据字典中获取表结构,以便即使.MYI标头损坏也可以修复该表。(参见dev.mysql.com/doc/refman/8.0/en/...
Laloi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.