InterBase数据库文件损坏的修复方法
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
- 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
- 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
- If the previous command has indicated that there are problems with thedatabase, we now need to mend it.
gfix-mend -full -ignore database.gdb
- Now check to see if the corruption has been repaired.
gfix-v -full database.gdb
- 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
- 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
- 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
- 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 引擎版本号。