SQL數據庫有關備份和恢復的語句及操作

備份的代碼如下: 
     //開始備份

      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數據庫被還原


PS: sql server 還原數據庫時提示數據庫正在使用,無法進行操作的解決方法

sql server 還原數據庫時提示:數據庫正在使用,無法進行操作的解決方法
這個問題的原因在於有用戶連接了當前要做還原的數據庫,這裏的用戶甚至包括當前要做還原的用戶。解決辦法就是關閉與要還原數據庫的所有連接。
腳本之家小編推薦的一個方法:到服務裏面重啓下sqlserver服務即可。
問題一描述:SQL Server數據庫備份還原後,在數據庫名稱後會出現“受限制訪問”字樣

問題二描述:在對SQL Server數據庫進行還原時,提示:System.Data.SqlClient.SqlError:因爲數據庫正在使用,所以無法獲得對數據庫的獨佔訪問權。(Microsoft.SqlServer.Smo)。出現此問題的原因是在還原數據庫時,有其他用戶正在使用數據庫。還原數據庫要求數據庫工作在單用戶模式。通常就是DBA在操作時,不允許其他用戶連接數據庫。

問題一解決辦法:

右鍵點擊數據庫 -> 屬性 -> 選項 -> 狀態 -> 限制訪問 -> 選擇Multiple -> 確定。

問題二解決辦法:

方法一(最方便):右鍵點擊數據庫 -> 屬性 -> 選項 -> 狀態 -> 限制訪問 -> 選擇Single-> 確定。然後還原。
方法二(最直接):斷開數據庫連接
方法三(最暴力):註銷/重啓數據庫服務器
方法四(最麻煩):寫代碼修改數據庫相關屬性,雖然麻煩,有的時候還是要用到,那就用到的時候再研究。

①先切換數據庫到master數據庫。執行語句

select * from master..sysprocesses where dbid=db_id( '數據庫名稱')

②然後逐步運行語句 exec kill spid(上一步結果集中的數據),

問題就解決了。哈哈

今天在還原數據庫的時候,提示"因爲數據庫正在使用,所以無法獲得對數據庫的獨佔訪問權",無論我是重啓數據庫,還是重啓計算機,都不能解決問題,多番嘗試後,終於解決了該問題。現將引發該問題的原因與解決方案寫出來,有不對的地方歡迎大家提出來。

引發原因:是因爲我在還原數據庫的時候,還有其他的用戶正在使用數據庫,所以就會出現以上提示。

解決方法:

1,設置數據庫在單用戶模式下工作。
設置方法:在需要還原的數據庫上右擊,在右鍵菜單命令上選擇"屬性"- >"選項"- >"狀態"- >"限制訪問"- >"Single"。這是SQLSERVER2005的菜單命令,其它版本請自己查找。

2,利用SQL語句,殺死正在使用該數據庫的所有進程,自己以前在做一個SQL SERVER操作小工具的時候有寫過該功能的SQL,貼出來供大家參考:

declare @dbname varchar(50)
set @dbname='數據庫名稱'
declare @sql varchar(50)
declare cs_result cursor local for select 'kill '+cast(spid as varchar(50)) from sys.sysprocesses where db_name(dbid)=@dbname 
open cs_result
fetch next from cs_result into @sql
while @@fetch_status=0
begin
    execute(@sql)
    fetch next from cs_result into @sql
end
close cs_result
deallocate cs_result

該SQL語句利用遊標循環所有正在使用該數據庫的進程,並通過kill命令殺死進程。


3,利用SQL語句,斷開所有用戶鏈接,並回滾所有事務,具體SQL語句如下:

ALTER DATABASE [數據庫名稱] 
SET OFFLINE WITH ROLLBACK IMMEDIATE

注意:在使用方法2與3時,不要在需要的還原的數據庫下執行,建議在master數據庫下面執行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章