这些东西都是从其它地方找来的一些解决MYSQL数据库这个错误的方法。并不一定适用于神迹数据库。只供參考一下。详细的解决方法还是须要摸索。也可能当中随意方法都能够适用于本数据库。
我临时没有条件測试,有条件的去測试一下。有望解决数据库报此错误的问题。
(一)
昨晚浏览自己的Blog的时候,突然发现全部页面都无法显示,到后台查看的时候。发现一个”Table ‘xxx’ is marked as crashed and should be repaired” 的错误。连忙上网搜索,原来改动这个严重的错误非常easy:
1. 进入管理mysql的phpmyadmin
2. 在左则选中自己的数据库
3. 在右则勾选中错误信息中的那个’xxx’表
4. 滚动屏幕到以下,有个下拉菜单(With selected:),选择”Repair table”
实质就是运行命令:repair table tablename
改动之后,并没有发现有什么数据损失。连忙备份了一份数据库到邮件里面。备份还是非常重要的!
(二)
现象:
mysql> use yourealcn
Database changed
mysql> select user,company from biz_user where commend='1' order by regtime desc,checked desc limit 0,5;
ERROR 145 (HY000): Table './yourealcn/biz_user' is marked as crashed and should be repaired
mysql> exit
使用命令myisamchk修复数据库的MYI文件就可以
# /usr/local/mysql5/bin/myisamchk -c -r /bak/lib/mysql/yourealcn/biz_user.*
myisamchk: error: '/bak/lib/mysql/yourealcn/biz_user.frm' is not a MyISAM-table
---------
myisamchk: error: '/bak/lib/mysql/yourealcn/biz_user.MYD' is not a MyISAM-table
---------
- recovering (with sort) MyISAM-table '/bak/lib/mysql/yourealcn/biz_user.MYI'
Data records: 20414
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
(三)
Caused by: java.sql.SQLException: Table '表名' is marked as crashed and should be repaired
解决的方法:
./myisamchk -c -r 数据库表MYI文件的路径(比如:/home/mysql/var/crawlerfeedsky/aaaa.MYI)
假设还不行。就-f 强制修复
(四)
今天上server一看。发现网页错误,无法连接数据库server。mysql服务自己down掉了,然后又一次启动server,发现网页无法打开,提示: [mysql]Table tblName is marked as crashed and should be repaired
Mysql提示tblName表格已损坏。须要修复,解决方法:
进入到相应的数据库文件夹:
cd /var/lib/mysql/dbname
使用myisamchk修复:
shell> myisamchk -r tblName
(五)
我用的修复命令是:myisamchk -r bbsthreads
当中bbsthreads是我出问题的表名,当然使用这个命令还得进入mysql你所出问题的数据库的表的存放路径,具体更具体的命令能够看帮助:myisamchk --help。
假设用以上命令你不能解决这个问题请看后面,后面的内容是我转载的。
我的站点出问题了,訪问一看,果然全屏报错,检查mysql日志,错误信息为:
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数据库由于某种原因而受到了损坏,如:数据库server突发性的断电、在提在数据库表提供服务时对表的原文件进行某种操作都有可能导致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
推荐的高速检查全部MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir*.MYI
该命令假定你有大于64MB的自由内存。关于用myisamchk分配内存的具体信息,參见5.9.5.5节,“myisamchk内存使用”。
当你执行myisamchk时,必须确保其他程序不使用表。否则,当你执行myisamchk时。会显示以下的错误消息:
warning: clients are using or haven't closed the table properly
这说明你正尝试检查正被还有一个还没有关闭文件或已经终止而没有正确地关闭文件的程序(比如mysqldserver)更新的表。
假设mysqld正在执行,你必须通过FLUSH TABLES强制清空仍然在内存中的不论什么表改动。
当你执行myisamchk时,必须确保其他程序不使用表。避免该问题的最easy的方法是使用CHECK TABLE而不用myisamchk来检查表