适用于:
MySQL服务器版本4.1及以上
本文信息适用于所有平台。
症状
当尝试访问一个CSV表时,发生以下错误。
ERROR 1194 (HY000): Table ‘t1’ is marked as crashed and should be repaired
表的损坏不会总显示为以上错误。根据数据的损坏,SELECT可能有用,但会返回损坏的数据。
更改
这通常会发生在以下情况之后:
- MySQL的崩溃 – 这包括操作系统崩溃,如由于断电等情况 。
- 数据目录的磁盘不够。
原因
CSV表被损坏。像之前说到的,这通常由于非正常情况发生。
注:当 SELECT 语句由于损坏失败,INSERT 语句仍会运行,因为对于CSV表,插入行是一行或多行数据文件的简单追加。
你可以看到由于其表打开.CSV副本的损坏。例如,假设是表csvtest.t1,那么该文件是${datadir}/csvtest/t1.CSV,其中${datadir}是用于MySQL实例的数据目录。损坏通常会看起来像一行已被清空,且下一行在在同一列开始:
1,”2014-01-11 12:32:22″,”abc”
2,”2014-01-15 13:11:12″,”def”
3,”20144,”2014-01-28 18:00:19″,”jkl”
5,”2014-02-04 12:49:30″,”mno”
6,”2014-02-04 13:22:25″,”pqr”
在上面的示例中第三行被损坏且包含两部分:
- 3,”2014
这是被清空的行
- 4,”2014-01-28 18:00:19″,”jkl”
这是下一行
解决方案
你可以通过两种方式解决该问题:
使用 REPAIR TABLE
手动编辑数据文件的文件
REPAIR TABLE
REPAIR TABLE命令是最简单的方法,但是只有当表被标记为崩溃的时才能运行命令。它的运作方法是在行被损坏之前清空数据文件:
REPAIR TABLE csvtest.t1;
警告:因为REPAIR TABLE for a CSV table 在发现第一行被损坏时就会清空表,数据丢失会发生!
手动编辑数据文件
手动编辑文件能在文本编辑器中通过删除文件被损坏的部分完成。例如根据以上示例,文件能被更改为:
1,”2014-01-11 12:32:22″,”abc”
2,”2014-01-15 13:11:12″,”def”
4,”2014-01-28 18:00:19″,”jkl”
5,”2014-02-04 12:49:30″,”mno”
6,”2014-02-04 13:22:25″,”pqr”
强烈建议对数据文件的副本进行操作。
这种方法的优点是,你必须改变更细粒度的控制,例如上述更改,仅行id=3将丢失,而不是id> =3的所有行。
要复制回数据文件,使用以下步骤(假设Linux或Unix;类似的步骤应用于Windows)将csvtest 和 t1 用你的表的数据库和表名替换:
- mysql> LOCK TABLES csvtest.t1 WRITE;
- mysql> FLUSH TABLES csvtest.t1;
- shell$ ls ‐l /var/lib/msyql/csvtest/t1.CSV
- shell$ cp /tmp/t1.CSV /var/lib/msyql/csvtest/t1.CSV
- Make sure the /var/lib/msyql/csvtest/t1.CSV has the same owner and access permissions as found
in step 3.
- mysql> UNLOCK TABLES;
- mysql> SELECT * FROM csvtest.t1 WHERE id = 6;
在步骤7. 的查询验证在CSV文件的最后一行是否能被找到 – 这在损坏发生之后。
参考
https://dev.mysql.com/doc/refman/5.6/en/repairtable.html
https://dev.mysql.com/doc/refman/5.6/en/csvstorageengine.html
https://dev.mysql.com/doc/refman/5.6/en/secsvrepair.html
NOTE:1023810.1 How do I exchange data between applications using CSV Tables?
Keywords
CSV; DATA FILE; MYSQL; OUT OF DISK; CORRUPTED DATA
Comment