2009-06-13 181 views
1

有时我得到一个错误,如“表被标记为损坏并被修复”。该数据库(表)正在使用MyISAM。最近一直在发生。可能是什么原因?最近我正在执行批量插入MyISAM表损坏

INSERT INTO table (..., ..., ...) VALUES (...), (...), (...) ...

,它只是挂起。或花了很长时间来完成它似乎挂在我身上。第二天,当我检查表被标记为腐败再次。当我尝试使用mysqlcheck -r它说所有表确定当它达到那个“腐败”的表,它再次挂在那里...

所以,我能做些什么来防止这种情况。可能的原因是什么。数据库托管第三方,我该如何调试?

是InnoDB更可靠的使用引擎吗?我听说MyISAM速度更快,但也有人说InnoDB速度可以很快,但它需要更多的优化。我可以得出结论,InnoDB是更可靠的东西,但总体来说比较慢,甚至优化?

回答

0

好的,所以问题是公司的db超过了托管公司所允许的存储空间。所以显然没有人告诉公司他们超出了使用...糟糕的主机,我猜。

顺便说一句,没有办法mysql可以知道这种情况吗?

3

如果你的表得到腐败,你可以使用REPAIR TABLE命令进行修复:

REPAIR TABLE table; 

如果你运行myisamchk,而服务器仍在运行(和插入/选择被击中表),它可能是腐蚀你的桌子的原因。我遇到的大多数腐败问题都是在服务器外部执行任务(复制文件等)的同时仍在运行。

InnoDB对于只读数据库比较慢,因为它具有MyISAM遗漏的功能(兼容ACID,行级别锁定)。但是,如果您正在进行读取和写入的混合操作(取决于混合),InnoDB可以提供显着的性能改进,因为它不必锁定整个表来进行写入操作。你也不会遇到腐败问题。

+0

现在,当我尝试执行像select,check table或mysqlcheck -r这样的查询时,甚至会显示create table,它只会挂在那里。我能做什么? – iceangel89 2009-06-14 02:22:41

+0

你有修理吗?它仍在运行(你可以做“显示进程列表”)。很可能你不能访问表或它的元数据,直到它完成(它有一个写锁定)。修复可能需要一段时间才能完成,因此必须重建索引。 – 2009-06-14 04:37:38

1

与InnoDB一起去。