環境: MySQL 5.0 on Debian etch (amd64)


# COLUMNS=80 dpkg -l | grep mysql-server
ii  mysql-server-5 5.0.32-7etch5  mysql database server binaries

MyISAM のテーブルからレコードを削除しようとしたらエラーが発生。


mysql> delete from cachetbl where cachedtime < 20080415;
ERROR 126 (HY000): './sampledb/cachetbl.MYI' ・ニ。シ・ヨ・・ホ key file 、ャエ??网テ、ニ、、、・隍ヲ、ヌ、ケ. ス、ノ・キ、??ッ、タ、オ、、
mysql> delete from cachetbl where cachedtime < 20080415;
ERROR 126 (HY000): './sampledb/cachetbl.MYI' テーブルの key file が間違っているようです. 修復をしてください

myisamchk -r を実行してみる。


# myisamchk -r /var/lib/mysql/sampledb/cachetbl.MYI
- recovering (with sort) MyISAM-table '/var/lib/mysql/sampledb/cachetbl.MYI'
Data records: 0
- Fixing index 1
myisamchk: error: sort_buffer_size is to small
MyISAM-table '/var/lib/mysql/sampledb/cachetbl.MYI' is not fixed because of errors
Try fixing it by using the --safe-recover (-o), the --force (-f) option or by not using the --quick (-q) flag

sort_buffer_size is to small と怒られる。
to small? too small じゃなくて?

MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.4.5 myisamchkメモリ使用量 を参考にしつつ、以下のコマンドを試してみた……


# myisamchk -r -o -f /var/lib/mysql/sampledb/cachetbl.MYI
# mysqlcheck -h localhost -u root -p -a -o -A
# myisamchk --sort_buffer_size=16M -r /var/lib/mysql/sampledb/cachetbl.MYI
- recovering (with sort) MyISAM-table '/var/lib/mysql/sampledb/cachetbl.MYI'
Data records: 0
- Fixing index 1
(中略)
Data records: 485765

でも、テーブルをいじろうとすると同じエラーがでてしまうので、修復できてない様子。


mysql> delete from cachetbl where cachedtime < 20080415;
ERROR 126 (HY000): './sampledb/cachetbl.MYI' テーブルの key file が間違っているようです. 修復をしてください

MySQL :: MySQL 5.1 リファレンスマニュアル :: 13.4.4.1 破損した MyISAM テーブル によると「MyISAM テーブルが破損していないかどうか CHECK TABLE ステートメントを利用して確認する事ができます。また、REPAIR TABLEを利用して破損した MyISAM テーブルを修復する事ができます。また、mysqld が稼動していない時はmyisamchk コマンドを利用して確認や修復ができます。」ということなので、repair table というコマンドを試してみた。


mysql> repair table cachetbl;
+-------------------+--------+----------+-----------------------------------------+
| Table             | Op     | Msg_type | Msg_text                                |
+-------------------+--------+----------+-----------------------------------------+
| sampledb.cachetbl | repair | error    | sort_buffer_size is to small            |
| sampledb.cachetbl | repair | warning  | Number of rows changed from 0 to 485765 |
| sampledb.cachetbl | repair | status   | OK                                      |
+-------------------+--------+----------+-----------------------------------------+
3 rows in set (1 hour 4 min 54.36 sec)

MyISAMのテーブルが修復できたっぽい?
試しにレコードを削除してみる。


mysql> delete from cachetbl where cachedtime < 20080415;
Query OK, 370401 rows affected (6 min 54.83 sec)

ちゃんと削除できてるからいいのかな。

トラブルの原因はよくわからないけど、cachetbl テーブルのレコード数はけっこう多くて、ファイルサイズは6.2GBになってた。


# ls -lah /var/lib/mysql/sampledb/ | grep cachetbl
-rw-rw---- 1 mysql mysql 6.2G May  6 21:54 cachetbl.MYD
-rw-rw---- 1 mysql mysql  73M May  6 21:54 cachetbl.MYI
-rw-rw---- 1 mysql mysql 8.5K May  4 00:51 cachetbl.frm

レコードを削除しただけではファイルサイズは減らないので、optimaize table を実行してみたが


mysql> optimize table cachetbl;
+-------------------+----------+----------+------------------------------+
| Table             | Op       | Msg_type | Msg_text                     |
+-------------------+----------+----------+------------------------------+
| sampledb.cachetbl | optimize | error    | sort_buffer_size is to small |
| sampledb.cachetbl | optimize | status   | OK                           |
+-------------------+----------+----------+------------------------------+
2 rows in set (0.31 sec)

ファイルサイズが減らない……

"sort_buffer_size is to small" が問題なのかな?
と思って /etc/mysql/my.cnf の sort_buffer_size を 2M から 32M に変更してから optimaize table を実行してみたら


mysql> optimize table cachetbl;
+-------------------+----------+----------+----------+
| Table             | Op       | Msg_type | Msg_text |
+-------------------+----------+----------+----------+
| sampledb.cachetbl | optimize | status   | OK       |
+-------------------+----------+----------+----------+
1 row in set (0.00 sec)

ファイルサイズが1.1GBまで減った。


# ls -lah /var/lib/mysql/sampledb/ | grep cachetbl
-rw-rw---- 1 mysql mysql 1.1G May  6 22:25 cachetbl.MYD
-rw-rw---- 1 mysql mysql  15M May  6 22:25 cachetbl.MYI
-rw-rw---- 1 mysql mysql 8.5K May  6 22:19 cachetbl.frm

tags: zlashdot Database Debian MySQL amd64

Posted by NI-Lab. (@nilab)