本文轉自:http://hi.baidu.com/yanzuoguang/blog/item/e94b2534d44b6b83a71e1255.html
在此嚴重感謝該文作者!因為看了那麼多作者寫的資料庫恢複語句,沒有一個提到:恢複必須在單一使用者模式下操作才能夠成功,
更沒有一個提到:預存程序不要建立在目標資料庫中。對於新手,如果不知道這樣兩個前提就來搞恢複,會碰到各種各樣的問題。
備份:backup database dbname to disk=';d:\dbn.aa';
恢複:restore database dbname from disk=';d:\dbn.aa';
恢複必須在單一使用者模式下操作才能夠成功,我們需要斷開其他使用者的串連,並且切換到其他資料庫,才能夠成功
我們可以通過寫預存程序來斷開其他使用者的串連
我以前曾經這樣實驗過
1 找到所有與這個資料庫的串連,全部KILL (用VB調用一個預存程序來實現)
2 在用VB調用另外一個寫好的預存程序來進行恢複,注意兩個預存程序都不要建立在目標資料庫中。
在我自己的項目中,我是將下面的killrubbishprocess預存程序建立在了sql server系統保留資料庫master
中,同時將上面的恢複語句也寫成預存程序建立在master中。
這裡我把殺掉串連的預存程序提供給你,恢複資料庫的預存程序很簡單你自己來吧。
CREATE PROCEDURE dbo.killrubbishprocess AS
DECLARE @spidnum int
DECLARE rubbish_CURSOR CURSOR FOR
select spid
from master.dbo.sysprocesses
where spid > 10 and spid <= 32767 and status='sleeping' and loginame='sa'
order by spid
OPEN rubbish_CURSOR
FETCH NEXT FROM rubbish_CURSOR
INTO @spidnum
select s_kill = "kill " + cast(@spidnum as char(5))
WHILE @@FETCH_STATUS=0
BEGIN
EXEC (s_kill)
FETCH NEXT FROM rubbish_CURSOR
INTO @spidnum
END
CLOSE rubbish_CURSOR
DEALLOCATE rubbish_CURSOR
GO
然後調用恢複語句既可以實現,但是必須保證,殺死其他使用者串連時,必須在恢複的時間段裡面不能再有其他使用者串連到資料庫