大家好,请教一下关于SQL Server 2005 中,使用了这样的代码来备份还原数据库啊
备份:
SQL.Add('Use Master Backup database YLEMS To Disk=:A');
parameters.ParamByName('A').Value :=DirectoryListBox1.Directory+Label6.Caption还原:
sql.Add('Use Master Restore Database YLEMS From Disk=:A');
parameters.ParamByName('A').Value:=DirectoryListBox1.Directory+Files使用了backup好像已经可以备份出来一个数据库啦,而且还是10几兆的,但是还原的时候好像不行哦,还原不进去,不知道是什么原因呢,谢谢大家

解决方案 »

  1.   

    /*Example of backup
    BACKUP DATABASE AdventureWorks 
     TO DISK = 'Z:\SQLServerBackups\AdvWorksData.bak'
       WITH FORMAT;
    GO/* Example of restoring a to the point of failure */
    -- Step 1: Create a tail-log backup by using WITH NORECOVERY.
    BACKUP LOG AdventureWorks
       TO DISK = 'C:\AdventureWorks_Log.bck'
       WITH NORECOVERY;
    GO
    -- Step 2: Restore the full database backup.
    RESTORE DATABASE AdventureWorks
       FROM DISK = 'C:\AdventureWorks_Data.bck'
       WITH NORECOVERY;
    GO
    -- Step 3: Restore the first transaction log backup.
    RESTORE LOG AdventureWorks
       FROM DISK = 'C:\AdventureWorks_Log.bck'
       WITH NORECOVERY;
    GO
    -- Step 4: Restore the tail-log backup.
    RESTORE LOG AdventureWorks
       FROM  DISK = 'C:\AdventureWorks_Log.bck'
       WITH NORECOVERY;
    GO
    -- Step 5: Recover the database.
    RESTORE DATABASE AdventureWorks
       WITH RECOVERY;
    GO
      

  2.   

    --use master
    restore database MyDB from disk = 'E:\TDDownload\mydb_data_backup_200904290100.bak' with replace;我常用,强力恢复大法。
      

  3.   

    你好,刚刚试了use master 
    restore database MyDB from disk = 'E:\TDDownload\mydb_data_backup_200904290100.bak' with replace; 
    这个方法,在我的程序没有打开的时候,直接使用SQL SERVER 2005 执行SQL语句可以达到了还原的目的啦,但是如果把这个语句在程序运行期间执行,或者在程序中执行,都会不行啊,在sql server 2005 就提示这样啊:消息 3101,级别 16,状态 1,第 2 行
    因为数据库正在使用,所以无法获得对数据库的独占访问权。
    消息 3013,级别 16,状态 1,第 2 行
    RESTORE DATABASE 正在异常终止。好像是这个数据库正在使用不能还原啊,但是程序那里是打开了一些表格啊,不知这样怎样处理比较好呢?谢谢,
    如果在程序那里关闭了adoconnect连接,那样aodquery就不能执行这个sql语句啦,所以不知道怎样处理比较好呢?
    谢谢
      

  4.   

    备份的代码如下: 
         //开始备份      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;
       运行,还原成功!!但是數據庫會變爲脫機狀態,導致其他用戶不能連接。解決的辦法有两种: 一:用存储过程:  在master数据库中加入下面的存储过程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数据库被还原