SQL Server 數據庫最小宕機遷移方案

SQL Server 數據庫最小宕機遷移方案html

1、目的sql

在作SQL Server數據庫維護的時候,當上司要求咱們把幾十G的數據文件搬動到其它服務器,而且要求最小宕機時間的時候,咱們有沒什麼方案能夠作到這些要求呢?數據庫

在這裏咱們假設這兩臺機器並非在一個機房上,這樣看起來咱們的解決方案才更有意義,若是你那麼好運這兩臺機器在同一個局域網,那麼恭喜你,你能夠多不少的方案能夠作到。服務器

 

2、分析與設計思路優化

其實咱們假設的環境有兩個特色:第一個是數據庫文件比較大;第二個就是咱們的傳送文件的速度可能會比較慢。也許這傳送速度咱們是沒有辦法了,可是咱們能夠就從文件的大小這個問題出發,結合SQL Server的特性,這樣就有了下面的解決方案了。設計

爲了使宕機時間最短,咱們這裏使用了完整備份差別備份來遷移數據庫,在白天的時候對須要遷移的數據庫進行一次完整備份(XXX_full.bak),並把備份文件拷貝(這裏可使用FTP軟件進行斷點續傳)到目標服務器進行還原,等到下班時間以後再進行一次差別備份(XXX_diff.bak),再把這個差別備份拷貝到目標服務器,在完整還原的基礎上再進行差別還原。htm

這裏的宕機時間 = 差別備份時間 + 傳送差別備份文件時間 + 還原差別備份文件時間,這宕機時間是否是讓你感受這時間很短呢?blog

 

3、參考腳本get

注意修改下面腳本中數據庫的名稱,還有絕對路徑。基礎

 

--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+'-完整數據庫備份'',

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-完整數據庫備份',

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+'-差別數據庫備份'',

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-差別數據庫備份',

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

 

 

4、後記

也許到了這裏應該結束了,可是每每事與願違,有的時候咱們的數據庫文件的大小並非幾十G的,那麼咱們應該如何作呢?是否還有其餘的解決方案呢?

我以前就移動過700G的數據文件,不過給我移動的時間比較充足,我是經過數據庫的做業進行愚公移山的,搬數據到新的服務器上的,這樣的好處就是對以前的數據庫進行優化,好比進行數據庫參數的設置,好比表分區,在對以前數據庫影響儘可能小的狀況進行數據搬遷。詳細的過程下次再寫吧。

相關文章
相關標籤/搜索