InterBase数据库文件损坏的修复方法
InterBase数据库是一种中级数据库,它短小精悍免维护,可以满足百万记录级别的数据库应用,又有开放源码版本,个人认为是一种比较适合中小型数据库应用环境的数据库管理系统(DBMS)。Delphi内建了对InterBase数据库的支持,因此用Delphi编写以InterBase为后台数据库的软件很是方便。
在实际应用中,偶尔会碰到InterBase数据文件损坏的问题。损坏的原因多种多样,可能是由于读写文件的时候突然断电导致文件损坏,或者可能是不当的操作引发的;如果没有合适的工具,很多情况下损坏的数据库文件就只有废弃不用,造成数据的丢失,其实,InterBase本身提供了一组修复命令行程序,如果能合理的利用它们,的确可以修复大部分损坏的InterBase数据库文件。
假设现在有一个损坏的InterBase数据库文件IBBadDB.gdb,修复方法如下:
1、确定InterBase正常运行,而受损的数据库文件IBBadDB.gdb没有被任何程序打开;
2、将安装以后的InterBase文件夹下的bin子文件夹内的两个程序gfix.exe,gbak.exe拷贝到受损的数据库文件IBBadDB.gdb所在的文件夹内;
3、打开DOS命令行界面,用DOS命令先进入IBBadDB.gdb所在的目录(文件夹)下;
4、定义两个全局变量,分别赋值为IBBadDB.gdb的用户名和密码(默认情况下,是SYSDBA和masterkey),接下来的修复程序能使用它们顺利打开受损的数据库文件:
SETISC_USER=SYSDBA
SET ISC_PASSWORD=masterkey
5、检查数据库文件是否损坏:
gfix-v -full IBBadDB.gdb
6、如果检查结果中报告有问题,运行下面修复文件的命令:
gfix-mend -full -ignore IBBadDB.gdb
7、然后检查此时的数据库文件是否已经修复:
gfix-v -full IBBadDB.gdb
8、如果检查结果中仍旧有问题,应该运行一次完整的数据库备份和恢复命令(此例中假设备份以后的数据库文件名称是IBBadDB_bak.gbk),首先是备份:
gbak-backup -v -ignore IBBadDB.gdb IBBadDB_bak.gbk
9、如果上述备份命令的运行遇到问题,是因为冗余数据收集(garbage collection)而产生的,那就继续执行下面的(数据库冗余清理)命令:
gbak-backup -v -ignore -garbage IBBadDB.gdb IBBadDB_bak.gbk
10、如果上述命令的运行遇到问题,是因为边际事务处理(limbotransaction,可能翻译的不准确)的缘故,那就在上述命令行参数中加上“-limbo”开关:
gbak-backup -v -ignore -garbage -limbo IBBadDB.gdb IBBadDB_bak.gbk
11、后根据这个修复的备份文件,产生一个新的数据文件(此例中假设新数据库文件名称是IBBadDB_new.gdb),
gbak-create -v IBBadDB_bak.gbk IBBadDB_new.gdb
注:
1、此方法经过实际应用中多次实践的考验,证明相当有效,对InterBase数据库文件的修复成功率至少在75%以上;
2、以上步骤基本是是翻译至原始资料,但根据笔者实际应用中的经验,上述每一步的执行均对其他步骤无干扰,所以无论上一步执行结果如何,下一步都应该运行一次;
3、这个修复方法依赖于InterBase系统提供的gfix.exe,gbak.exe两个程序,如果有可能,将上述所有步骤做成批处理文件,和这两个程序拷贝到一起,这样就可以一次性运行之,也便于反复使用;
4、笔者恐翻译的不够准确,故附上原始资料如下:
1.Define the following two variables, it makes life easier, in that you do nothave to type in the user name and password every time you issue a command.
SETISC_USER=SYSDBA
SET ISC_PASSWORD=masterkey
2. Always make sure you work on a copy of the database, not the productiondatabase. Use the operating system to make a copy of the database. You musthave exclusive access to the database to do this.
copyemployee.gdb database.gdb
3. Now check for database corruption. You must have exclusive access to dothis, but since you're working on a copy of the original database, this is nota problem.
gfix-v -full database.gdb
4. If the previous command has indicated that there are problems with thedatabase, we now need to mend it.
gfix-mend -full -ignore database.gdb
5. Now check to see if the corruption has been repaired.
gfix-v -full database.gdb
6. If you still see errors, you should now do a full backup and restore. In itssimplest format the backup command line should be:
gbak-backup -v -ignore database.gdb database.gbk
7. However if gbak falls over because it is having trouble with garbagecollection, then
use the following command:
gbak-backup -v -ignore -garbage
database.gdb database.gbk
8. If there is corruption in record versions of a limbo transaction, then youmay need to include the -limbo switch:
gbak-backup -v -ignore -garbage -limbo
database.gdb database.gbk
9. Now create a new database from the backup:
gbak-create -v atlas.gbk atlas_new.gdb
gfix工具的详细使用说明:
使用命令行工具gfix可以进行如下维护工作:
1)数据库关闭
2)改变数据库模式:只读、读写
3)改变数据库的Dialect
4)设置数据库的缓存
7)清扫数据库
要使用 gfix,必须是超级用户或者是数据库的宿主。
-m[end]:数据修复。将损坏的记录标记为。这些记录在诸如备份等操作中就被忽略。
-n[o_update]:数据修复。和-v 选项一起使用,校验损坏或错误分配的结构,只报告但不修复。
-pa[ssword] text:提供远程访问时的密码。
-p[rompt]:事务恢复。和-l 选项一起使用,在事务恢复过程中提示有关动作。
-r[oolback]{ID|all}:事务恢复。回退由 ID 指定的 Limbo 事务或回退所有 Limbo 事务。
-s[weep]:数据库清扫。强制立刻执行数据库清扫。当自动数据库清扫禁止时特别有用,该操作不要求独占数据库。
5)提交遗弃事务
6)维护数据库并进行一定的修复
8)显示、提交、恢复遗弃事务
gfix的语法是:gfix[option] db_name,其中,db_name是数据库名称,option是gfix选项。
option选项如下:
-ac[tivate]:当数据库时激活数据库影像。语法是:gfix -ac;不加数据库名字。
-at[tach] n:关闭数据库。和-shut一起使用,在数据库关闭期间阻止新的连接。如果超时n秒后仍有连接在工作,关闭被取消。
-b[uffers] n:设置数据库默认的缓存为n个数据页大小。
-ca[che] n:为将来功能保留。
-c[ommit]{ID|all}:事务恢复。提交由ID指定的Limbo事务或提交所有的Limbo事务。
-f[orce] n:数据库关闭。和-shut一起使用,在n秒后强制关闭数据库。
-f[ull]:数据修复。和-v一起使用,检查记录和数据页结构,释放未分配的记录段。
-h[ouskeeping] n:数据库清扫。设置自动清扫阀值为n个事务,当n为0时,则禁止自动清扫。缺省值是20000个事务,操作时不需要独占数据库。
-I[gore]:数据修复。当数据库进行校验或清扫时忽略校验和错误。
-l[ist]:事务恢复。显示每个Limbo事务的ID号,指明当-t选项使用进行自动两阶段提交时发生什么。
-mo[de][read_write[[read_only]:设置数据库模式为只读或读写。缺省为读写模式。该操作要求独占数据库。
-o[nline]:数据库关闭。取消一个安排好的-shut操作,或废除当前正在起作用的关闭操作。
-s[ql_dialect] n:改变数据库的dialect。
-sh[ut]:关闭数据库,必须和-attch、-force 或-tran 一起使用。
-t[wo_phase]{ID|all}:事务恢复。对 ID 指定的 limbo 事务或所有 limbo 事务执行自动两阶段恢复。
-tr[an] n:数据库关闭。和-shut 一起使用在数据库关闭期间阻止任何新的事务。
-user name:远程登录,检查用户的有效性。
-v[alidate]:数据修复。查找并释放已经定位但未分配给任何数据结构的页,同时报告损坏的结构。
-z:显示 gfix 和 InterBase 引擎版本号。
Country(31)
-w[rite][sync|async]:数据库写方式控制。设置是同步写(强制写)还是异步写(缓存写)。
-z:显示 gfix 和 InterBase 引擎版本号。
相关文章