-- 1. 建立同名資料庫 (路徑自訂)
CREATE DATABASE RecoverDB
ON (NAME = RecoverDB, FILENAME = 'D:\Data\RecoverDB.mdf')
LOG ON (NAME = RecoverDB_log, FILENAME = 'D:\Data\RecoverDB_log.ldf');
GO
-- 2. 停止 SQL Server 服務 (服務管理器 / net stop MSSQLSERVER)
-- 3. 用備份的 .mdf 覆蓋剛建立的 .mdf
-- copy /y "BackupPath\RecoverDB.mdf" "D:\Data\RecoverDB.mdf"
-- 4. 啟動 SQL Server 服務
-- 資料庫將進入「疑似損毀」或「緊急模式」狀態
-- 切換至 master
USE master;
GO
-- 宣告變數
DECLARE @dbname sysname = 'RecoverDB'; -- 你的資料庫名稱
-- 1. 設為緊急模式 (僅 sysadmin 可存取, 唯讀, 不執行復原)
ALTER DATABASE @dbname SET EMERGENCY;
GO
-- 2. 設為單用戶模式 (防止其他連線干擾修復)
EXEC sp_dboption @dbname, 'single user', 'true'; -- 舊版相容
-- 或新版: ALTER DATABASE @dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3. 執行修復 (允許資料遺失 - 最後手段)
-- REPAIR_ALLOW_DATA_LOSS: 刪除損毀頁面/索引, 盡力救資料
DBCC CHECKDB (@dbname, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
-- 4. 重建索引/修復邏輯錯誤 (非資料遺失層級)
DBCC CHECKDB (@dbname, REPAIR_REBUILD) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
-- 5. 恢復多用戶模式
EXEC sp_dboption @dbname, 'single user', 'false';
-- 或: ALTER DATABASE @dbname SET MULTI_USER;
GO
-- 6. 退出緊急模式 (自動執行復原, 使資料庫一致)
ALTER DATABASE @dbname SET ONLINE;
GO
SELECT name, state_desc FROM sys.databases WHERE name = 'RecoverDB'; 應為 ONLINE。SELECT * INTO NewHealthyDB.dbo.Table FROM RecoverDB.dbo.Table; 或用匯入匯出精靈/BCP/SSIS。| 指令/選項 | 作用 | 風險 |
|---|---|---|
SET EMERGENCY | 繞過正常啟動復原,直接掛載資料庫 (唯讀、sysadmin 限定) | 低 |
SINGLE_USER | 獨佔存取,防止修復過程被干擾 | 中 (踢掉現有連線) |
REPAIR_ALLOW_DATA_LOSS | 刪除無法修復的頁面/索引,**永久遺失該頁資料** | **極高** (不可逆) |
REPAIR_REBUILD | 重建索引、修復非資料頁錯誤,**不遺失資料** | 低 |
REPAIR_ALLOW_DATA_LOSS 後再跑一次 REPAIR_REBUILD,或重複執行修復腳本 2-3 次直到無錯誤。ALTER DATABASE ... SET ONLINE 觸發最終復原。DBCC CHECKDB ... REPAIR_ALLOW_DATA_LOSS 多跑幾次,或尋求 Microsoft 支援/第三方資料救援工具 (如 Stellar Repair for MS SQL)。CHECKSUM 頁面驗證:ALTER DATABASE ... SET PAGE_VERIFY CHECKSUM;。DBCC CHECKDB 例行檢查 (每週/每日),早期發現損毀。僅有 .mdf 時,**緊急模式 + 單用戶 + REPAIR_ALLOW_DATA_LOSS** 是最後搶救手段。**必須接受資料遺失風險**,修復後務必全量匯出至新庫。平日備份策略到位,根本不需走上這條不歸路。