2011-08-16 26 views
11

MYIインデックスファイルが欠落しているか、そのヘッダが破損している場合は、myisamchkのコマンドを使用できない場合は、MySQLデータベースの破損を扱う:あなたがしてMySQLのコマンドプロンプトから修復を行う必要があるMYIファイルが壊れているか不足している場合、MySQLコマンドプロンプトからすべてのデータベースのすべてのテーブルを修復できますか?

myisamchk --safe-recover --force --sort_buffer_size=2G --key_buffer_size=2G /var/lib/mysql/*/*.MYI 

をUSE_FRMオプション:MySQL documentation's on repairing tables

パー

repair tbl_name use_frm; 

.MYIインデックスファイルがmissinある場合USE_FRMオプションが使用可能ですgまたはヘッダが破損している場合このオプションは.MYIファイルヘッダ内の情報を信頼しないようにMySQLに指示し、.frmファイルからの情報を使ってファイルを再作成します。 この修理はmyisamchkで行うことはできません。 myisamchkので

、あなたは簡単に各データベースのフォルダにドロップすると、コマンドの末尾にアスタリスクを使用して、すべてのテーブルを修復することができます

/var/lib/mysql/*/*.MYI 

あなたはMySQLのコマンドプロンプトから似た何かを行うことはできません。

how to repair all tables within one specific database from the MySQL command prompt with a procedureを説明して解答してStackOverflowの質問があります:

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データベースをループするために、次のように手順を変更し、これらのデータベース内のすべてのテーブルを修復することは可能ですか?

これは、多数のデータベースを持ち、深刻な腐敗に遭遇した人にとっては便利だと思います。

+0

あなたのsnarkyコメントは本当に必要でしたか?近い将来、InnoDBに切り替えることができない状況に陥っています。 – Drew

答えて

16

mysqlcheckは、MySQL CHECKREPAIRANALYZEOPTIMIZE文に、より便利なコマンドライン・インタフェースです。

find ./ -name "*.MYI" -exec myisamchk -r {} \; 

それは、すべてのデータベースを横断:

mysqlcheck --repair --use-frm --all-databases 
+0

myisamchkと同様に、.MYIインデックスファイルがないか、ヘッダが壊れていると、mysqlcheckは機能しません。 ** MySQLコマンドプロンプトからのみ**実行できます。 – Drew

+1

自分でテストしたことはありませんが、 '--use-frm'オプションの存在は不一致のようです。ほとんどの場合、 'mysqlcheck'は手動で文を実行するのと全く同じです。 –

+0

あなたは正しいです! MySQLはREPAIR TABLEのドキュメントを更新して、mysqlcheckも使用できることを人々に知らせるべきです。私が間違っていると私に伝えてくれてありがとう! "mysqlcheckはmyisamchkと機能は似ていますが、動作は異なります。**主な運用上の違いは、mysqldサーバが動作しているときにmysqlcheckを使用しなければならないということですが、myisamchkを使用しないときはmyisamchkを使用する必要があります。テーブルメンテナンスを実行するためにサーバーを停止する必要はありません。ありがとうございました! – Drew

1

は、ここで私は私のDBでのMyISAMのすべてのファイルを修正しなければならなかったときのために私のソリューションです。

関連する問題