首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2008

SQL Server 2008 還原資料庫完整腳本:從檔案清單查詢到 WITH MOVE 異地還原

     編輯:SQL Server 2008

1. 查詢備份檔內部檔案清單 (取得邏輯名稱)

RESTORE FILELISTONLY FROM DISK = 'E:\Backup\levws.bak';

輸出欄位:LogicalName、PhysicalName、Type (D=資料/L=記錄) 等。

2. 異地還原標準腳本 (WITH MOVE、REPLACE、STATS)

USE master;
GO
RESTORE DATABASE [levws]
FROM DISK = 'E:\levws.bak'
WITH
    MOVE 'levws_Data' TO 'E:\Data\levws_Data.mdf',   -- 邏輯名 → 新路徑
    MOVE 'levws_Log'  TO 'E:\Log\levws_Log.ldf',
    STATS = 10,            -- 每 10% 顯示進度
    REPLACE;               -- 覆寫同名資料庫
GO

3. 執行結果範例

已處理 374352 頁 (資料檔),1 頁 (記錄檔)。
版本從 539 升級至 655。
RESTORE DATABASE 成功,耗時 205.7 秒 (14.2 MB/秒)。

4. 進階選項說明

  • NORECOVERY:保持還原中狀態,後續套用差異/記錄備份。
  • STANDBY = 'undo_file':唯讀待命模式,可查詢。
  • BLOCKSIZE、BUFFERCOUNT、MAXTRANSFERSIZE:大型資料庫效能調校。
  • CHECKSUM:驗證備份檔完整性。

5. 常見錯誤與對策

6. 自動化還原腳本範本 (動態取得邏輯名稱)

DECLARE @bak NVARCHAR(260) = N'E:\Backup\DB.bak',
        @dataPath NVARCHAR(260) = N'D:\Data\',
        @logPath  NVARCHAR(260) = N'L:\Log\',
        @sql NVARCHAR(MAX);

-- 建立暫存表接收 FILELISTONLY
CREATE TABLE #FileList (
    LogicalName NVARCHAR(128), PhysicalName NVARCHAR(260), Type CHAR(1),
    FileGroupName NVARCHAR(128), Size NUMERIC(20,0), MaxSize NUMERIC(20,0),
    FileId BIGINT, CreateLSN NUMERIC(25,0), DropLSN NUMERIC(25,0),
    UniqueId UNIQUEIDENTIFIER, ReadOnlyLSN NUMERIC(25,0),
    ReadWriteLSN NUMERIC(25,0), BackupSizeInBytes BIGINT,
    SourceBlockSize INT, FileGroupId INT, LogGroupGUID UNIQUEIDENTIFIER,
    DifferentialBaseLSN NUMERIC(25,0), DifferentialBaseGUID UNIQUEIDENTIFIER,
    IsReadOnly BIT, IsPresent BIT, TDEThumbprint VARBINARY(32)
);

INSERT #FileList EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @bak + '''');

-- 動態產生 MOVE 子句
SELECT @sql = COALESCE(@sql + ', ', 'RESTORE DATABASE [DB] FROM DISK = ''' + @bak + ''' WITH ') +
       'MOVE ''' + LogicalName + ''' TO ''' +
       CASE Type WHEN 'D' THEN @dataPath ELSE @logPath END +
       LogicalName + CASE Type WHEN 'D' THEN '.mdf' ELSE '.ldf' END + ''''
FROM #FileList;

SET @sql += ', STATS = 10, REPLACE;';
EXEC sp_executesql @sql;
DROP TABLE #FileList;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤原因解決
邏輯名稱錯誤未先執行 FILELISTONLY務必先查詢邏輯名稱
目標路徑不存在資料夾未建立預先建立資料夾、確認服務帳號權限
資料庫正在使用有作用中連線ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE
版本不相容高版本備份還原至低版本不可跨版本降級還原