web-dev-qa-db-ja.com

MySQLテーブルを強制的に破損させるにはどうすればよいですか?

mysqlcheck (破損したテーブルをチェックする)を呼び出す単純な Nagios プラグインを作成し、破損している場合は警告を表示します。

しかし、私のテーブルはどれも壊れていません。だから私は私のプラグインがうまく機能していることを100%確信していません。ミッションクリティカルではない開発サーバーがあります。 nagiosアラートをテストできるように、テーブルの1つ(またはいずれか)を強制的に破損させるにはどうすればよいですか?

記録のために、サーバーはUbuntu Dapperであり、mysqlはバージョン5.0です

17
Rory

一般に、/ var/lib/mysqlからデータベースをコピーしてデータベースをバックアップすることはできません。破損するため、データベースをコピーします。代わりにmysqldumpを使用する必要があります。

したがって、/ var/lib/mysqlにあるデータベース用のフォルダーの1つに移動した場合(つまり、/ var/lib/mysql/myDB /)、それを実行するはずのいくつかのファイルを混乱させます:-)

そのため、ファイルの1つをコピーし、16進エディターで少し編集して、コピーして戻すことをお勧めします。

1
Kyle Brandt
cat DB1.myd /dev/random > DB2.myd
8
Matt Simmons

これはそれを行うはずです:

cat /dev/urandom > yourdb.myd
3
Berkus Aurelius

zzuf のようなファジングツールを使用して、既存のデータベースファイルをファジングできます。

zzuf < good.myd > fuzzed.myd
3
Gerald Combs

例:

mysql> repair table Transactions;
^CQuery aborted by Ctrl+C
+-----------------------------------+--------+----------+-----------------------+
| Table                             | Op     | Msg_type | Msg_text              |
+-----------------------------------+--------+----------+-----------------------+
| test.Transactions | repair | error    | 137 when fixing table |
| test.Transactions | repair | status   | Operation failed      |
+-----------------------------------+--------+----------+-----------------------+
2 rows in set (17.84 sec)

mysql> select * from Transactions limit 1;
ERROR 144 (HY000): Table './test/Transactions' is marked as crashed and last (automatic?) repair failed
2
Kamil Adamczyk

障害をシミュレートするためのより現実的な方法は、集中的な更新を実行しているときに、MySQLの足元から敷物を引き抜くことです。 mysqldプロセスにSIGKILLを発行するだけで十分です。 MySQLを再起動すると、問題のテーブルがクラッシュしたとマークされる可能性があります。

または、他の人の提案を適用することをお勧めしますが、データファイルではなく.MYI indecファイルに適用します。

2
Dan Carley

おそらく、次のようなコマンド実行。

echo "aaa" > file.myd
1
Mark L