Sql-Server

SQL Server 2000 需要在為並行遷移執行備份時防止登錄

  • March 9, 2010

我正在尋找一種防止登錄發生的方法,以便對數據庫進行完整備份以從其目前的 SQL Server 2000 實例遷移到新的 SQL 2005 實例。我的一個朋友建議執行一個腳本,將數據庫置於回滾狀態。不是 DBA,我的 DDL 很差,執行我不理解的腳本可能不是最好的主意。

一種可能更容易的選擇是簡單地分離並複製到新伺服器。

任何建議將不勝感激。

分離/複製/附加將起作用。(不要留下 LDF 文件。它們很重要,即使有些人不這麼認為,尤其是當您快速強制數據庫關閉時。如果日誌未正確附加到新伺服器。)。

我還有另一種選擇,它使用了 SQL Server 中被忽視的“暫停”功能。

我發現當您有很多使用者跳入該數據庫時,將數據庫設置為單個使用者可能會成為問題。在我連接之前,他們將成為“單一使用者”。

如果您使用查詢視窗而不是使用 SSMS GUI,那麼我的方法效果最好。如果您使用的是集群,此方法可能效果不佳(我已經嘗試了多年,我不記得結果。您不想意外觸發故障轉移。)

此外,如果在同一 SQL Server 上生產的其他應用程序還有其他數據庫,則此方法可能無法正常工作。

  1. 以管理員身份登錄查詢視窗。您將使用此連接來殺死 spid(稍後),然後最後一次備份數據庫。
  2. 暫停 SQL Server 服務。(在 SSMS 中,右鍵點擊伺服器圖示或使用控制面板小程序或任何類似的服務控製程序。)

這將阻止對此實例的任何新登錄,包括管理員連接、db_owner 連接和 SQL 代理連接,****但不會刪除現有連接。當伺服器暫停時,連接嘗試將失敗並收到錯誤消息。您可能想要警告您的使用者或支持團隊。

  1. 使用 KILL 優雅地關閉使用者應用程序和/或踢出普通使用者的現有連接。這將為您編寫 kill 命令,只需先更改/使用要遷移的數據庫,然後執行: select ‘kill ’ + convert(varchar, spid) from master.dbo.sysprocesses where spid != @@SPID and dbid = DB_ID()

然後將輸出複製到您的查詢視窗並執行它。它會殺死目前數據庫中的每個連接,但你的。

  1. 最後,執行您的備份命令,就像您將要執行的那樣。

如果需要,您可以在與“暫停”相同的菜單上使用“恢復”來允許在完成後登錄。在讓人們重新進入之前將舊數據庫設置為只讀或離線(最好)。(離線比只讀更好,因為您希望人們在將連接字元串指向新數據庫時忽略某些內容時收到錯誤消息伺服器。刪除數據庫也會收到錯誤消息,但離線不是永久的。如果您必須回到舊伺服器,只需線上更改數據庫很容易,但如果出現這種情況,您必須進行還原您刪除了數據庫。在您確定遷移成功後,您明天可以隨時刪除離線數據庫。)

當然,您需要將備份恢復到要遷移到的伺服器,修復任何 SQL 登錄,然後修復應用程序的連接字元串或更改伺服器的 DNS 條目,具體取決於您的處理方式,打開數據庫校驗和功能,對所有表執行完整的重新索引,更新數據庫兼容性級別(如果合適的話)等等,等等。

如果您是新手,或者如果這特別重要或有苛刻的使用者,我建議您先嘗試至少一次試執行。您無需將所有人都踢出去進行空執行,只需備份並在新伺服器上恢復即可。進行還原會迫使您確定文件的去向(驅動器號和路徑在不同的伺服器上可能不同),並且可以讓您了解還原需要多長時間。(如果是真的,如果您已經在新伺服器上擁有數據庫的副本,那麼使用“替換”進行恢復通常比從頭開始要快一些。這給您提供了一些迴旋餘地向使用者估計系統將在遷移中關閉多長時間。)

除非您只使用 Windows 登錄,否則您想在“真實”執行之前測試 SQL 登錄是否有效。最好有一個模擬生產的測試系統,在那裡你可以計算出你的“WTF”?首先是片刻,但並不是每個人都有這種奢侈。

引用自:https://serverfault.com/questions/120574