Email: service@parnassusdata.com 7 x 24 online support!

    You are here

    • You are here:
    • Home > Blogs > PDSERVICE's blog > 解决 CSV Table is Marked as Crashed and Should be Repaired; Corrupted or Mangled Data; Error 1194

解决 CSV Table is Marked as Crashed and Should be Repaired; Corrupted or Mangled Data; Error 1194

解决 CSV Table is Marked as Crashed and Should be Repaired; Corrupted or Mangled Data; Error 1194

适用于:

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 用你的表的数据库和表名替换:

  1. mysql> LOCK TABLES csvtest.t1 WRITE;
  2. mysql> FLUSH TABLES csvtest.t1;
  3. shell$ ls ‐l /var/lib/msyql/csvtest/t1.CSV
  4. shell$ cp /tmp/t1.CSV /var/lib/msyql/csvtest/t1.CSV
  5. Make sure the /var/lib/msyql/csvtest/t1.CSV has the same owner and access permissions as found

in step 3.

  1. mysql> UNLOCK TABLES;
  2. 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