Sql-Server

使用 FileTable 恢復數據庫

  • July 4, 2016

我們有一個 SQL Server 2014 (build 12.0.24457.0) 數據庫,裡面有兩個表,都是 FileStream 表,最大的有 2979466 行,SUM(cached_file_size)= 40564905472.

我們試圖將這個數據庫恢復到我們的測試伺服器上,但這需要很長時間。我們的 DBA 在 14 天后放棄了。

是否有其他人嘗試使用 FileStream 表恢復數據庫,其中包含更多文件?

我正在執行這個腳本來監控進度:

BEGIN TRY
   DROP TABLE #h 
END TRY
BEGIN CATCH
END CATCH

DECLARE @r INT=1, @percent_complete NUMERIC(9,2), @Extimated_Completion_Datetime DATETIME2(0)
CREATE TABLE #h ( start_time DATETIME2(0), percent_complete NUMERIC(9,2), Estimated_completion_time NUMERIC(9,2), HoursSinceStart NUMERIC(9,2), Extimated_Completion_Datetime DATETIME2(0), session_id INT, created_date datetime2(0))
DECLARE @d VARCHAR(19) , @e VARCHAR(max)


WHILE @r > 0 BEGIN 
   INSERT INTO #h
   SELECT start_time, percent_complete, CAST(ROUND(estimated_completion_time/3600000.0,1) AS DECIMAL(9,1)) AS Estimated_completion_time
   , CAST(ROUND(total_elapsed_time/3600000.0,1) AS DECIMAL(9,1)) AS HoursSinceStart
   , DATEADD(HOUR, CAST(ROUND(estimated_completion_time/3600000.0,1) AS DECIMAL(9,1)), GETDATE()) AS Extimated_Completion_Datetime
   , session_id
   , GETDATE()
   FROM
   sys.dm_exec_requests AS r
   WHERE
   r.session_id <> @@SPID
   AND r.session_id > 50
   AND command LIKE 'restore database'
   SELECT @r = @@ROWCOUNT

   select top 1 @percent_complete=percent_complete, @Extimated_Completion_Datetime=Extimated_Completion_Datetime from  #h ORDER BY created_date DESC
   SET @d = CONVERT(VARCHAR(19), @Extimated_Completion_Datetime, 121) 
   SET @e = CONVERT(VARCHAR(19), GETDATE(), 121) + ' we are ' + LTRIM(@percent_complete) + '% complete. We estimate to finish at: ' + @d
   RAISERROR('At %s ', 10, 1, @e) WITH NOWAIT


   --WAITFOR DELAY '00:00:10'
   WAITFOR DELAY '00:01:00'
END

到目前為止,我有這個結果:

在 2016-06-08 10:35:46,我們完成了 00.01%。
在 2016-06-08 14:22:46,我們完成了 39.26%。我們預計完成時間:2016-06-08 18:22:47
在 2016-06-08 14:23:46,我們完成了 39.27%。我們預計完成時間:2016-06-08 18:23:47
在 2016-06-08 14:24:46,我們完成了 39.28%。我們預計完成時間:2016-06-08 18:24:47
...
在 2016-06-09 08:33:07,我們完成了 44.80%。我們預計完成時間:2016-06-10 09:33:08
在 2016-06-09 08:34:07 我們完成了 44.80%。我們預計完成時間:2016-06-10 09:34:08
在 2016-06-09 08:35:07,我們完成了 44.80%。我們預計完成時間:2016-06-10 09:35:08
在 2016-06-09 08:36:07,我們完成了 44.81%。我們預計完成時間:2016-06-10 09:36:08
在 2016-06-09 08:37:07,我們完成了 44.81%。我們預計完成時間:2016-06-10 09:37:08
在 2016-06-09 08:38:07,我們完成了 44.81%。我們預計完成時間:2016-06-10 09:38:08
在 2016-06-09 08:39:07,我們完成了 44.82%。我們預計完成時間:2016-06-10 09:39:08
...
在 2016-06-10 08:12:01,我們完成了 47.86%。我們預計完成時間:2016-06-12 08:12:02
在 2016-06-10 08:13:01,我們完成了 47.86%。我們預計完成時間:2016-06-12 08:13:02

不完全快。它已經在 13:45 成功地從 42% 上升到 45%,所以按照目前的速度,它看起來會在 2016-06-27 13:45 或 18 天內完成。對於 44 GB!

SELECT top 10000 resource_description AS resource_description, * 
FROM sys.dm_os_waiting_tasks
WHERE session_id=64

說:

等待類型=BACKUPTHREAD

……有時BACKUPIO也是

所以我設置了另一個恢復來獲取恢復消息:

DBCC TRACEON(3604, 3605, 3014);
RESTORE DATABASE [VDCFileStreamhespotest] FROM  DISK = N'\\dkrdsvdcp19\MSSQL_Backup\Full\Misc\VDCFileStream_backup_2016_06_07_180004_7123139.bak' WITH  FILE = 1,  
NOUNLOAD,  REPLACE,  STATS = 1
, move 'VDCFileStream'      to 'P:\MSSQL\DPA\System\MSSQL10_50.DPA\MSSQL\DATA\UserDBs\VDCFileStream\VDCFileStreamDBhespo.mdf'
, MOVE 'VDCFileStream_log'  to 'P:\MSSQL\DPA\Log\Log02\VDCFileStream\VDCFileStreamDBhespo_log.ldf'
, MOVE 'VDCFileStreamF1'    to 'G:\VDCFileStream\FileStreamDatahespo'
恢復(VDCFileStreamhespotest):RESTORE DATABASE 已啟動
Restore(VDCFileStreamhespotest):打開備份集
Restore(VDCFileStreamhespotest):處理前導元數據
恢復(VDCFileStreamhespotest):計劃開始
備份/恢復緩衝區配置參數
記憶體限制:32767 MB
緩衝區計數:6
緩衝器組:2
最大傳輸大小:1024 KB
最小 MaxTransferSize:1024 KB
總緩衝區空間:12 MB
表格數據設備數:1
全文數據設備計數:0
文件流設備數:1
TXF 設備數:0
文件系統 i/o 對齊:512
媒體緩衝區計數:6
媒體緩衝區大小:1024 KB
編碼緩衝區計數:6
Restore(VDCFileStreamhespotest):有效選項:Checksum=1,Compression=1,Encryption=0,BufferCount=6,MaxTransferSize=1024 KB
Restore(VDCFileStreamhespotest):規劃完成
恢復(VDCFileStreamhespotest):開始離線恢復
恢復(VDCFileStreamhespotest):附加數據庫為 DB_ID=48
恢復(VDCFileStreamhespotest):準備容器
恢復(VDCFileStreamhespotest):容器準備就緒
Restore(VDCFileStreamhespotest):恢復備份集
恢復(VDCFileStreamhespotest):估計要傳輸的總大小 = 45540792320 字節
恢復(VDCFileStreamhespotest):傳輸數據
1% 已處理。

5 天后,我們現在已經完成了一半:但剩下的旅程將會很長

您正嘗試在伺服器上使用 32GB 記憶體恢復 45GB 數據庫。

您可以做的是增加伺服器上的記憶體(RAM)並使用

  1. 將備份條帶化到多個 LUN 或磁碟。
  2. 使用BUFFERCOUNT, BLOCKSIZE,MAXTRANSFERSIZE備份參數和INIT& COMPRESSION(正如我從你的輸出中看到的那樣,你正在使用它)來調整你的備份。
  3. 不要在備份時使用 CHECKSUM,因為它可能會延長備份時間。而是嘗試將備份恢復到不同的伺服器以進行測試 - 這將確認您能夠恢復它,然後執行 CHECKDB 以確認沒有損壞。

到目前為止,您只能獲得 6MB,這非常低。

引用自:https://dba.stackexchange.com/questions/140703