数据库损坏了还能修复吗(修复损坏的Foxpro数据库)
本文目录
修复损坏的Foxpro数据库
目前在我国,有相当一部分正在运行应用程序是用Foxpro 编写的,由于突然断电、程序非法关闭等原因,经常会导致Foxpro数据库.DBF文件被破坏,如果数据库被破坏了,用Foxpro打开数据库.DBF时,会出现"notatable/dbf"错误提示,导致无法用Foxpro打开。
首先介绍一下Foxpro数据库.DBF的文件结构:
Foxpro数据库*.DBF的文件结构由头记录和数据记录组成,头记录定义该DBF的结构并包含与该库相关的其它信息。头记录由文件位置0字节开始。
数据库头部几个关键字节含义如下:(注:库文件中存储整数时低位字节在前)
字节偏移说明
0 库文件的版本类型
1-3 最近更新的日期(YYMMDD)
4-7 库文件中记录的个数
8-9 第一条记录的起始位置
10-11 一条记录的长度(包括删除标记)
其它字节的具体描述不在此赘述,可以参考有关部门书籍或者程序开头注释部分。
在实际工作中发现,许多情况下数据库错误都是由于记录个数比实际记录个数大1个,以至于数据库无法用打开。
主要通过以下两种办法来对数据库进行修复。
一、用Pctools、NU的Diskedit等工具软件进行恢复:
运行Pctools,选中无法打开的数据库,按E文件进入我功能,按F1切换显示模式。
按F3进行我,将开始的第5个字节值减1,按F5存储,然后退出Pctools,启动Foxpro, 发现被破坏的数据库可以打开使用了。
由于许多操作者并不一定熟悉如何使用Pctools,因此我建议大家可以用比较熟悉的Excel程序根据下面的步骤来进行数据库的恢复。
二、用Excel进行恢复。
启动Excel,选择"打开"按钮,出现打开对话框,在打开文件类型中选择Dbase/Foxpro(*.DBF)文件类型,再选中被破坏的数据库打开,这时不要做更改,只选择"保存"按钮,会出现"另存为"对话框,仍选择以原来文件名保存,会提示"文件已经存在,是否替换已有文件?",选择"是"。
然后选择"文件"菜单上的"关闭",会出现提示"数据库文件不是Excel格式,要保留修改吗?
要保存为Excel格式,单击’是’,然后在’保存类型’下拉列表框选’Excel工作簿’;
要用现有格式保存并替换原来的文件,单击’是’,然后单击’保存’;
要在关闭文件时维持现有格式并不作保存,单击’否’。"
由于我们并没有对数据库的记录进行改动,只是为了恢复数据库,所以选择最后一项"在关闭文件时维持现有格式并不作保存",因此单击"否",退出Excel。
启动Foxpro,再次打开数据库文件,发现数据库文件已可以被打开了,但是观察数据库的结构,会发现数据库结构中的索引不见了,不过数据库的索引文件还存在。我们只需要给数据库Add索引,并选择原来的索引文件Open即可。
添加索引文件后退出数据库结构设置,并对数据库重新索引一下,就可以继续使用原 来被破坏的数据库了。
数据库损坏了怎么办
有的时候因为掉电或者其他原因导致数据库损坏,我们可以使用mysql自带的mysqlcheck命令来快速修复所有的数据库或者特定的数据库;例如
检查优化并修复所有的数据库用:
#mysqlcheck-A-o-r-p
Enterpassword:
database1OK
database2OK
----------
修复指定的数据库用
#mysqlcheck-A-o-rDatabase_NAME-p
即可
另外如果只是对某个表进行修复可以用:myisamchk或isamchk
其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:
myisamchktablename.MYI
进行检测,如果需要修复的话,可以使用:
myisamchk-oftablename.MYI
关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保My**L服务器没有访问这个数据表,保险的情况下是最好在进行检测时把My**L服务器Shutdown掉。
另外可以把下面的命令放在你的rc.local里面启动My**L服务器前:
&&/pathtochk/myisamchk-of/DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是My**L**的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的My**L数据库存放的位置。
1,简单的修复模式
myisamchk-r-qpath/数据库/坏表.MYI
注:-r----恢复模式-q----快速修复
2,使用安全修复模式
myisamchk--safe-recoverpath/数据库/坏表.MYI
3,困难的修复模式
如果在索引文件的第一个16K块被破坏,或包含不正确的信息,或如果索引文件丢失,你只应该到这个阶段。在这种情况下,创建一个新的索引文件是必要的。按如下这样做:
把数据文件移更安全的地方。
使用表描述文件创建新的(空)数据和索引文件:
shell》mysqldb_name
mysql》DeleteFROMtbl_name;
mysql》quit
将老的数据文件拷贝到新创建的数据文件之中。(不要只是将老文件移回新文件之中;你要保留一个副本以防某些东西出错。)
回到阶段2。现在myisamchk-r-q应该工作了。(这不应该是一个无限循环)。
4,非常困难的修复模式
只有描述文件也破坏了,你才应该到达这个阶段。这应该从未发生过,因为在表被创建以后,描述文件就不再改变了。
从一个备份恢复描述文件并且回到阶段3。你也可以恢复索引文件并且回到阶段2。对后者,你应该用myisamchk-r启动。
如果你没有一个备份但是确切地知道表是怎样被创建的,在另一个数据库中创建表的一个拷贝。删除新的数据文件,然后从其他数据库将描述和索引文件移到破坏的数据库中。这给了你新的描述和索引文件,但是让数据文件独自留下来了。回到阶段2并且尝试重建索引文件。
5,优化表结构
myisamchk-r表
也可以使用sql语句来优化OPTIMIZETABLE
本方法参考自mouse博客
mysql数据文件破坏后的修复方法
由于临时断电 使用kill 中止My**L服务进程 所有的这些都可能会毁坏My**L的数据文件 如果在 *** 扰时 服务正在改变文件 文件可能会留下错误的或不一致的状态 因为这样的毁坏有时是不容易被发现的 当你发现这个错误时可能是很久以后的事了 于是 当你发现这个问题时 也许所有的备份都有同样的错误
My**L参考手册的第十五章讲述了My**L自带的myisamc的功能 以及如何使用它检查和修复你的My**L数据文件 虽然这一章对于每个想要搭建一个强壮的My**L服务的人都是推荐阅读的 我们还是有必要在这里对其中的要点进行讨论
在我们继续之前 你必须意识到myisamc程序对用来检查和修改的My**L数据文件的访问应该是唯一的 如果My**L服务正在使用某一文件 并对myisamc正在检查的文件进行修改 myisamc会误以为发生了错误 并会试图进行修复 这将导致My**L服务的崩溃!这样 要避免这种情况的发生 通常我们需要在工作时关闭My**L服务 作为选择 你也可以暂时关闭服务以制作一个文件的拷贝 然后在这个拷贝上工作 当你做完了以后 重新关闭服务并使用新的文件取代原来的文件(也许你还需要使用期间的变更日志)
My**L数据目录不是太难理解的 每一个数据库对应一个子目录 每个子目录中包含了对应于这个数据库中的数据表的文件 每一个数据表对应三个文件 它们和表名相同 但是具有不同的扩展名 tblName frm文件是表的定义 它保存了表中包含的数据列的内容和类型 tblName MYD文件包含了表中的数据 tblName MYI文件包含了表的索引(例如 它可能包含lookup表以帮助提高对表的主键列的查询)
要检查一个表的错误 只需要运行myisamc(在My**L的bin目录下)并提供文件的位置和表名 或者是表的索引文件名
myisamc /usr/local/mysql/var/dbName/tblName myisamc /usr/local/mysql/var/dbName/tblName MYI
上面的两个命令都可以执行对指定表的检查 要检查数据库中所有的表 可以使用通配符
myisamc /usr/local/mysql/var/dbName/* MYI
要检查所有数据库中的所有表 可以使用两个通配符 myisamc /usr/local/mysql/var/*/* MYI
如果不带任何选项 myisamc将对表文件执行普通的检查 如果你对一个表有怀疑 但是普通的检查不能发现任何错误 你可以执行更彻底的检查(但是也更慢!) 这需要使用 extend check选项
myisamc extend check /path/to/tblName
对错误的检查是没有破坏性的 这意味着你不必担心执行对你的数据文件的检查会使已经存在的问题变得更糟 另一方面 修复选项 虽然通常也是安全的 但是它对你的数据文件的更改是无法撤消的 因为这个原因 我们强烈推荐你试图修复一个被破坏的表文件时首先做个备份 并确保在制作这个备份之前你的My**L服务是关闭的
当你试图修复一个被破坏的表的问题时 有三种修复类型 如果你得到一个错误信息指出一个临时文件不能建立 删除信息所指出的文件并再试一次 这通常是上一次修复操作遗留下来的 这三种修复方法如下所示
myisamc recover quick /path/to/tblName myisamc recover /path/to/tblName myisamc safe recover /path/to/tblName
第一种是最快的 用来修复最普通的问题 而最后一种是最慢的 用来修复一些其它方法所不能修复的问题
检查和修复My**L数据文件 如果上面的方法无法修复一个被损坏的表 在你放弃之前 你还可以试试下面这两个技巧
如果你怀疑表的索引文件(* MYI)发生了不可修复的错误 甚至是丢失了这个文件 你可以使用数据文件(* MYD)和数据格式文件(* frm)重新生成它 首先制作一个数据文件(tblName MYD)的拷贝 重启你的My**L服务并连接到这个服务上 使用下面的命令删除表的内容
mysql DELETE FROM tblName;
在删除表的内容的同时 会建立一个新的索引文件 退出登录并重新关闭服务 然后用你刚才保存的数据文件(tblName MYD)覆盖新的(空)数据文件 最后 使用myisamc执行标准的修复(上面的第二种方法) 根据表的数据的内容和表的格式文件重新生成索引数据
如果你的表的格式文件(tblName frm)丢失了或者是发生了不可修复的错误 但是你清楚如何使用相应的CREATE TABLE语句来重新生成这张表 你可以重新生成一个新的 frm文件并和你的数据文件和索引文件(如果索引文件有问题 使用上面的方法重建一个新的)一起使用 首先制作一个数据和索引文件的拷贝 然后删除原来的文件(删除数据目录下有关这个表的所有记录)
启动My**L服务并使用当初的CREATE TABLE文件建立一个新的表 新的 frm文件应该可以正常工作了 但是最好你还是执行一下标准的修复(上面的第二种方法)
可以使用mysql语句 用 CHECK TABLE $table; //其中$table代表数据表的名字 检测表是否损坏 如果损坏可以REPAIR TABLE $table 来修复 如果一次不行 可以多修复几次!
如果使用WIN服务器 可以先**DB服务器 进入此路径 不用进mysql里
D:\CD MY**L
D:\mysql》CD BIN
D:\mysql\bin》MYISAMCHK r d:\mysql\data\guild\msg_table myi(msg_table) check key delete chain check record delete chain recovering (with sort) MyISAM table d:\mysql\data\guild\msg_table myi Data records: Fixing index
D:\mysql\bin》MYISAMCHK safe recover d:\mysql\data\guild\msg_table myi recovering (with keycache) MyISAM table d:\mysql\data\guild\msg_table myi Data records:
D:\mysql\bin》
当不知道哪个表坏了 可以进入mysql数据库: use guild; desc msg_table; 看msg_table有没有坏
lishixinzhi/Article/program/My**L/201311/29485更多文章:
clearinterval怎么读(JS的clearInterval()不起作用,应该怎么写才对)
2026年4月15日 11:00
js点击按钮弹出文本框(用PHP和JS怎么实现鼠标点击“评论”两个字之后在下面弹出文本框,就是类似QQ空间心情评论那种,在线等)
2026年4月15日 10:20
素数c语言程序编写100以内(输出100以内的质数,用c语言编写)
2026年4月15日 10:00
mysql查看数据库代码(怎么查看ubuntu mysql数据库)
2026年4月15日 08:40
正则表达式半小时入门(正则表达式好难懂,求高人指点,怎么学有什么好的理解方法没有看到那一串符号,晕了)
2026年4月15日 08:20




