myisampackで圧縮したテーブルは、書き込みも、ALTERも出来ません。
でも書き込みたいことも、変更したくなることもあると思います。
そんな時は再度、解凍してしまいましょう。

insertintocompress

[root@colinux DB01]# myisamchk --unpack TABLE101.MYI
- recovering (with sort) MyISAM-table 'TABLE101.MYI'
Data records: 0
- Fixing index 1
- Fixing index 2

[root@colinux DB01]#

サービスを再起動して確認
uncompress

「サービスを再起動しなくてもいい方法」

alter tableを利用

mysql> use DB01;
Database changed
mysql> select TABLE_NAME,ROW_FORMAT from information_schema.TABLES
-> where TABLE_SCHEMA = 'DB01' and TABLE_NAME = 'TABLE101';
+------------+------------+
| TABLE_NAME | ROW_FORMAT |
+------------+------------+
| TABLE101 | Compressed |
+------------+------------+
1 row in set (0.01 sec)

mysql> insert into TABLE101(title,body) values('Compress','insert test into Compressed');
ERROR 1036 (HY000): Table 'TABLE101' is read only
mysql> create table TABLE101_TMP like TABLE101;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into TABLE101_TMP select * from TABLE101;
Query OK, 30 rows affected (0.02 sec)
Records: 30 Duplicates: 0 Warnings: 0

mysql> drop table TABLE101;
Query OK, 0 rows affected (0.00 sec)

mysql> alter table TABLE101_TMP rename to TABLE101;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> select TABLE_NAME,ROW_FORMAT from information_schema.TABLES
-> where TABLE_SCHEMA = 'DB01' and TABLE_NAME = 'TABLE101';
+------------+------------+
| TABLE_NAME | ROW_FORMAT |
+------------+------------+
| TABLE101 | Dynamic |
+------------+------------+
1 row in set (0.00 sec)

mysql>

table_alter

※ その他の方法としては、mysqldumpで対象のテーブルをバックアップして,mysqlコマンドでリストアする。


myisamchk (MYISAM ONLY) テーブルにアクセスが無い事を確認
http://dev.mysql.com/doc/refman/5.1/ja/myisamchk.html
myisamchk ユーティリティはユーザのデータベース テーブルの情報を収集し、
チェック、修復、もしくは最適化します。myisamchk は MyISAM
テーブルとともに作動します(データやインデックスを記憶するための
.MYD や .MYI テーブル)。

━アクセスが無い状態である必要あり━
※サーバーを停止しておく
※テーブルをLockしておく

*で全てのMYIテーブルをチェックする事が出来ます。
[root@colinux mysql]# myisamchk *.MYI
———

Checking MyISAM file: user_info.MYI
Data records: 0 Deleted blocks: 0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check data record references index: 1
– check data record references index: 2
– check record links

———

Checking MyISAM file: user.MYI
Data records: 5 Deleted blocks: 0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check data record references index: 1
– check record links

全てのMyISAMテーブルをチェックするお勧めの方法は以下のとおりです。

[root@colinux mysql]# myisamchk --silent --fast /usr/local/mysql/data/mysql/*.MYI
[root@colinux mysql]#

全ての MyISAM テーブルをチェックし、破壊されているものを修復したい場合、以下のコマンドを使用してください。

shell> 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

(例)メモリー量は調整してください。

[root@colinux mysql]# myisamchk --silent --force --fast --update-state --key_buf
fer_size=16M --sort_buffer_size=16M --read_buffer_size=16M --write_buffer_size=16M *.MYI

[root@colinux mysql]#

myisamchk

[root@colinux TEST]# myisamchk --recover *.MYI
– recovering (with keycache) MyISAM-table ‘MYSQLIMP.MYI’
Data records: 5
———
– recovering (with sort) MyISAM-table ‘Y2008.MYI’
Data records: 3
– Fixing index 1
– Fixing index 2
———
– recovering (with sort) MyISAM-table ‘Y2009.MYI’
Data records: 1
– Fixing index 1
– Fixing index 2

[root@colinux TEST]# myisamchk --recover MYSQLIMP
- recovering (with keycache) MyISAM-table 'MYSQLIMP'
Data records: 5

[root@colinux TEST]#

※ 起動時にcheckする場合は、mysqld --myisam-recovert=QUICK

※ Optionファイルに、myisam-recoverオプションを設定しても可能


■CHECK TABLE
http://dev.mysql.com/doc/refman/5.1/ja/check-table.html
CHECK TABLE はテーブルのエラーを確認します。CHECK TABLE は MyISAM、InnoDB、
そして ARCHIVE テーブルにのみ機能します。MySQL 5.1.9 から、CHECK は CSV
テーブルにも有効になりました。
MyISAM テーブルに対しては、キー統計もまた更新されます。

mysql> CHECK TABLE T01;
+———-+——-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+———-+——-+———-+———-+
| test.T01 | check | status | OK |
+———-+——-+———-+———-+
1 row in set (0.00 sec)

mysql>

■REPAIR TABLES
http://dev.mysql.com/doc/refman/5.1/ja/repair-table.html
REPAIR TABLE は破損された可能性があるテーブルを修復します。これはデフォルトで、
myisamchk –recover tbl_name と同じ効果を持っています。REPAIR TABLE は MyISAM と ARCHIVE
テーブルに対して機能します。MySQL 5.1.9 から、REPAIR は CSV テーブルにも有効になりました。

■ANALYZE TABLES (Update table’s index statistics)
http://dev.mysql.com/doc/refman/5.1/ja/analyze-table.html
ANALYZE TABLE はテーブルのキーの分布を分析、格納します。
分析の最中に、テーブルは MyISAM のリード ロックを利用してロックされます。
InnoDB には、テーブルは書き込みロックでロックされます。
このステートメントは MyISAM と InnoDB テーブルと共に機能します。
MyISAM テーブルにとっては、このステートメントは myisamchk –analyze を利用する事と同じです。

mysql> analyze table T01;
+———-+———+———-+———-+
| Table | Op | Msg_type | Msg_text |
+———-+———+———-+———-+
| test.T01 | analyze | status | OK |
+———-+———+———-+———-+
1 row in set (0.00 sec)

■OPTIMAIZE TABLES
http://dev.mysql.com/doc/refman/5.1/ja/optimize-table.html
しテーブルの大部分を削除したり、変数長行で何箇所もテーブルを
変更した場合は(VARCHAR、VARBINARY、BLOB、または TEXT カラムを持つテーブル)、
OPTIMIZE TABLE を利用しなければいけません。
OPTIMIZE TABLE は MyISAM と InnoDB テーブルに対して のみ 機能します。
これは、NDB ディスク データ テーブルを含むその他のストレージ エンジンを
利用して作成されたテーブルには機能 しません。

—– MYISAM —–
mysql> OPTIMIZE TABLE T_TEST;
+—————-+———-+———-+—————————–+
| Table | Op | Msg_type | Msg_text |
+—————-+———-+———-+—————————–+
| WINDOWS.T_TEST | optimize | status | Table is already up to date |
+—————-+———-+———-+—————————–+
1 row in set (0.00 sec)

—– INNODB —–
mysql> OPTIMIZE TABLE T01;
+———-+———-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+———-+———-+———-+———-+
| test.T01 | optimize | status | OK |
+———-+———-+———-+———-+
1 row in set (0.05 sec)

mysql>

■mysqlcheck
http://dev.mysql.com/doc/refman/5.1/ja/mysqlcheck.html
mysqlcheckのファンクションはmyisamchkと似ていますが、
作動方法が異なります。実質的な作動方法の違いは、mysqlcheckはmysqld
サーバが作動中の時に使用されなければいけません。
myisamchkはこのサーバが作動していない時に使用品kればいけません。
mysqlcheckを使用することの利点は、テーブルのチェックや修復時に
サーバを停止させなくてすむことです。
mysqlcheckはSQLステートメントCHECK TABLE、REPAIR TABLE、ANALYZE TABLE、
そしてOPTIMIZE TABLEをユーザにとって便利な方法で使用します。
実行したいオペレーションに対してどのステートメントを使用するか決定し、
実行のためサーバにステートメントを送信します。

[root@localhost ~]$ mysqlcheck –analyze test T01 -u root -ppassword
test.T01 OK
[root@localhost ~]$

—– MYISAM —–
[root@localhost WINDOWS]# mysqlcheck –optimize WINDOWS T_TEST -u root -ppassword
WINDOWS.T_TEST Table is already up to date
[root@localhost WINDOWS]#

[root@localhost WINDOWS]# mysqlcheck –repair WINDOWS T_TEST -u root -ppassword
WINDOWS.T_TEST OK
[root@localhost WINDOWS]#

[root@localhost WINDOWS]# mysqlcheck –repair WINDOWS -u root -ppassword
WINDOWS.Brokerage OK
WINDOWS.Channel OK
WINDOWS.ConfidenceTerm OK
WINDOWS.DetailCompany OK
WINDOWS.DetailForeignExchange OK

—– INNODB —–
[root@localhost WINDOWS]# mysqlcheck –optimize test T01 -u root -ppassword
test.T01 OK
[root@localhost WINDOWS]#

※ optimizeはmemory tableに利用出来ません。

[root@localhost WINDOWS]# mysqlcheck –repair test T01 -u root -ppassword
test.T01
note : The storage engine for the table doesn’t support repair

■myisamchk (MYISAM ONLY) テーブルにアクセスが無い事を確認
http://dev.mysql.com/doc/refman/5.1/ja/myisamchk.html
myisamchk ユーティリティはユーザのデータベース テーブルの情報を収集し、
チェック、修復、もしくは最適化します。myisamchk は MyISAM
テーブルとともに作動します(データやインデックスを記憶するための
.MYD や .MYI テーブル)。

[root@localhost WINDOWS]# myisamchk –analyze T_TEST.MYI
Checking MyISAM file: T_TEST.MYI
Data records: 1 Deleted blocks: 0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check record links
[root@localhost WINDOWS]#

[root@localhost WINDOWS]# myisamchk –recover T_TEST
– recovering (with keycache) MyISAM-table ‘T_TEST’
Data records: 1
[root@localhost WINDOWS]#

※「誰も利用していない状態にしておく」
※「サービス停止をした方が良い」
※「オンラインの場合は、メンテナンス対象テーブルをロックする」

『起動時にMYISAMのテーブルを自動的にRecoverする為のオプション』
起動方法① mysqld –myisam-recover=QUICK
オプションファイル(my.cnf)に記入② –myisam-recover