0

私は、データベース内のテーブルを見て、必要なものを修復する cronjob になるスクリプトに取り組んでいます。これらは、mysql データベース内の myisam テーブルです。myisamchk私の質問は、コマンドラインとREPAIR TABLEクエリ構文で構文を使用する理由はありますか?

myisam のドキュメント ページ http://dev.mysql.com/doc/refman/5.0/en/myisamchk.htmlでは、必要なすべてのテーブルを修復する方法としてこれを提供しています。

myisamchk --silent --force --fast --update-state \
          --key_buffer_size=64M --sort_buffer_size=64M \
          --read_buffer_size=1M --write_buffer_size=1M \
          /path/to/datadir/*/*.MYI

を使用する場合とは異なる結果になりますか

REPAIR TABLE tablename

私のすべてのテーブルで?私はphpでプログラム的にそれを行い、(疑似コード)のようなものになります

$tables=query("SELECT table from information_schema.tables where table_schema='myDBName'");
foreach($tables as $table)
{
    $result=query("REPAIR TABLE ".$table);
}

何らかの方法でそれを行うことの実用性について意見はありますが、実際の最終結果は異なるでしょうか? ありがとう。

必要に応じて、動作する (疑似ではない) php コードを提供できますが、それが必要だとは思いませんでした。私が疑似コードを使用している理由は、職場で db アクセスに独自のラッパーを使用しているためです。

4

1 に答える 1

2

自動化が必要なほど頻繁にテーブルを修復する必要はありません。おそらく、MyISAM をまったく使用すべきではありません。しかし、あなたが主張するなら、答えはほとんどあなたがリンクしたページからのものです:

注意

テーブルの修復操作を実行する前に、テーブルのバックアップを作成することをお勧めします。状況によっては、操作によってデータが失われる可能性があります。考えられる原因には、ファイル システム エラーが含まれますが、これに限定されません。

...もちろん、これが問題の元の原因である可能性もあります...これは、このプロセスの自動化に反対する別の投票のように思えます。

重要

myisamchk を実行している間、他のプログラムがテーブルを使用していないことを確認する必要があります。これを行う最も効果的な方法は、myisamchk の実行中に MySQL サーバーをシャットダウンするか、myisamchk が使用されているすべてのテーブルをロックすることです。

REPAIR TABLEしたがって、テーブルを修復する 2 つの方法は共通のコードベースからのものですが、サーバーがオフラインでない限り、eou を使用する必要があるようです。このコマンドにもオプションがあることに注意してください。

http://dev.mysql.com/doc/refman/5.6/en/repair-table.html


更新: 完全に逸話なので、これを追加するのはほとんど嫌ですが、MyISAM テーブルを修復しても、テーブルに問題がある可能性のあるすべての可能性が常に見つかるとは限らないのではないかと長い間疑っていました。再び使用可能。私には、本格的な拡張修復を使用しない限り、リスクを冒しているように思えます。テーブル:

ALTER TABLE t1 ENGINE=InnoDB;
ALTER TABLE t1 ENGINE=MyISAM;

これにより、以前のテーブルのすべての痕跡が完全に削除され、光沢のある新しいテーブルが残ります. 最初に 1 に設定していることを確認してくださいinnodb_file_per_table。そうしないと、簡単に再利用できない ibdata1 システム名前空間にディスク領域が割り当てられます。

于 2013-10-24T03:00:34.410 に答える