使用sql語句備份和恢複SQLserver資料庫,以及需要注意的事項

來源:互聯網
上載者:User

  本文轉自: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  

  然後調用恢複語句既可以實現,但是必須保證,殺死其他使用者串連時,必須在恢複的時間段裡面不能再有其他使用者串連到資料庫

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.