資料庫檔案損壞是 DBA 最噩夢的情境。本文以 SQL Server 2000 為例,完整演示從完整備份、記錄備份(NO_TRUNCATE)到分階段還原(NORECOVERY/RECOVERY)的標準災難復原流程,強調完備備份策略的重要性。
-- 建立完整復原模式資料庫
CREATE DATABASE test;
GO
USE test;
GO
CREATE TABLE a (c1 varchar(2));
INSERT INTO a VALUES ('aa'), ('bb');
GO
-- 完整備份
BACKUP DATABASE test TO DISK = 'test_1.bak';
GO
-- 後續異動
INSERT INTO a VALUES ('cc');
CREATE TABLE b (c1 int);
INSERT INTO b VALUES (1), (2);
GO
停止 SQL Server 服務,使用十六進位編輯器(如 UltraEdit)隨意修改 test_data.mdf 位元,模擬實體媒體損壞。重啟服務後,資料庫呈現置疑狀態。
-- 以 NO_TRUNCATE 強制備份受損資料庫的作用中記錄
BACKUP LOG test TO DISK = 'test_2.bak' WITH NO_TRUNCATE;
GO
-- 訊息:已處理 2 頁,屬於檔案 'TEST_Log',耗時 0.111 秒
NO_TRUNCATE 允許在資料庫損壞時仍能備份交易記錄,確保最後交易不遺失。
RESTORE DATABASE test FROM DISK = 'test_1.bak' WITH NORECOVERY;
GO
-- 訊息:已處理 97 頁,耗時 0.107 秒
NORECOVERY 讓資料庫處於「還原中」狀態,可套用後續記錄備份。
RESTORE LOG test FROM DISK = 'test_2.bak' WITH RECOVERY;
GO
-- 訊息:已處理 2 頁,耗時 0.056 秒
RECOVERY 完成還原並線上資料庫。驗證 SELECT * FROM a 可見資料完整保留。
RESTORE DATABASE ... WITH NORECOVERY → RESTORE LOG ... WITH RECOVERY。災難無法避免,但透過嚴謹的備份架構與演練,將資料遺失風險降至最低。