MyISAMテーブルがクラッシュするのはかなり簡単です。
すべてのMyISAMテーブルのヘッダーには、テーブルに対するオープンファイルハンドルの数を追跡するカウンターがあります。
mysqlを起動し、ヘッダーの数が実際のファイルハンドルの数と一致しない場合、mysqldはテーブルをクラッシュしたものとして扱います。
シンプルでREPAIR TABLE mdl_user
毎回データを失うことなく機能する場合、これはに書き込みを行う非常にトラフィックの多いサイトがあることを示している可能性がありますmdl_user
。
数十のテーブルでこれが必要な場合REPAIR TABLE
は、すべてのテーブルをInnoDBに変換します。ただし、mdl_user
テーブルがこの問題のある唯一のテーブルである場合は、何かできることがあります(この例では、データベースがであるとしますmoodle
)。
すべてのテーブルをMyISAMとして残したい場合
ステップ01:修復テーブルスクリプトを作成する
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
ステップ02:修復スクリプトをスタートアップファイルとして宣言する
これを/etc/my.cnfに追加します
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
ステップ03:mysqlを再起動します
mysqlを再起動するたびにテーブル修復スクリプトがトリガーされます
すべてのテーブルをInnoDBにしたい場合
このコードを実行して、MyISAMテーブルからInnoDBへの一括変換スクリプトを作成し、表示します
MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql
変換スクリプトの内容に満足したら、それを実行します
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
UPDATE 2012-03-15 14:00 EDT
@Kevin、MyISAMを使用しているときに、ディスク容量が足りなくなった場合はどうなりますか?
ここで考慮すべき点があります:MySQL 5.0認定調査ガイドによると、
箇条書き#11は、ページ408、409のセクション29.2で次のように述べています。
MyISAMテーブルに行を追加しているときにディスク領域が不足しても、エラーは発生しません。サーバーは、スペースが使用可能になるまで操作を中断し、操作を完了します。
ディスク領域が不足した場合は、mysqlをシャットダウンまたは強制終了しないでください。現在使用されているMyISAMで開いているファイルハンドルの数はクリアされません。したがって、MyISAMテーブルはクラッシュとマークされます。mysqldを実行したままデータボリュームのディスクスペースを解放できる場合、ディスクスペースが利用可能になると、mysqldは兵士になります。