好的,这要从前几天开始说起。我尝试在一个大表(700 万行)上创建索引,但它挂了。好吧,它进入了“通过密钥缓存修复”...我发现这并不是那么好。
好吧,这个过程被打断了。ALTER 失败,没有创建索引。在进一步尝试执行此操作时发生了一些事情(我不知道是什么原因或如何导致的),但整个表都损坏了,并进入“表的密钥文件不正确”
于是我开始修复(但毫无效果)——花了好几个小时,最后只能放弃。所以我尝试从备份中恢复……结果不太好。
所以我尝试从另一台服务器的 .MYI 和 .MYD 文件恢复。这也没用。
所以我放弃了这个表,重新创建了空表(数据不是问题)。所有系统都运行正常,一切都运行顺利。但每次我尝试在重新创建的表上执行插入操作时,MySQL 都会崩溃。然后下一个查询(通常是我尝试使用 来查看 shell 上发生了什么SHOW PROCESSLIST\G;
)会从服务器启动每个连接,然后我会收到如下错误:
*************************** 1. row ***************************
Id: 11
User: debian-sys-maint
Host: localhost
db: NULL
Command: Query
Time: 1
State: Repair by sorting
Info: products
*************************** 3. row ***************************
Id: 71
User: debian-sys-maint
Host: localhost
db: NULL
Command: Query
Time: 0
State: System lock
Info: select count(*) into @discard from `creloaded`.`products_options_values_to_products_options`
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
ERROR:
Can't connect to the server
因此整个服务器变得无法使用......直到我停止服务器并删除产品表文件。
因此,我尝试重新创建包含此有问题的表的整个架构。给它起了个不同的名字。但表名仍然相同:products
当我尝试向其中插入任何数据时,都会出现与上述相同的问题。因此,我猜想发生了一些更激烈的事情,或者存在对此表和/或其索引的更深层次的引用,MySQL 认为迫切需要修复!
有人可以对此作出解释并提供一些帮助吗?
我在一台 32 位机器上运行 Ubuntu Server 10.04 和 MySQL 5.1.41,内存为 2GB
答案1
我设法纠正了这个问题......虽然我真的不知道它的原因是什么,所以它当然可能会再次发生。
因此基本上我停止了 MySQL 并对myisamchk
产品表(在新模式中)进行了以下操作:
sudo su
-ingcd /var/lib/mysql/{scema_name}/
myisamchk -o -f products
我以前试过这个,但如果表已满,则需要几天时间。但由于表中现在没有记录,所以几秒钟就完成了,而且这似乎清除了 MySQL 为崩溃表设置的任何标志。
因此,现在每次服务器启动时它都不再尝试修复它,并且我已经成功地将近 500 万行写回到表中,没有任何问题。
课程?
备份表数据,清空表,myisamchk -o
在空表上执行,然后重新插入数据
有趣的是,我尝试做一个myisamchk -r
但却一直得到一个Segmentation Fault
。