【问题标题】:Why is my database table being corrupted?为什么我的数据库表已损坏?
【发布时间】:2016-09-03 16:36:30
【问题描述】:

我正在监督一个客户的数据库,该客户的wp_posts 表在过去一周内被损坏了两次。当我尝试使用 PhpMyAdmin 访问表时,我收到以下消息:

wp_posts已被标记为崩溃,必须修复。

没有迹象表明这是如何发生的或可以采取哪些措施来防止它。我已经做了 8 年的开发人员,以前从未经历过这种情况,所以我很茫然。有没有人遇到过这个问题,我该如何在它再次发生之前处理它?

【问题讨论】:

    标签: mysql database wordpress


    【解决方案1】:

    错误消息不知道它是如何发生的。可能是磁盘故障、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 没有任何好处。

    【讨论】:

    • 感谢比尔的详细解释!当我尝试运行 mysiamchk 工具时,它说它无法创建新的临时文件。然后我注意到wp_posts 说它正在使用中(一整天都是这样)。我发现这篇文章 (portal.my-tss.com/knowledgebase/254/…) 描述了如何解决这个问题,但是当我尝试 SSH 到我的数据库的文件夹时,它说权限被拒绝。我的托管服务提供商技术支持不知道为什么我没有权限将cd 放入该文件夹。有什么想法吗?
    • MySQL 数据目录具有有限权限的情况并不少见。默认情况下,用户 'mysql' 或 root 可以访问该目录。
    • 那么如果wp_posts表卡住了in use,那么就没有办法修复那个表了吗?
    • 试试--safe-recover 选项。阅读我链接到的页面:“如果前面的步骤失败,请使用 myisamchk --safe-recover tbl_name。安全恢复模式使用旧的恢复方法,它可以处理一些常规恢复模式不能处理的情况(但速度较慢)。”
    • 但是如果我不能 cd 进入 MYSQL 数据目录,那么我不能使用 --safe-recover 选项运行该命令,对吧?或者我应该从 mysql 数据库中将其作为查询运行?
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2014-12-11
    相关资源
    最近更新 更多