我在用delphi编一个数据库应用程序,想在程序中实现数据库的备份恢复。
用的是ADOQuery的 Restore database DataBaseName from disk='c:\data'这样一个
SQL语句,但执行时系统提示:“因为数据库正在使用,无法获得数据库的排它访问权”。这该如何解决呀?或有什么别的方法。给些提示定当重谢!

解决方案 »

  1.   

    在做数据库恢复的时候你不要连接要恢复的库
    连其他的库,常用的是master库
    然后执行你的语句
      

  2.   

    恢复时你必须确定没有人使用该数据库,如果你使用SQL SERVER你可以用
    select loginame from sysprocesses where host_name <> ''得到,然后kill进程后,就可以进行恢复了。
    KILL {spid | UOW} [WITH STATUSONLY] 
      

  3.   

    可以利用sql server 自代的DMO進行回覆sql連機幫助有相關介紹
      

  4.   

    谈谈我的想法;如果你在你的数据连接中建立恢复(备份可以实现)程序,则你的程序在运行,因而你的数据库在使用,所以如你的提示一样不能恢复,如果你退出你的 程序或是完全断开对你数据库的连接,在其他的数据库中建立连接并使用’restore database...‘就可以实现对你的数据库的恢复。(实际操作经验),可能还有其他的办法可以恢复数据,期望大家的详细解答!!!
      

  5.   

    ------------------------------------------------------------------
    最简单的SQL语句:备份与还原SQL Server自带的数据库在服务器上备份:
    use Northwind
    Backup database Northwind to disk='d:\Northwind_bak.dat' with initRESTORE DATABASE NorthNwind FROM DISK = 'd:\Northwind_bak.dat'------------------------------------------------------------------
    备份数据库这一操作在客户机上实现 
    客户机:machine
    共享目录:share (要完全共享,可写权限)backup:
    bakcup database dbname to disk='\\machine\share\data.bak' with init
    \\machine\share目录要有写权限。restore:
    restore database dbname from disk='\\machine\share\data.bak' 
    //
    备注:restore 语句有很多的选项,可以查看企业管理器的在线帮助。如下
      with replace, move 'dbname_dat' to 'c:\mssql7\data\dbname.mdf', 
       move 'dbname_log' to 'c:\mssql7\data\dbname.log'
    其中'c:\mssql7\data\'是服务器的目录,这点要注意------------------------------------------------------------------------------备份与还原数据库的相关内容:
    SQL Server 7.0数据库备份有四种:完全数据库备份、增量数据库备份、事务日志备份、数据库文件或文件组备份。在数据库崩溃时,应该首先尝试备份事务日志(这一点很重要),然后恢复最后的数据库备份、该次数据库备份后的所有增量备份,最后恢复事务日志备份,这样可以将数据库恢复到崩溃前的状态。备份是定期的,而不是实时的,所以利用备份并不能完全恢复数据库,它只能将数据库恢复到制作备份的那一刻 ...... 数据库日志是实时的,他忠实的记录下所有对数据库的更新操作。因此,当磁盘出现故障造成数据库损坏时,就可以首先利用备份恢复数据库(大部分数据),然后运行数据库日志,即将备份后所做的操作重新在做一遍,从而将数据库完全恢复。
    --备份完整的数据库---------------------------------------------------------------
    //创建一个备份设备:
    -- 1. Create the backup device for the full MyNwind backup.///
    USE master
    EXEC sp_addumpdevice 'disk', 'MyNwind_2', 'c:\mssql7\backup\MyNwind_2.dat'-- 2. Back up the full MyNwind database.BACKUP DATABASE MyNwind TO MyNwind_2--备份数据库的日志--------------------------------------------------------------- 
    --1. Create the log backup device.USE master
    EXEC sp_addumpdevice 'disk', 'MyNwindLog1', 'c:\mssql7\backup\MyNwindLog1.dat'--2.  Update activity has occurred before this point. Back up the log of the MyNwind database.BACKUP LOG MyNwind TO MyNwindLog1-------
    try
    AdoQuery1.Close;
    AdoQuery1.SQL.Clear;
    AdoQuery1.SQL.Add('backup database pubs');
    AdoQuery1.SQL.Add('to disk='+''''+edtPath.Text+'''');
    AdoQuery1.ExecSQL;
    except
      ShowMessage('备份数据库失败!');
      exit;
    end;
    注:参阅了《大本营3.0》
      

  6.   

    ADOQUERY用SQL语句:
    备份数据库: backup database @DatabaseName To DISK=@Filename WITH INIT
    恢复数据库: Restore Database @DatabaseName From DISK=@FileName 
    @DatabaseName :SQL SERVER数据库
    @FileName :备份的文件名
      

  7.   

    我用ESU兄的方法,备份前先断开自己的数据库(用ADOConnection1.Close),然后连接master,再备份。结果运行程序时,总是前两次不行,第三次后就行了,这是怎么回事啊?
      

  8.   

    你必须先执行下面的代码,关闭当前的数据库连接,然后再执行备份
    use master declare  @spid  int
    declare  getspid  cursor  for
    select  spid  from  sysprocesses  where  dbid=db_id(''使用数据库名'')
    open  getspid
    fetch  next  from  getspid  into  @spid
    while  @@fetch_status  <  >-1
    begin
    exec(''kill ''+@spid)
    fetch  next  from  getspid  into  @spid
    end
    close  getspid
    deallocate  getspid
    restore database 使用数据库名 from disk=''备份文件'';
      

  9.   

    正好刚刚解决了这个问题,主要:
    1.关闭其他连接数据库的程序;
    2.USE MASTER一下。还没解决的话MAIL我:[email protected] ,之后给你发个例程,还有谁要,就发吧。
      

  10.   

    procedure TMainForm.BackUpDatabseClick(Sender: TObject);
    begin
       if Application.MessageBox('是否备份数据库?','备份...',MB_OKCANCEL)=IDOK then
       begin
         with ADOCommand1 do
         begin
         CommandType:=cmdText;
         CommandText:='BACKUP DATABASE STUDENT to disk=''d:\STUDETN备份''';
         Execute;
         end;
         Application.MessageBox('备份成功!','备份',MB_OK);
       end
       else
           Application.MessageBox('备份出错!','备份',MB_OK);
    end;
      

  11.   

    实在不好意思,我写错了,应该是恢复数据库出现问题。
    恢复前先断开自己的数据库(用ADOConnection1.Close),然后连接master,再恢复。结果运行程序时,总是前两次不行,第三次后就行了。
      

  12.   

    要看是恢复那种数据库,SQL就是用他的系统命令来的好
      

  13.   

    恢复操作的时候,要把当前的数据库连接关闭,通过另一个
    TADOConnection连接到Master数据库上
    1. ADOConnection1 连接你的业务数据库。
    2. ADOConnection2 连接 MASTER 数据库。
    3. ADOCommand1.Connection := ADOConnection2;
    假设你的数据库名为: DataBaseName
    Button.OnClick:
    begin
      ADOConnection1.Connected := False;
      ADOCommand1.CommandText := 'BACKUP DATABASE DataBaseName TO DISK = ' + #39 + 'C:\KKK.BAK' + #39;
      ADOCommand1.Execute;
      ADOCommand1.CommandText := 'ALTER DATABASE DataBaseName SET OFFLINE WITH ROLLBACK IMMEDIATE';
      ADOCommand1.Execute;
      ADOCommand1.CommandText := 'RESTORE DATABASE DataBaseName FROM DISK = ' + #39 + 'C:\KKK.BAK' + #39;
      ADOCommand1.Execute;
      ADOCommand1.CommandText := 'ALTER DATABASE DataBaseName SET ONLINE WITH ROLLBACK IMMEDIATE';
      ADOCommand1.Execute;
      ADOConnection1.Connected := True;
      ADOTable1.Active := true;
    end;
      

  14.   

    to: jpyc(斯文)
      很高兴能得到你的实现程序,只可惜我用的是delphi6,里面好象没有SQLQu_BackUp这个控件啊。还是非常谢谢你!