SQL Server數(shù)據(jù)庫最小宕機遷移方案
一、目的
在做SQL Server數(shù)據(jù)庫維護的時候,當(dāng)上司要求我們把幾十G的數(shù)據(jù)文件搬動到其它服務(wù)器,并且要求最小宕機時間的時候,我們有沒什么方案可以做到這些要求呢?
在這里我們假設(shè)這兩臺機器并不是在一個機房上,這樣看起來我們的解決方案才更有意義,如果你那么好運這兩臺機器在同一個局域網(wǎng),那么恭喜你,你可以多很多的方案可以做到。
二、分析與設(shè)計思路
其實我們假設(shè)的環(huán)境有兩個特點:***個是數(shù)據(jù)庫文件比較大;第二個就是我們的傳送文件的速度可能會比較慢。也許這傳送速度我們是沒有辦法了,但是我們可以就從文件的大小這個問題出發(fā),結(jié)合SQL Server的特性,這樣就有了下面的解決方案了。
為了使宕機時間最短,我們這里使用了完整備份和差異備份來遷移數(shù)據(jù)庫,在白天的時候?qū)π枰w移的數(shù)據(jù)庫進行一次完整備份(XXX_full.bak),并把備份文件拷貝(這里可以使用FTP軟件進行斷點續(xù)傳)到目標(biāo)服務(wù)器進行還原,等到下班時間之后再進行一次差異備份(XXX_diff.bak),再把這個差異備份拷貝到目標(biāo)服務(wù)器,在完整還原的基礎(chǔ)上再進行差異還原。
這里的宕機時間 = 差異備份時間 + 傳送差異備份文件時間 + 還原差異備份文件時間,這宕機時間是不是讓你感覺這時間很短呢?
三、參考腳本
注意修改下面腳本中數(shù)據(jù)庫的名稱,還有絕對路徑。
--1:完整備份
- declare @dbname varchar(100)
- declare @sql nvarchar(max)
- set @dbname = 'DataBaseName'
- set @sql = '
- --'+@dbname+'_full
- BACKUP DATABASE ['+@dbname+']
- TO DISK = ''D:\DBBackup\'+@dbname+'_full.bak''
- WITH NOFORMAT, NOINIT, NAME = '''+@dbname+'-完整數(shù)據(jù)庫備份'',
- SKIP, NOREWIND, NOUNLOAD, STATS = 10
- GO'
- print @sql
--生成的SQL
- --DataBaseName_full
- BACKUP DATABASE [DataBaseName]
- TO DISK = 'D:\DBBackup\DataBaseName_full.bak'
- WITH NOFORMAT, NOINIT, NAME = 'DataBaseName-完整數(shù)據(jù)庫備份',
- SKIP, NOREWIND, NOUNLOAD, STATS = 10
- GO
--2:完整備份還原
- declare @dbname varchar(100)
- declare @sql nvarchar(max)
- set @dbname = 'DataBaseName'
- set @sql = '
- --RESTORE '+@dbname+'_full
- RESTORE DATABASE ['+@dbname+']
- FROM DISK = ''D:\DBBackup\'+@dbname+'_full.bak'' WITH FILE = 1,
- MOVE N''DataBase_Name'' TO N''D:\DataBase\'+@dbname+'.mdf'',
- MOVE N''DataBase_Name_log'' TO N''D:\DataBase\'+@dbname+'_log.ldf'',
- NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
- GO'
- print @sql
--生成的SQL
- --RESTORE DataBaseName_full
- RESTORE DATABASE [DataBaseName]
- FROM DISK = 'D:\DBBackup\DataBaseName_full.bak' WITH FILE = 1,
- MOVE N'DataBase_Name' TO N'D:\DataBase\DataBaseName.mdf',
- MOVE N'DataBase_Name_log' TO N'D:\DataBase\DataBaseName_log.ldf',
- NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
- GO
--3:差異備份
- declare @dbname varchar(100)
- declare @sql nvarchar(max)
- set @dbname = 'DataBaseName'
- set @sql = '
- --'+@dbname+'_diff
- BACKUP DATABASE ['+@dbname+']
- TO DISK = N''D:\DBBackup\'+@dbname+'_diff.bak''
- WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'''+@dbname+'-差異數(shù)據(jù)庫備份'',
- SKIP, NOREWIND, NOUNLOAD, STATS = 10
- GO
- '
- print @sql
--生成的SQL
- --DataBaseName_diff
- BACKUP DATABASE [DataBaseName]
- TO DISK = N'D:\DBBackup\DataBaseName_diff.bak'
- WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'DataBaseName-差異數(shù)據(jù)庫備份',
- SKIP, NOREWIND, NOUNLOAD, STATS = 10
- GO
--4:差異備份還原
- declare @dbname varchar(100)
- declare @sql nvarchar(max)
- set @dbname = 'DataBaseName'
- set @sql = '
- --RESTORE '+@dbname+'_full
- RESTORE DATABASE ['+@dbname+']
- FROM DISK = ''D:\DBBackup\'+@dbname+'_diff.bak'' WITH FILE = 1,
- NOUNLOAD, STATS = 10
- GO'
- print @sql
--生成的SQL
- --RESTORE DataBaseName_full
- RESTORE DATABASE [DataBaseName]
- FROM DISK = 'D:\DBBackup\DataBaseName_diff.bak' WITH FILE = 1,
- NOUNLOAD, STATS = 10
- GO
四、后記
也許到了這里應(yīng)該結(jié)束了,但是往往事與愿違,有的時候我們的數(shù)據(jù)庫文件的大小并不是幾十G的,那么我們應(yīng)該如何做呢?是否還有其他的解決方案呢?
我之前就移動過700G的數(shù)據(jù)文件,不過給我移動的時間比較充足,我是通過數(shù)據(jù)庫的作業(yè)進行愚公移山的,搬數(shù)據(jù)到新的服務(wù)器上的,這樣的好處就是對之前的數(shù)據(jù)庫進行優(yōu)化,比如進行數(shù)據(jù)庫參數(shù)的設(shè)置,比如表分區(qū),在對之前數(shù)據(jù)庫影響盡量小的情況進行數(shù)據(jù)搬遷。詳細的過程下次再寫吧。
原文鏈接:http://www.cnblogs.com/gaizai/archive/2011/03/30/2000175.html
【編輯推薦】