1. 程式人生 > >SQL Server 2008/2012 完整資料庫備份+差異備份+事務日誌備份 資料庫完整還原(一)

SQL Server 2008/2012 完整資料庫備份+差異備份+事務日誌備份 資料庫完整還原(一)

還原方案

資料庫級(資料庫完整還原)

還原和恢復整個資料庫。資料庫在還原和恢復操作期間會處於離線狀態。SQL SERVER不允許使用者備份或還原單個表。還原方案是指從一個或多個備份中還原資料、繼而恢復資料庫的過程。

不同恢復模式所支援的各種還原方案

簡單恢復模式下

這是基本的還原策略,資料庫完整還原可能涉及完整資料庫備份的簡單還原和恢復。另外,完整的資料庫還原還可能涉及還原完整資料庫備份,以及還原和恢復差異備份

完整/大容量日誌恢復模式下

這是基本的還原策略,資料庫完整還原涉及還原完整資料庫備份或差異備份,以及所有後續日誌備份(按順序)。通過恢復並還原上一次日誌備份,完成資料庫完整還原。

在恢復資料庫前,SQL Server 資料庫引擎都會保證整個資料庫在邏輯上的一致性。例如,還原一個檔案以後,必須恢復完整的一套日誌檔案備份,以便將該檔案裡的事務前滾足夠長度,與資料庫保持一致,才能恢復該檔案並使其線上。

資料庫完整還原

在簡單情況下,還原操作只需要一個完整資料庫備份,一個差異資料庫備份和後續日誌備份。

資料庫還原到故障點操作步驟

  1. 首先備份活動事務日誌(日誌的”尾部“)
  2. 按備份的建立順序還原最新的完整資料庫備份,最新的差異備份(如果有)及所有後續日誌備份

若源資料庫是簡單模式,則沒有相應的日誌備份。恢復工作僅限於還原一個完整資料庫備份,以及最後的一個差異備份。

資料庫發生災難後,如何將之恢復到一個特定的恢復點

  • 場景

一個關鍵資料表被人在中午 12 點 01 份誤刪,如何將其恢復到 12 點的那個狀態呢?

  • 解決方案
    通過恢復日誌檔案到指定恢復點的方式來實現。有以下幾個先決要求,而且是要在災難發生之前,資料庫就必須滿足以下所有條件:
  1. 資料庫的恢復模式必須是完整恢復模式
  2. 災難發生前,資料庫曾做過一個完整資料庫備份
  3. 在上次完整資料庫備份後,若做過任何日誌備份,這些日誌備份現在每個都能找到。

符合以上三個要求的資料庫就可以使用備份恢復方法將資料庫恢復到完整備份後的任意一個時間點。

將資料庫恢復到故障點的基本步驟如下:

  1. 備份活動事務日誌(也稱為日誌尾部)。此操作將建立尾日誌備份。如果活動事務日誌在災難發生後變得不可用,則該日誌部分的所有事務都將丟失。
  2. 還原最新完整資料庫備份,而且不做事務恢復
  3. 如果存在差異備份,則還原最新的差異備份,而不做事務恢復
  4. 從還原備份後建立的第一個事務日誌備份開始,使用 NORECOVER 依次還原日誌
  5. 恢復資料庫到某個時間點(RESTORE DATABASE database_name with stopat='???', RECOVERY)
完整資料庫備份+差異備份+事務日誌備份 示例

示例前準備
清空表 msdb..backupset 上 2018/09/28 之前的記錄,注意時間

USE msdb;  
GO  
EXEC sp_delete_backuphistory @oldest_date = '09/28/2018';  

AdventureWorksDW2018 庫的恢復模式修改為完整恢復模式,否則會報 4208 錯誤

USE master ;  
ALTER DATABASE AdventureWorksDW2018 SET RECOVERY FULL ;
-- 顯示 AdventureWorksDW2018 這個資料庫歷史上曾經的備份資訊。
use msdb;
select distinct s.first_lsn, s.last_lsn,
                s.database_backup_lsn, s.backup_start_date, s.backup_finish_date,
				s.type, y.physical_device_name 
  from msdb..backupset s inner join 
       msdb..backupfile f on f.backup_set_id = s.backup_set_id inner join
	   msdb..backupmediaset m on s.media_set_id = m.media_set_id inner join
	   msdb..backupmediafamily y on m.media_set_id = y.media_set_id
 where (s.database_name = 'AdventureWorksDW2018')
 order by s.backup_finish_date desc;

示例操作內容

將建立 AdventureWorksDW2018 資料庫的尾日誌備份,將還原較早的完整資料庫備份和日誌備份,最後還原尾日誌備份。事務恢復動作將在最後的尾日誌恢復步驟中完成,在此之前資料庫不能被訪問。

  1. 對資料庫做一個全備份
    BACKUP DATABASE [AdventureWorksDW2018] TO DISK='F:\backup\AdvFull1.bak'
    
  2. 對資料庫做一個操作,然後做一個日誌備份
      --drop table t2;
      use AdventureWorksDW2018;
      create table t2(number int, name nvarchar(50));
      insert into t2 values(1, 'a');
      go 
      BACKUP LOG [AdventureWorksDW2018] TO DISK='F:\backup\AdvLog2.bak'
    
  3. 對資料庫做一個操作
      use AdventureWorksDW2018;
      insert into t2 values(2, 'b');
      go
    
  4. 此時災難發生,試圖建立一個尾日誌備份
    use master
    backup log [AdventureWorksDW2018] to disk = 'F:\backup\AdvLogTail.bak' with norecovery;
    go
    
  5. 刪除 AdventureWorksDW2018 資料庫
    drop database [AdventureWorksDW2018];
    
  6. 從備份恢復一個全備份
    restore database [AdventureWorksDW2018] from disk = 'F:\backup\AdvFull1.bak' with norecovery;
    
  7. 從備份中恢復一個正常的日誌備份
    restore log [AdventureWorksDW2018] from DISK='F:\backup\AdvLog2.bak' with norecovery;
    
  8. 用 STOPAT 恢復尾日誌檔案
    restore log [AdventureWorksDW2018] from DISK='F:\backup\AdvLogTail.bak' with stopat = '2018-09-27 16:23:00.000', recovery;
    go
    
  9. 驗證資料完整性
    use AdventureWorksDW2018
    select * from t2;
    

方案缺點
要做一次資料庫的完整備份恢復,這在時間上和空間上都是代價高昂的

  • 時間上
    SQL Server 需要很長的時間來重建整個資料庫。在此過程中,資料庫是不能訪問的。重建時間的長短基本由硬碟的速度決定。一個上TB的資料庫做一個完整恢復可能需要近一天的時間,這個等待時間很多系統不能接受。

  • 空間上
    一個完整備份的大小和資料庫已使用空間大小基本一致。若備份要放在硬碟上,需要硬碟能提供2倍的儲存空間,一份放資料庫,一份放備份。

參考資料

<<SQL Server 2012 實施與管理實戰指南>>