在Delphi中备份和还原数据库

在Delphi中备份和还原数据库

作者:蔡华

日期:2006.5.29

  前几天高中同学叫我帮他改一下毕业设计,要改的部分是对MSSQL数据库的备份与还原,刚开始的时候还不知道怎么做,便到网上去找了一点资料来看,于是就动起手来写了,备份还算简单,但是在写还原的时候遇到了些问题,费了好大力才解决,这里要感谢coach兄,是他帮我搞定了,下面来说一下如何完成的.

    由于同学第一次写程序,所以和我刚刚接触程序一样,在每个窗口都用些ADOConnection,ADOQuery之类的,窗口的名字也是从Form1到Form16,单元的名字也是从Unit1到Unit16,看起来都头大啊!!所以一定要注意单元,窗口及变量的名命!!

    备份的代码如下:

     //开始备份

      with adoquery1 do
       begin
             close;
             sql.Clear;
             sql.Add('Backup database library to disk=:p1 with init');
             parameters.ParamByName('p1').Value:=self.SaveDialog1.FileName;
            try
                Execsql;
               ShowMessage('备份成功!!');
            except
                ShowMessage('备份失败!!');
                exit;
            end;
       end; //End of 备份

  下面来说一下还原,还原与备份不一样,备份不需要关闭数据库,但还原就要先关闭数据库才行.第一次写的代码如下:

       with ADOQuery1 do
         begin
            Close;
            SQL.Clear;

            SQL.Add('use master alter database library set offline WITH ROLLBACK IMMEDIATE ');
            SQL.Add('restore database library from disk=:p1 with REPLACE');
            SQL.Add('alter database library set online with rollback immediate');
            parameters.ParamByName('p1').Value := self.Edit1.Text;
            try
              ExecSQL;
              ShowMessage('还原成功!!');
            except
              Showmessage('还原失败!!');
              exit;
            end;
         end;
   运行,还原成功!!但是.....SQL中Library数据库变为脱机了!!导致程序的其他部份不能连到数据库上去!!怎么办??然后又去优快云发帖子问了一下,回答的人不多,也没有解决到问题.在搜索这类问题的时候发现竟然还有人和我一样遇到了这类问题,其中有个叫sxtdxvb的回答了他的问题,并说出了他的QQ,哈哈,马上加他.在他的帮助下,答案终于浮出水面.我总结了一下,有两种方法:

 一:用存储过程:

  在master数据库中加入下面的存储过程(sxtdxvb提供)

if exists(select name from sysobjects where name='usp_restoredb')
 drop proc usp_restoredb
go
/*
exec usp_restoredb "library","D:/dbbak.bak"
*/
create proc usp_restoredb

 @dbname  varchar(255),   --数据库名字
 @filepath varchar(255)    --文件路径
)
as
set nocount on
--exec ('use master go')
exec ('alter database '+@dbname+' set offline WITH ROLLBACK IMMEDIATE')
exec ('restore database '+@dbname+' from disk="'+@filepath+'" with REPLACE')
exec ('alter database '+@dbname+' set online with rollback IMMEDIATE')
if @@error<>0
begin
 select 'F','数据库恢复失败'
 return
end
else
begin
 select 'T','数据库恢复成功'
 return 
end

运行.

  然后在Delphi的调用这一存储过程,调用过程如下:

//注意:这时的ADOQuery1要连到master数据库,不能连到library数据库!! 

with ADOQuery1 do
    Begin
      Close;
      SQL.Clear;

 // filename是你备份文件的路径加文件名
      SQL.Add('exec usp_restoredb "Library","'+ filename+'"');
      Open;
      if ADOQuery1.Fields[0].AsString='F' then
        ShowMessage('还原失败!!')
      else
        ShowMessage('还原成功!!');
    end;

 运行成功!且library数据库不会变为脱机!

 第二种方法:

  也是运行ADOQuery1来实现,不用存储过程,ADOQuery1一定要连到master数据库,否则就会让library脱机!,代码如下:

begin
  DataModule17.ADOConnection1.Close;//这个是连到library数据库的,所以要先断开
 with ADOQuery1 do
         begin
            Close;
            SQL.Clear;

            SQL.Add('use master alter database library set offline WITH ROLLBACK IMMEDIATE ');
            SQL.Add('restore database library from disk=:p1 with REPLACE');
            SQL.Add('alter database library set online with rollback immediate');
            parameters.ParamByName('p1').Value := self.Edit1.Text; //显示备份文件的路径和文件名
            try
              ExecSQL;
              ShowMessage('还原成功!!');
            except
              Showmessage('还原失败!!');
              exit;
            end;
         end;
  end; //End Of 还原数据库

运行成功!library数据库被还原,不会脱机,哈哈!

以上程序仅供参考,有什么不对的地方还请多多指教!

一、 需求分析目前在不少部门存储着大量的数据,包括数据库数据文件数据,并处于不断更新、不断扩充的状态。数据量大,数据源分布广,同一设备上数据分布散等特点使得对这些数据维护管理有一些困难。为防止数据因某些不可控制的事故而丢失,对上述数据必须进行备份,以备在主数据丢失时,进行还原。目前的备份手段多为人工定期(不定期)地进行,这样就存在着以下一些问题:1.人工备份多在正常工作期间进行,这样数据备份时很可能会影响数据在正常业务中的使用,会造成业务应用系统性能不稳定,严重的还会造成数据丢失。2.由于数据分布散,人工备份时难于及时掌握数据更新动态,为防止数据备份有丢失,往往只能“一锅炖”,每次都做完整性拷贝,这样每次备份量将叠加,备份延时将增加,造成网络资源浪费,网络流量增加,从而可能会对网络的日常通信造成影响。3.工作烦琐,操作不方便。 二、 系统介绍1. 系统简介软件可自动完成SQL Server数据库文档的数据定时自动备份,由用户选择对哪些数据库或文档进行数据备份,提供对备份还原数据作业的管理、分析、日志跟踪等功能。2.软件功能: (1)自动生成备份指令,减少备份的难度,一般用户也可操作,也可由技术人员设好后发给用户。 (2)定时备份按用户的设定的作业时间自动执行。 (3)支持用户任意时刻的手动备份。 (4)支持数据的完整备份、差异备份、增量备份(该项功能目前只用于文件项目)。 (5)完善的数据库还原功能,随时可能数据进行还原操作。 (6)操作日志跟踪功能。用户的操作都保留在日志中,以供备备察。 (7)系统维护提供对备份数据、日志、操作日志的清理功能。3.解决问题针对人工数据备份存在的问题,结合单位生活生产情况,该软件能够基本上解决目前人工数据备份的弊端。(1)通过设置定时备份时刻,从而可以避开数据日常的业务工作期,选择夜间没有数据访问或很少数据访问的时间进行。(2)通过设置备份方式(如:差异备份、增量备份),可以避免每次备份不必要重复备份量。(3)通过对日志的跟踪,可以很快很及时地了解数据备份情况(包括每次的耗时、备份量等)。(4)人力资源消耗降低到几乎为零。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值