一、目的
在做sql server資料庫維護的時候,當上司要求我們把幾十g的資料檔案搬動到其它伺服器,並且要求最小宕機時間的時候,我們有沒什麼方案可以做到這些要求呢?
在這裡我們假設這兩台機器並不是在乙個機房上,這樣看起來我們的解決方案才更有意義,如果你那麼好運這兩台機器在同乙個區域網,那麼恭喜你,你可以多很多的方案可以做到。
二、分析與設計思路
其實我們假設的環境有兩個特點:第乙個是資料庫檔案比較大;第二個就是我們的傳送檔案的速度可能會比較慢。也許這傳送速度我們是沒有辦法了,但是我們可以就從檔案的大小這個問題出發,結合sql server的特性,這樣就有了下面的解決方案了。
為了使宕機時間最短,我們這裡使用了完整備份和差異備份來遷移資料庫,在白天的時候對需要遷移的資料庫進行一次完整備份(***_full.bak),並把備份檔案拷貝(這裡可以使用ftp軟體進行斷點續傳)到目標伺服器進行還原,等到下班時間之後再進行一次差異備份(***_diff.bak),再把這個差異備份拷貝到目標伺服器,在完整還原的基礎上再進行差異還原。
這裡的宕機時間 = 差異備份時間 + 傳送差異備份檔案時間 + 還原差異備份檔案時間,這宕機時間是不是讓你感覺這時間很短呢?
三、參考指令碼
注意修改下面指令碼中資料庫的名稱,還有絕對路徑。
--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]
todisk
='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 '
@sql
--生成的
sql
--databasename_diff
backup
database [databasename]
todisk
= 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四、後記
也許到了這裡應該結束了,但是往往事與願違,有的時候我們的資料庫檔案的大小並不是幾十g的,那麼我們應該如何做呢?是否還有其他的解決方案呢?
我之前就移動過700g的資料檔案,不過給我移動的時間比較充足,我是通過資料庫的作業進行愚公移山的,搬資料到新的伺服器上的,這樣的好處就是對之前的資料庫進行優化,比如進行資料庫引數的設定,比如表分割槽,在對之前資料庫影響盡量小的情況進行資料搬遷。詳細的過程下次再寫吧。
SQL Server 資料庫最小宕機時間遷移方案
一 目的 在做sql server資料庫維護的時候,當上司要求我們把幾十g的資料檔案搬動到其它伺服器,並且要求最小宕機時間的時候,我們有沒什麼方案可以做到這些要求呢?在這裡我們假設這兩台機器並不是在乙個機房上,這樣看起來我們的解決方案才更有意義,如果你那麼好運這兩台機器在同乙個區域網,那麼恭喜你,你...
SQLServer收縮資料庫
以下語句用於設定資料庫定時自動收縮資料庫 use master gosp dboption testdb,autoshrink true gouse testdb gocheckpoint go 清空日誌語句 dump transaction testdb with no log 截斷事務日誌 ba...
SQL Server資料庫檢修
使用資料庫的過程中,由於斷電或其他原因,有可能導致資料庫出現一些小錯誤,比如檢索某些表特別慢,查詢不到符合條件的資料等.出現這些情況的原因,往往是因為資料庫有些損壞,或索引不完整.在access中,有個修復資料庫的功能可以解決這個問題,在sql企業管理器,沒有這個功能,要用語句來完成,下面就介紹如何...