适用于:
MySQL 服务器版本4.0及以上
本文信息适用于所有平台。
症状
在修复一个MyISAM表时,”Table ‘x’ is read only”错误是什么意思,如何修复它?
mysql> repair table t; +‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐ ‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ | Table | Op | Msg_type | Msg_text | +‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ | test.t | repair | Error | Table 't' is read only | | test.t | repair | status | Operation failed | +‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
原因
这个错误有两个可能的起因:
- MyISAM文件MYD或MYI有错误权限且mysqld进程不能写它们
- MyISAM表被压缩
查看MyISAM表是否被压缩,运行
show table status like 't';
如果表被压缩,Row_format 显示 “Compressed”:
mysql> show table status like 't'\G *************************** 1. row *************************** Name: t Engine: MyISAM Version: 10 Row_format: Compressed <‐‐‐‐‐‐‐‐ Rows: 0 Avg_row_length: 0 Data_length: 41 Max_data_length: 281474976710655 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2013‐0 6‐27 19:29:49 Update_time: 2013‐06‐27 19:29:49 Check_time: NULL Collation: latin 1_swedish_ci Checksum: 0 Create_options: Comment: 1 row in s et (0.02 sec)
解决方案
对于每个可能的原因,(各个)解决方案有:
- MyISAM文件MYD或MYI有错误权限且mysqld进程不能写它们,要修复它,在shell上运行:
chgrp ‐R mysql <dataDir> chown ‐R mysql <dataDir> chmod ‐R 660 <dataDir>
- MyISAM表被压缩,要修复这个问题在shell运行:
myisamchk.exe ‐‐unpack <dataDir>\<db_name>\<table_name> Then the table can be repaired: mysql> flush tables; Query OK, 0 rows affected (0.01 sec) mysql> repair table t; +‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐ ‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+ | Table | Op | Msg_type | Msg_text | +‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐ ‐‐‐‐+ | test.t | repair | status | OK | +‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+ 1 row in set (0.05 sec)
参考
https://dev.mysql.com/doc/en/repairtable.html
http://dev.mysql.com/doc/en/myisamchkrepairoptions.html#option_myisamchk_unpack
Comment