すべてのテーブルを一度に修復


112

データベース内のすべてのテーブルを一度に確認する方法は?

check table ''tablename'';すべてのテーブルのクエリを1つずつ入力するのではなく、

そのような簡単なコマンドはありますcheck allか?

回答:



108

コマンドは次のとおりです。

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オプションを削除してください。
Sarcastron 2014年

これらのオプションの1つだけを使用する必要があると思います:自動修復、チェック、または最適化。自動修復のみを使用して機能しました
パケットトレーサー2014

私はあなたが言ったことを試しましたが、私は得ます:mysqlcheck:Got error:1045:Access denied for user 'root' @ 'localhost'(using password:YES)when試みることを接続し、私は知っている正しいパスワード。
Doug

24

次のクエリを使用しREPAIRて、データベース内のすべてのテーブルのSQLステートメントを出力します。

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

その後、すべてのクエリをコピーしてで実行しmydatabaseます。

注:mydatabase目的のDB名に置き換えます


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_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

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.