Database 版 (精华区)
发信人: sleep (休息休息), 信区: Database
标 题: VFP数据库备分方法
发信站: 哈工大紫丁香 (2000年12月04日14:06:00 星期一), 站内信件
Foxpro数据库备份与恢复的彻底解决办法
作者:皮小平
在MIS管理系统中,数据库是十分重要的,这就需要我们在系统开发中考虑到数据库的备份恢复,
为此,我们探索出一种行之有效的解决办法,以供大家参考。
一、 普通数据库备份与恢复的原理
这里所讲的普通数据库是指容量比较小的库文件,容量不超过一张磁盘,对这种数据库,常用备份的
方法是用Copy to 〈file〉直接拷贝库记录,这种方法可拷贝数据库中包括Memo和General在内的所有字段,
编码简单,恢复时直接对记录进行操作,速度快而准确,唯一不足是占用磁盘空间比较大。
二、 大型数据库备份与恢复的原理
■问题的提出
在一个系统中,当一个库文件大于1.44M时,无法用一张软盘进行备份,特别是系统在执行过程中往往
提示用户没有足够的磁盘空间存储文件,从而不但破坏了应用软件的界面,而且无法达到备份数据的目的。
■分析
在Copy to 〈file〉[〈scope〉]命令中,它可以将目前工作区中数据库的记录全部或部分拷贝到另一
个数据库文件中去。〈file〉是指定的文件名,系统默认扩展名为.dbf;〈scope〉关键字设定拷贝记录范
围,我们得用〈scope〉关键字控制记录拷贝操作,将适当的记录数备份到软盘上,这样就可以解决一张磁
盘装不下的问题了。而恢复的动作正好相反,我们只要利用命令将备份到各个磁盘的数据记录合并就可以了。
■具体实现步骤
1、 首先我们把默认路指向备份软盘所在驱动器,使用diskspace()函数计算备份软盘的剩余空间;接着
使用recsize()函数对需要备份的数据库中的每条记录长度进行计算,然后用测试得的可用空间除以
记录的长度,我们就能确定该软盘剩余空间能够备份数据库中几条记录了。
2、 将指定的数据记录备份到软盘
当计算的备份记录数大于数据库的记录数(用Reccount()函数可测得当前工作区中数据库的记录数)
时,直接用Copy to 〈file)备份(也即普通数据库的备份方法)。否则先移动记录指针到开始备份
的记录号上,然后Copy to 〈file〉 Next 〈备份记录数〉备份,下一张盘子备份时让指针后移已备
份的记录数数目条记录。
3、 作好备份盘号,记录数等标记
为了备份盘管理和以后恢复时能够按正确的顺序进行,我们在拷贝完后,要将每一张盘的备份情况
存入备份设置文件中,以便恢复程序能够识别备份盘。
4、恢复时读取备份设置文件以确认插入正确的备份磁盘,将原库中的记录全部删除,直接用Append命令
将备份盘上的数据加入到数据库中。
三、 实例
这是一个完整的实例程序,将以上所讲的两种情况下的备份和恢复全部考虑到了,且适合任何版本的Foxpro
,你只要稍加修改就可以用到你的应用程序当中。
备份设置文件Backup.cfg是一个数据库文件,程序中需要用到,其数据库结构如下:
Field Field Name Type Width Dec Index
1 DISKINFO Character 8
2 DISKNO Numeric 3
** Total ** 12
1.备份程序
set talk off
SET SAFE OFF
clea
DISKALL=0
sele a
use BB
RESIZE=RECSIZE()+2800
RECC=RECCOUNT()
sele b
use backup.cfg
zap
sele a
GO TOP
do whil .not. eof()
?'请插入第'+STR(DISKALL+1,3,0)+'张备份盘,然后按任意键继续'
wait''
SET DEFA TO A:
DISKSP=DISKSPACE()
RENUB=DISKSP/RESIZE
FILE=SYS(3)
FILENAME='A:\'+FILE
COPY TO &FILENAME NEXT RENUB
SET DEFA TO
DISKALL=DISKALL+1
SELE B
APPE BLAN
REPL DISKINFO WITH FILE
REPL DISKNO WITH DISKALL
SELE A
enddo
?'备份完毕,共'+str(diskall,3,0)+'张磁盘'
close all
return
2.恢复程序
set talk off
SET SAFE OFF
clea
sele a
use BB
ZAP
sele b
use backup.cfg
do whil .not. eof()
?'请插入第'+STR(DISKNO,3,0)+'张恢复盘,然后按任意键继续'
wait''
BACKUP='A:\'+DISKINFO
IF .NOT. FILE(BACKUP)
?'磁盘不对'
LOOP
ENDI
SELE A
APPE FROM &BACKUP
SELE B
SKIP
enddo
?'恢复完毕,共'+str(diskNO,3,0)+'张磁盘'
close all
return
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.882毫秒