まとまりのないブログ

something which something is something

mysql

mysqlのテーブルのクラッシュ

投稿日:


/usr/local/mysql/bin/myisamchk --recover --force --sort_buffer_size=2048M /usr/local/mysql/data/auc/200902.MYI

これでmysqlのテーブルがクラッシュしたのは2回目。前回は先月の中ごろだったので修復してから1ヶ月しかもたなかった。前回の修復作業はかなりの疲労を伴った。テーブルのレコード数が膨大であるためにいつ終わるのか見当もつかないから。テーブルのレコード数が4000万でそのうち4つのフィールドにインデックスが作成されている。結局、修復にかかる時間は前回の作業で20時間ほどかかった。今回はレコード数がそれより1000万増えているため、修復にかかる時間はさらに要することが予想される。

テーブルがクラッシュする原因ははっきりとはわからないが、クラッシュするなりの挿入、更新、削除のsqlを毎日数十万~数百万回実行しているという自覚はある。テーブルがクラッシュしても修復をすることができるのでそれは問題はない。問題は修復するのに時間がかかりすぎるということ。mysqlのテーブルはクラッシュするものという前提でソフトウェアを設計する必要がある。修復の時間を短縮するために1テーブル辺りのレコード数の上限を500万程度に抑えるようにして、インデックスの数も2個以内にする。それぐらいの条件であればテーブルがクラッシュしても、その修復にかかる時間は1時間程度で終わるのではないだろうか。(予想)
上限が500万レコード程度のテーブルがたくさん作成されてその全てがクラッシュしたら同じことになるんだろうか・・・。ただ、テーブルのクラッシュした結果をみたところ、一つのテーブルがクラッシュしたらその時点でmysqldはフリーズしたような状態になり、全てのデータベースのテーブルに対してsqlを受け付けないようになっていた。それでmysqlを再起動したらクラッシュしたテーブルをリペアしろエラーが表示されて、クラッシュしたテーブルはリペアしないことには使うことができず、その他のテーブルは通常通り使うことができるようになった。

しかし、関係ないはずの他のデータベース、wordpressに使っているデータベースもクラッシュしたというログがあった。なぜか。

090323  8:10:55 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_options' is mar                                                                    ked as crashed and should be repaired
090323  8:10:55 [Warning] Checking table:   './wordpress/wp_options'
090323  8:10:56 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_users' is marke                                                                    d as crashed and should be repaired
090323  8:10:56 [Warning] Checking table:   './wordpress/wp_users'
090323  8:10:56 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_usermeta' is ma                                                                    rked as crashed and should be repaired
090323  8:10:56 [Warning] Checking table:   './wordpress/wp_usermeta'
090323  8:10:56 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_posts' is marke                                                                    d as crashed and should be repaired
090323  8:10:56 [Warning] Checking table:   './wordpress/wp_posts'
090323  8:10:56 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_terms' is marke                                                                    d as crashed and should be repaired
090323  8:10:56 [Warning] Checking table:   './wordpress/wp_terms'
090323  8:10:56 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_term_taxonomy'                                                                     is marked as crashed and should be repaired
090323  8:10:56 [Warning] Checking table:   './wordpress/wp_term_taxonomy'
090323  8:10:56 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_term_relationsh                                                                    ips' is marked as crashed and should be repaired
090323  8:10:56 [Warning] Checking table:   './wordpress/wp_term_relationships'
090323  8:10:56 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_postmeta' is ma                                                                    rked as crashed and should be repaired
090323  8:10:56 [Warning] Checking table:   './wordpress/wp_postmeta'
090323  8:10:56 [ERROR] /usr/local/mysql/bin/mysqld: Table './wordpress/wp_links' is marke                                                                    d as crashed and should be repaired
090323  8:10:56 [Warning] Checking table:   './wordpress/wp_links'

-mysql
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

no image

Client requested master to start replication from impossible position ( server_errno=1236)

mysqlのレプリケーションでのエラー。Client requested master to start replication from impossible position ( server_e …

no image

結果の行数をカウントする

mysqlで結果の行数をカウントするsql文は、 seletc count(*) from foo; で取得するのが最も簡単ではあるけれど、レコード数が膨大な場合にはパフォーマンスの面で問題になる場合 …

no image

Incorrect key file for table ‘./my/table.MYI’; try to repair it

MySQLのテーブルが壊れた。Incorrect keyとかCorruptとかエラーメッセージが出たのでrepairテーブルとかmyisamchkとか色々修復するべく試したがどうやっても直ってくれない …

no image

インデックス列には日本語よりも英数字を使うほうが良いのか悪いのか

テーブル内に存在するレコード数をカウントする時、where句にインデックス列を条件として指定して実行時間がどれほどかかるかテストをしてみた。テーブルの全レコード数は約1600万レコードで、カウントすべ …

no image

myisamchkの修復時に作成されるTMDファイル

テーブルの修復をしようとしたらtempfileが作成できないという下記のエラーが発生した。