[SQL] 資料庫備份與還原 - Backup、Restore

摘要:[SQL] 資料庫備份與還原 - Backup、Restore

 

 我想大部分有管理資料庫的人,都會定期的備份(Backup)資料庫,即使不是專門的DBA也會這麼做;但是真的在緊急情況做過資料庫還原的人,我想就不多了吧~即使練習過 Restore ,在實際狀況遇到,也是會冒出一堆冷汗的...

資料庫最簡單的備份、還原動作就是做完整資料庫備份

完整備份 (Full Backup)

BACKUP DATABASE [Northwind] 
TO DISK = N'C:\temp\Northwind.Bak' WITHNOFORMAT, NOINIT,  
NAME = N'Northwind-Full Database Backup',
SKIP,NOREWIND, NOUNLOAD,  STATS = 10

驗證資料庫備份是否有效

RESTORE VERIFYONLY FROM  DISK = N'C:\temp\Northwind.Bak' WITH  FILE= 1,  NOUNLOAD,  NOREWIND

 

完整還原資料庫

RESTORE DATABASE [Northwind] FROM  DISK = N'C:\temp\Northwind.Bak'WITH  FILE = 1,  NOUNLOAD,  STATS = 10

 

---------------------------------

但是如果只靠完整備份,當有意外發生時恐怕會遭遇相當大的資料遺失(從前一次完整備份到毀損點),所以備份的時候會分為幾個層次

  • 完整備份 Full Backup
  • 差異性備份 Differential Backup:記錄上一次完整備份到目前所有的差異
  • 交易式備份 Transaction Log Backup:記錄前一次備份到目前所有的交易(Transaction)
  • 快照 Snapshot:請參考(原理篇)、(救援篇

註:若要進行交易式備份、還原,其 Recovery Mode 要設為 Full



下面比較一下不同備份方式,其 T-SQL 的差異

BACKUP DATABASE [Northwind] TO  DISK = N'C:\temp\Northwind.Bak' WITH NOFORMAT, NOINIT,  NAME = N'Northwind-Full',  STATS = 10

BACKUP DATABASE [Northwind] TO  DISK = N'C:\temp\Northwind.Bak'WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'Northwind-Differential', STATS = 10

BACKUP LOG [Northwind] TO  DISK = N'C:\temp\Northwind.Bak' WITH NOFORMAT, NOINIT,  NAME = N'Northwind-Transaction Log', STATS = 10

 

如果你同時做了 Full、Differential、Log Backup 到同一個備份檔 *.BAK,當你要做還原時,就可以看到這個備份集所有的備份,並且可以挑選你要還原的目標、範圍。

如果你要完整還原你只需要執行

RESTORE DATABASE [Northwind] FROM  DISK = N'C:\temp\Northwind.Bak'WITH  FILE = 1,  NOUNLOAD,  STATS = 10

 

廢話@@~這前面不是說過了嗎?幹嘛重貼一次佔用篇幅呢?

唉唷~先別動怒,先來看看如果要做 Transaction Log Restore 怎麼做

RESTORE DATABASE [Northwind] FROM  DISK = N'C:\temp\Northwind.Bak' WITH  FILE = 1, NORECOVERY,  NOUNLOAD,  STATS = 10
GO
RESTORE DATABASE [Northwind] FROM  DISK = N'C:\temp\Northwind.Bak' WITH  FILE = 2, NORECOVERY,  NOUNLOAD,  STATS = 10
GO
RESTORE LOG [Northwind] FROM  DISK = N'C:\temp\Northwind.Bak' WITH  FILE = 3,  NOUNLOAD,  STATS =10

仔細的看一下上面的差異 

 

*-*--**-**-*-*-*-*-*-*-*-*-***--*-*-*-*-*

如果要做差異式或交易式備份,必須先做一次完整備份,並且使其停在「Restoring...」(就是上面 NORECOVERY 的用意),表示還有備份需要還原,最後一個還原才不用加此參數。

假如你有1個完整備份、1個差異式備份或20個交易式備份,則只有最後、最晚的一個交易式備份,可以不用加,其餘的都必須使用 NORECOVERY ,這樣才能將整串的備份都還原回去。

在SSMS操作的時候也是可以使用這個選項的,在 option 分頁裡


 

-------------

其實本來是要想寫怎麼「還原損壞的分頁Restoring Damaged Page」,但前面這段沒記錄,總是覺得怪怪的......晚點再來寫怎麼還原其他種意外的狀況

~ End