SQL Server 提供三種恢復模型,決定了交易記錄的管理方式與資料保護層級,是制定備份策略的基石。
BULK INSERT、SELECT INTO、索引建立)採用最小記錄,僅記錄結果而非細節。-- 切換恢復模型範例
ALTER DATABASE [YourDB] SET RECOVERY SIMPLE;
ALTER DATABASE [YourDB] SET RECOVERY BULK_LOGGED;
ALTER DATABASE [YourDB] SET RECOVERY FULL;
建議使用永久邏輯設備,便於腳本維護與排程自動化。
-- 建立本地磁碟永久備份設備
EXEC sp_addumpdevice 'disk', 'Bak_Device_Local', 'E:\Backup\DB_Backup.bak';
-- 建立網路路徑永久備份設備
EXEC sp_addumpdevice 'disk', 'Bak_Device_Network', '\\BackupServer\Share\DB_Backup.bak';
-- 刪除設備
EXEC sp_dropdevice 'Bak_Device_Network';
將備份分散至多個檔案(置於不同磁碟/磁帶),可顯著提升 I/O 吞吐量。媒體集內的檔案必須同時使用,不可單獨讀寫。
-- 初始化媒體集並平行備份至 3 個檔案
BACKUP DATABASE [DB_Name] TO Bak_File1, Bak_File2, Bak_File3
WITH MEDIANAME = 'MediaSet_DB', FORMAT;
-- 後續備份必須指定所有媒體集成員
BACKUP DATABASE [DB_Name] TO Bak_File1, Bak_File2, Bak_File3;
-- 查看媒體集內容
RESTORE HEADERONLY FROM Bak_File1, Bak_File2, Bak_File3;
包含所有資料頁面與作用中交易的記錄部分。所有差異與記錄備份的基準。
BACKUP DATABASE [DB_Name] TO Bak_Device WITH INIT, NAME = 'Full_Backup_Base';
僅備份自上次完整備份以來變更的資料頁(透過 DCM 頁面追蹤)。恢復時:最新完整備份 + 最新差異備份。
BACKUP DATABASE [DB_Name] TO Bak_Device WITH DIFFERENTIAL, NAME = 'Diff_Backup_20231027';
僅在完整/大量記錄模式下可用。記錄備份鏈不可中斷。恢復流程:完整備份 (NORECOVERY) → 依序套用所有記錄備份 (NORECOVERY) → 最後一筆記錄備份 (RECOVERY/STOPAT)。
BACKUP LOG [DB_Name] TO Bak_Device WITH NAME = 'Log_Backup_1000';
-- 簡單模式下自動截斷 (預設行為)
-- 完整模式下需定期 BACKUP LOG 才會截斷
BACKUP LOG [DB] WITH TRUNCATE_ONLY:截斷並記錄操作 (舊版本)。BACKUP LOG [DB] WITH NO_LOG:截斷但不記錄操作 (舊版本)。BACKUP LOG [DB] TO Bak_Device WITH NO_TRUNCATE:關鍵救命稻草。資料檔損壞時,在記錄檔仍在線的情況下強制備份尾部記錄,確保零資料遺失。
-- 1. 發生誤操作前,立即備份尾部記錄 (若資料庫在線)
BACKUP LOG [DB_Name] TO DISK = 'E:\Backup\TailLog.trn' WITH NO_TRUNCATE;
-- 2. 還原完整備份
RESTORE DATABASE [DB_Name] FROM DISK = 'E:\Backup\Full.bak' WITH NORECOVERY, REPLACE;
-- 3. 還原差異備份 (若有)
RESTORE DATABASE [DB_Name] FROM DISK = 'E:\Backup\Diff.bak' WITH NORECOVERY;
-- 4. 依序還原記錄備份至誤操作前一刻
RESTORE LOG [DB_Name] FROM DISK = 'E:\Backup\Log1.trn' WITH NORECOVERY;
RESTORE LOG [DB_Name] FROM DISK = 'E:\Backup\Log2.trn' WITH NORECOVERY;
RESTORE LOG [DB_Name] FROM DISK = 'E:\Backup\TailLog.trn' WITH RECOVERY, STOPAT = '2023-10-27 14:30:00';