SQL Server資料庫鏡像是對于資料庫可用性的軟體解決方案。鏡像在每個資料庫級别被部署,并隻能在完整恢複模式下工作。由于磁盤空間的問題,需要移動鏡像資料庫到一個不同的位置。我們想不停機、不破壞鏡像來完成這個任務。需要在不同的環境做測試。
對于啟用了資料庫鏡像的資料庫的檔案移動,我們隻有有限的選擇。正常方法如下:
破壞資料庫鏡像會話,通過使用Alter database或Attach Detach移動線上資料庫檔案到一個新的位置。
備份資料庫,并在鏡像伺服器上恢複備份,然後重建鏡像。
技術上來講,這是可行的,但是它需要停機時間,并且尤其對于大資料庫,移動和恢複需要大量額外時間。
給定的停機時間是用戶端總是會考慮的,我們得找到一個不停機的方案。以下步驟說明了如何不停機移動資料庫檔案而不用打擾同步資料庫鏡像。
對于鏡像執行個體:
在主伺服器上暫停鏡像(可選)。
在鏡像伺服器上使用Alter database語句來指向一個新位置。
停止鏡像SQL Server服務。
移動鏡像資料庫檔案到一個新位置,并確定檔案上的權限也還在。
啟動鏡像SQL Server服務。
在主伺服器資料庫上恢複鏡像,并驗證鏡像成功恢複。
對于主執行個體:
故障轉移資料庫到鏡像伺服器,以至于鏡像伺服器現在作為主伺服器。
在新的主伺服器上暫停鏡像(可選)。
在新的鏡像伺服器上使用Alter database語句來指向一個新位置。
停止新鏡像的SQL Server服務。
移動新的鏡像資料庫檔案到一個新位置,并確定檔案上的權限也還在。
啟動新鏡像的SQL Server服務。
如果詳細檢視以上計劃,可以看到應用程式會話在鏡像資料庫故障轉移期間會重連。當應用程式負載在主伺服器上運作時,停止鏡像SQL Server服務,實體移動資料庫檔案,然後啟動鏡像SQL Server服務。是以無需停機時間。
然而,你要確定在主伺服器上有足夠的日志空間,因為鏡像狀态将會被斷開(不隻是一個庫,而是執行個體上所有鏡像的資料庫)。當鏡像狀态斷開時,日志記錄不會從主伺服器發送到鏡像伺服器,将會累積在主伺服器。一旦鏡像執行個體啟動,鏡像狀态變為同步中,主伺服器将會開始發送日志記錄到鏡像伺服器。
我們可以通過以下T-SQL來檢查所有鏡像資料庫的檔案位置,來驗證是否修改成功:
1
2
3
4
5
<code>Select</code> <code>DB_NAME(dbid),</code><code>name</code><code>,filename </code>
<code>from</code> <code>sysaltfiles</code>
<code>where</code> <code>DB_NAME(dbid) </code><code>in</code> <code>(</code><code>Select</code> <code>DB_NAME(database_id) </code>
<code>from</code> <code>sys.database_mirroring </code><code>where</code> <code>mirroring_state </code><code>is</code> <code>not</code> <code>null</code><code>) </code>
<code>order</code> <code>by</code> <code>1</code>
總的來講,當移動資料庫時可以保持資料庫鏡像不用停機。對于見證伺服器無需任何操作,在活動期間一直保持線上狀态。首先這個方案應該在測試環境驗證後,再在生産環境實施。非常重要的是,我們注意到在異步鏡像模式,也可以參照這種做法,隻是需要在應用停機的情況下來實施。
在以下應用場景下會移動鏡像資料庫的資料或日志檔案的位置:
磁盤空間不足
資料庫伺服器上,配置了鏡像的資料庫所在磁盤空間不足,可以遷移MDF或LDF檔案到新的磁盤。
加速鏡像資料庫追上主庫
在主庫從當機中恢複後,成為了新主庫的鏡像資料庫,為了加速鏡像資料庫追上主庫,可以将資料和日志檔案移動到性能更優的磁盤,如SSD上。
本文轉自UltraSQL51CTO部落格,原文連結:http://blog.51cto.com/ultrasql/1904076 ,如需轉載請自行聯系原作者