使用 FileTable 还原数据库

Hen*_*sen 7 sql-server restore filetable sql-server-2014

我们有一个 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
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有这个结果:

在 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
Run Code Online (Sandbox Code Playgroud)

说:

等待类型=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'
Run Code Online (Sandbox Code Playgroud)
恢复(VDCFileStreamhespotest):恢复数据库已启动
恢复(VDCFileStreamhespotest):打开备份集
Restore(VDCFileStreamhespotest):处理前导元数据
恢复(VDCFileStreamhespotest):规划开始
备份/恢复缓冲区配置参数
内存限制:32767 MB
缓冲区计数:6
缓冲器组:2
最大传输大小:1024 KB
最小最大传输大小:1024 KB
总缓冲空间:12 MB
表格数据设备数:1
全文数据设备计数:0
文件流设备数:1
TXF 设备数:0
文件系统 i/o 对齐:512
媒体缓冲区计数:6
媒体缓冲区大小:1024 KB
编码缓冲区计数:6
恢复(VDCFileStreamhespotest):有效选项:校验和=1、压缩=1、加密=0、缓冲区计数=6、MaxTransferSize=1024 KB
恢复(VDCFileStreamhespotest):规划完成
恢复(VDCFileStreamhespotest):开始离线恢复
恢复(VDCFileStreamhespotest):附加数据库为 DB_ID=48
恢复(VDCFileStreamhespotest):准备容器
恢复(VDCFileStreamhespotest):容器已准备就绪
Restore(VDCFileStreamhespotest):恢复备份集
恢复(VDCFileStreamhespotest):估计要传输的总大小 = 45540792320 字节
恢复(VDCFileStreamhespotest):传输数据
1% 处理。

5 天后,我们现在已经完成了一半:但剩下的旅程将是漫长的

Kin*_*hah 1

您正尝试在服务器上恢复具有 32GB 内存的 45GB 数据库。

您可以做的是增加服务器上的内存 (RAM) 并使用

  1. 将备份条带化到多个 LUN 或磁盘。
  2. 使用BUFFERCOUNTBLOCKSIZEMAXTRANSFERSIZE备份参数以及INIT& COMPRESSION(正如我从输出中看到的那样,您正在使用它)来调整您的备份。
  3. 进行备份时不要使用 CHECKSUM,因为它会导致备份时间更长。相反,尝试将备份恢复到不同的服务器来测试它 - 这将确认您能够恢复它,然后运行 ​​CHECKDB 以确认没有损坏。

截至目前,您只能获得 6MB,这是相当低的。