共计 3039 个字符,预计需要花费 8 分钟才能阅读完成。
行业资讯
数据库
如何解决 mysql 错误……is marked as crashed and should be 的问题
这篇文章将为大家详细讲解有关如何解决 mysql 错误……is marked as crashed and should be 的问题,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
我用的修复命令是:myisamchk -r bbsthreads
其中 bbsthreads 是我出问题的表名,当然使用这个命令还得进入 mysql 你所出问题的的表的存放路径,具体更详细的命令可以看帮助:myisamchk –help;
如果用以上命令你不能解决问题请看后面,后面的内容是我转载的。
我的网站出问题了,访问一看,果然全屏报错,检查日志,错误信息为:
Table .dedecmsv4dede_archives is marked as crashed and should be repaired
提示说 cms 的文章表 dede_archives 被标记有问题,需要修复。于是赶快恢复历史数据,上网查找原因。最终将问题解决。解决方法如下:
找到 mysql 的安装目录的 bin/myisamchk 工具,在命令行中输入:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
然后 myisamchk 工具会帮助你恢复数据表的索引。重新启动 mysql,问题解决。
问题分析:
1、错误产生原因,有网友说是频繁查询和更新 dede_archives 表造成的索引错误,因为我的页面没有静态生成,而是动态页面,因此比较同意这种说法。还有说法为是 MYSQL 数据库因为某种原因而受到了损坏,如:数据库服务器突发性的断电、在提在数据库表提供服务时对表的原文件进行某种操作都有可能导致 MYSQL 数据库表被损坏而无法读取数据。总之就是因为某些不可测的问题造成表的损坏。
问题的编号为 145
2、问题解决办法。
当你试图修复一个被破坏的表的问题时,有三种修复类型。如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次 – 这通常是上一次修复操作遗留下来的。
这三种修复方法如下所示:
% myisamchk –recover –quick /path/to/tblName
% myisamchk –recover /path/to/tblName
% myisamchk –safe-recover /path/to/tblName
第一种是最快的,用来修复最普通的问题;而最后一种是最慢的,用来修复一些其它方法所不能修复的问题。
检查和修复 MySQL 数据文件
如果上面的方法无法修复一个被损坏的表,在你放弃之前,你还可以试试下面这两个技巧:
如果你怀疑表的索引文件 (*.MYI) 发生了不可修复的错误,甚至是丢失了这个文件,你可以使用数据文件 (*.MYD) 和数据格式文件 (*.frm) 重新生成它。首先制作一个数据文件 (tblName.MYD) 的拷贝。重启你的 MySQL 服务并连接到这个服务上,使用下面的命令删除表的内容:
mysql DELETE FROM tblName;
在删除表的内容的同时,会建立一个新的索引文件。退出登录并重新关闭服务,然后用你刚才保存的数据文件 (tblName.MYD) 覆盖新的 (空) 数据文件。最后,使用 myisamchk 执行标准的修复 (上面的第二种方法),根据表的数据的内容和表的格式文件重新生成索引数据。
如果你的表的格式文件 (tblName.frm) 丢失了或者是发生了不可修复的错误,但是你清楚如何使用相应的 CREATE TABLE 语句来重新生成这张表,你可以重新生成一个新的.frm 文件并和你的数据文件和索引文件 (如果索引文件有问题,使用上面的方法重建一个新的) 一起使用。首先制作一个数据和索引文件的拷贝,然后删除原来的文件 (删除数据目录下有关这个表的所有记录)。
启动 MySQL 服务并使用当初的 CREATE TABLE 文件建立一个新的表。新的.frm 文件应该可以正常工作了,但是最好你还是执行一下标准的修复(上面的第二种方法)。
3、myisamchk 工具介绍(见 mysql 的官方手册)
可以使用 myisamchk 实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk 适用 MyISAM 表 (对应.MYI 和.MYD 文件的表)。
调用 myisamchk 的方法:
shell myisamchk [options] tbl_name …
options 指定你想让 myisamchk 做什么。在后面描述它们。还可以通过调用 myisamchk –help 得到选项列表。
tbl_name 是你想要检查或修复的数据库表。如果你不在数据库目录的某处运行 myisamchk,你必须指定数据库目录的路径,因为 myisamchk 不知道你的数据库位于哪儿。实际上,myisamchk 不在乎你正在操作的文件是否位于一个数据库目录;你可以将对应于数据库表的文件拷贝到别处并且在那里执行恢复操作。
如果你愿意,可以用 myisamchk 命令行命名几个表。还可以通过命名索引文件 (用“.MYI”后缀) 来指定一个表。它允许你通过使用模式“*.MYI”指定在一个目录所有的表。例如,如果你在数据库目录,可以这样在目录下检查所有的 MyISAM 表:
shell myisamchk *.MYI
如果你不在数据库目录下,可通过指定到目录的路径检查所有在那里的表:
shell myisamchk /path/to/database_dir/*.MYI
你甚至可以通过为 MySQL 数据目录的路径指定一个通配符来检查所有的数据库中的所有表:
shell myisamchk /path/to/datadir/*/*.MYI
推荐的快速检查所有 MyISAM 表的方式是:
shell myisamchk –silent –fast /path/to/datadir/*/*.MYI
如果你想要检查所有 MyISAM 表并修复任何破坏的表,可以使用下面的命令:
shell myisamchk –silent –force –fast –update-state
-O key_buffer=64M -O sort_buffer=64M
-O read_buffer=1M -O write_buffer=1M
/path/to/datadir/*/*.MYI
该命令假定你有大于 64MB 的自由内存。关于用 myisamchk 分配内存的详细信息,参见 5.9.5.5 节,“myisamchk 内存使用”。
当你运行 myisamchk 时,必须确保其它程序不使用表。否则,当你运行 myisamchk 时,会显示下面的错误消息:
warning: clients are using or havent closed the table properly
这说明你正尝试检查正被另一个还没有关闭文件或已经终止而没有正确地关闭文件的程序 (例如 mysqld 服务器) 更新的表。
如果 mysqld 正在运行,你必须通过 FLUSH TABLES 强制清空仍然在内存中的任何表修改。当你运行 myisamchk 时,必须确保其它程序不使用表。避免该问题的最容易的方法是使用 CHECK TABLE 而不用 myisamchk 来检查表
关于如何解决 mysql 错误……is marked as crashed and should be 的问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。