【发布时间】:2016-09-03 16:36:30
【问题描述】:
我正在监督一个客户的数据库,该客户的wp_posts 表在过去一周内被损坏了两次。当我尝试使用 PhpMyAdmin 访问表时,我收到以下消息:
表
wp_posts已被标记为崩溃,必须修复。
没有迹象表明这是如何发生的或可以采取哪些措施来防止它。我已经做了 8 年的开发人员,以前从未经历过这种情况,所以我很茫然。有没有人遇到过这个问题,我该如何在它再次发生之前处理它?
【问题讨论】:
我正在监督一个客户的数据库,该客户的wp_posts 表在过去一周内被损坏了两次。当我尝试使用 PhpMyAdmin 访问表时,我收到以下消息:
表
wp_posts已被标记为崩溃,必须修复。
没有迹象表明这是如何发生的或可以采取哪些措施来防止它。我已经做了 8 年的开发人员,以前从未经历过这种情况,所以我很茫然。有没有人遇到过这个问题,我该如何在它再次发生之前处理它?
【问题讨论】:
错误消息不知道它是如何发生的。可能是磁盘故障、I/O 写入不完整、MySQL 代码中的错误,或者有人打开文件并用编辑器在其中乱涂乱画。
修复它的方法是使用 MySQL 附带的myisamchk 表修复工具。此处介绍了如何使用此工具:https://dev.mysql.com/doc/refman/5.7/en/myisam-repair.html
可以做些什么来防止它? 停止使用 MyISAM 存储引擎。
MyISAM 曾经被认为更稳定、性能更高,但那是 10 多年前的事了。从那时起,InnoDB 得到了所有的工程改进,它的性能明显高于 MyISAM,并且在自我修复方面更安全。在 MySQL 的每个版本中,MyISAM 逐渐被弃用。
改变存储引擎很简单:
ALTER TABLE wp_posts ENGINE=InnoDB;
您必须为数据库中的每个表执行此操作,一次一个。但是您可以生成要运行的命令集:
SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS _sql
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE';
捕获该查询的输出并将语句作为 SQL 脚本运行。在 99% 的情况下,如果您使用的是 MySQL 的当前版本(例如 5.5 分支或更高版本中的任何 GA 版本),则使用 MyISAM 没有任何好处。
【讨论】:
wp_posts 说它正在使用中(一整天都是这样)。我发现这篇文章 (portal.my-tss.com/knowledgebase/254/…) 描述了如何解决这个问题,但是当我尝试 SSH 到我的数据库的文件夹时,它说权限被拒绝。我的托管服务提供商技术支持不知道为什么我没有权限将cd 放入该文件夹。有什么想法吗?
wp_posts表卡住了in use,那么就没有办法修复那个表了吗?
--safe-recover 选项。阅读我链接到的页面:“如果前面的步骤失败,请使用 myisamchk --safe-recover tbl_name。安全恢复模式使用旧的恢复方法,它可以处理一些常规恢复模式不能处理的情况(但速度较慢)。”
cd 进入 MYSQL 数据目录,那么我不能使用 --safe-recover 选项运行该命令,对吧?或者我应该从 mysql 数据库中将其作为查询运行?