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毫秒