SQL Server不停機(jī)移動(dòng)鏡像數(shù)據(jù)庫(kù)
SQL Server數(shù)據(jù)庫(kù)鏡像是對(duì)于數(shù)據(jù)庫(kù)可用性的軟件解決方案。鏡像在每個(gè)數(shù)據(jù)庫(kù)級(jí)別被部署,并只能在完整恢復(fù)模式下工作。由于磁盤空間的問(wèn)題,需要移動(dòng)鏡像數(shù)據(jù)庫(kù)到一個(gè)不同的位置。我們想不停機(jī)、不破壞鏡像來(lái)完成這個(gè)任務(wù)。需要在不同的環(huán)境做測(cè)試。
對(duì)于啟用了數(shù)據(jù)庫(kù)鏡像的數(shù)據(jù)庫(kù)的文件移動(dòng),我們只有有限的選擇。常規(guī)方法如下:
破壞數(shù)據(jù)庫(kù)鏡像會(huì)話,通過(guò)使用Alter database或Attach Detach移動(dòng)在線數(shù)據(jù)庫(kù)文件到一個(gè)新的位置。
備份數(shù)據(jù)庫(kù),并在鏡像服務(wù)器上恢復(fù)備份,然后重建鏡像。
技術(shù)上來(lái)講,這是可行的,但是它需要停機(jī)時(shí)間,并且尤其對(duì)于大數(shù)據(jù)庫(kù),移動(dòng)和恢復(fù)需要大量額外時(shí)間。
給定的停機(jī)時(shí)間是客戶端總是會(huì)考慮的,我們得找到一個(gè)不停機(jī)的方案。以下步驟說(shuō)明了如何不停機(jī)移動(dòng)數(shù)據(jù)庫(kù)文件而不用打擾同步數(shù)據(jù)庫(kù)鏡像。
對(duì)于鏡像實(shí)例:
在主服務(wù)器上暫停鏡像(可選)。
在鏡像服務(wù)器上使用Alter database語(yǔ)句來(lái)指向一個(gè)新位置。
停止鏡像SQL Server服務(wù)。
移動(dòng)鏡像數(shù)據(jù)庫(kù)文件到一個(gè)新位置,并確保文件上的權(quán)限也還在。
啟動(dòng)鏡像SQL Server服務(wù)。
在主服務(wù)器數(shù)據(jù)庫(kù)上恢復(fù)鏡像,并驗(yàn)證鏡像成功恢復(fù)。
對(duì)于主實(shí)例:
故障轉(zhuǎn)移數(shù)據(jù)庫(kù)到鏡像服務(wù)器,以至于鏡像服務(wù)器現(xiàn)在作為主服務(wù)器。
在新的主服務(wù)器上暫停鏡像(可選)。
在新的鏡像服務(wù)器上使用Alter database語(yǔ)句來(lái)指向一個(gè)新位置。
停止新鏡像的SQL Server服務(wù)。
移動(dòng)新的鏡像數(shù)據(jù)庫(kù)文件到一個(gè)新位置,并確保文件上的權(quán)限也還在。
啟動(dòng)新鏡像的SQL Server服務(wù)。
在主服務(wù)器數(shù)據(jù)庫(kù)上恢復(fù)鏡像,并驗(yàn)證鏡像成功恢復(fù)。
如果詳細(xì)查看以上計(jì)劃,可以看到應(yīng)用程序會(huì)話在鏡像數(shù)據(jù)庫(kù)故障轉(zhuǎn)移期間會(huì)重連。當(dāng)應(yīng)用程序負(fù)載在主服務(wù)器上運(yùn)行時(shí),停止鏡像SQL Server服務(wù),物理移動(dòng)數(shù)據(jù)庫(kù)文件,然后啟動(dòng)鏡像SQL Server服務(wù)。所以無(wú)需停機(jī)時(shí)間。
然而,你要確保在主服務(wù)器上有足夠的日志空間,因?yàn)殓R像狀態(tài)將會(huì)被斷開(kāi)(不只是一個(gè)庫(kù),而是實(shí)例上所有鏡像的數(shù)據(jù)庫(kù))。當(dāng)鏡像狀態(tài)斷開(kāi)時(shí),日志記錄不會(huì)從主服務(wù)器發(fā)送到鏡像服務(wù)器,將會(huì)累積在主服務(wù)器。一旦鏡像實(shí)例啟動(dòng),鏡像狀態(tài)變?yōu)橥街?,主服?wù)器將會(huì)開(kāi)始發(fā)送日志記錄到鏡像服務(wù)器。
我們可以通過(guò)以下T-SQL來(lái)檢查所有鏡像數(shù)據(jù)庫(kù)的文件位置,來(lái)驗(yàn)證是否修改成功:
Select DB_NAME(dbid),name,filename
from sysaltfiles
where DB_NAME(dbid) in (Select DB_NAME(database_id)
from sys.database_mirroring where mirroring_state is not null)
order by 1
總的來(lái)講,當(dāng)移動(dòng)數(shù)據(jù)庫(kù)時(shí)可以保持?jǐn)?shù)據(jù)庫(kù)鏡像不用停機(jī)。對(duì)于見(jiàn)證服務(wù)器無(wú)需任何操作,在活動(dòng)期間一直保持在線狀態(tài)。首先這個(gè)方案應(yīng)該在測(cè)試環(huán)境驗(yàn)證后,再在生產(chǎn)環(huán)境實(shí)施。非常重要的是,我們注意到在異步鏡像模式,也可以參照這種做法,只是需要在應(yīng)用停機(jī)的情況下來(lái)實(shí)施。