回答:
コマンドは次のとおりです。
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目的のDB名に置き換えます
パスワードを入力する必要はありません。次のコマンドのいずれかを使用してください(自明)。
mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
これを実行するデフォルトのコマンドはありませんが、ジョブを実行するプロシージャを作成できます。それは行を繰り返し、すべての行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
破損したテーブルが後に残る場合
mysqlcheck -A --auto-repair
試す
mysqlcheck -A --auto-repair --use-frm