SQL Server 資料庫最小宕機遷移方案

2021-08-26 04:41:46 字數 4395 閱讀 4009

一、目的

在做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 '

print

@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企業管理器,沒有這個功能,要用語句來完成,下面就介紹如何...