Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么我的数据库表已损坏?_Mysql_Database_Wordpress - Fatal编程技术网

Mysql 为什么我的数据库表已损坏?

Mysql 为什么我的数据库表已损坏?,mysql,database,wordpress,Mysql,Database,Wordpress,我正在监督一个客户的数据库,该客户的wp_posts表在过去一周内两次损坏。当我尝试使用PhpMyAdmin访问该表时,会收到以下消息: 表wp_posts已标记为崩溃,必须修复 没有迹象表明这是如何发生的,也没有迹象表明可以采取什么措施来防止它。我已经做了8年的开发人员,以前从未经历过这种情况,所以我很茫然。有人遇到过这个问题吗?在它再次发生之前,我如何处理它?错误消息不知道它是如何发生的。它可能是一个有故障的磁盘,一个不完整的I/O写入,一个MySQL代码中的错误,或者有人可能打开了文件并用

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

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


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

错误消息不知道它是如何发生的。它可能是一个有故障的磁盘,一个不完整的I/O写入,一个MySQL代码中的错误,或者有人可能打开了文件并用编辑器在其中涂鸦

要修复它,可以使用MySQL附带的
myisamchk
表修复工具。这里介绍了如何使用此工具:

可以采取什么措施来防止它停止使用MyISAM存储引擎。

MyISAM曾被认为更稳定、更高效,但那是十多年前的事了。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工具时,它说它无法创建新的tempfile。然后我注意到,
wp_posts
上说它正在使用中(一整天都是这样)。我找到了这篇文章(),它描述了如何解决这个问题,但是当我尝试用SSH连接到数据库的文件夹时,它说权限被拒绝。我的主机提供商技术支持不知道为什么我没有权限将
cd
放入该文件夹。有什么想法吗?MySQL数据目录拥有有限的权限并不罕见。默认情况下,用户“mysql”或root用户可以访问该目录。因此,如果
wp_posts
表在使用中被卡住,则无法修复该表。请尝试
--safe recover
选项。请阅读我链接到的页面:“如果上一步失败,请使用myisamchk--safe recover tbl_name。安全恢复模式使用旧的恢复方法来处理一些常规恢复模式无法处理的情况(但速度较慢)。”但如果我无法
cd
进入MYSQL数据目录,那么我不能用
--safe recover
选项运行该命令,对吗?或者我应该在mysql数据库中作为查询运行它?