我必须对所有数据库进行连续备份(所有 .BAK 文件的数据总计为 3.25 GB)。
如果我配置脚本在备份数据库之前先将数据库设置为只读,速度会更快吗?
我正在使用 RESTORE VERIFYONLY 选项来检查备份的完整性。我还想知道有什么可以加快该过程吗?我发现这比实际备份花费的时间更长!
答案1
将其设置为READ ONLY
可能会对您有所帮助,因为您正在从海洋中取出一滴水。
备份考虑活跃交易,在备份期间。
这意味着,是的,当您将数据库放入时,READ ONLY
您会减少一点点开销。
从技术上讲,这确实有帮助,但实际上并不值得。
提高备份性能著名领土.
有很多博客文章甚至还有一篇关于如何提高备份性能的 Tech-Net 文章。这些文章都没有提到只读,因为说实话你不会注意到任何差异。
要提高备份性能:
- 使用多种媒体或设备
- 研究特定备份类型的优化选项。
完整备份和差异备份的优化与日志备份不同,但与恢复备份的优化也不同。 - 提高原始平台的读取性能
- 提高目标平台上的写入性能
所以总结一下:
是的,它有帮助,但还不足以被一个理智的人衡量。
有很多方法可以提高备份性能,请尝试研究一下。
答案2
将其设置为只读对您没有帮助。您还会使任何需要写访问权限的应用程序停机。
看看你的瓶颈现在在哪里。大多数情况下,它都是以下两个原因之一。
CPU 是瓶颈:不要压缩您的备份。
磁盘是瓶颈:压缩您的备份。
如果您想深入了解,请在备份运行时运行此 TSQL 脚本:
SELECT command,
sh.text,
start_time,
percent_complete,
CAST(((DATEDIFF(s,start_time,GetDate()))/3600) as varchar) + ' hour(s), '
+ CAST((DATEDIFF(s,start_time,GetDate())%3600)/60 as varchar) + 'min, '
+ CAST((DATEDIFF(s,start_time,GetDate())%60) as varchar) + ' sec' as running_time,
CAST((estimated_completion_time/3600000) as varchar) + ' hour(s), '
+ CAST((estimated_completion_time %3600000)/60000 as varchar) + 'min, '
+ CAST((estimated_completion_time %60000)/1000 as varchar) + ' sec' as est_time_to_go,
dateadd(second,estimated_completion_time/1000, getdate()) as est_completion_time,
status, blocking_session_id, wait_type, wait_time, last_wait_type, wait_resource, reads, writes, cpu_time
FROM sys.dm_exec_requests re
CROSS APPLY sys.dm_exec_sql_text(re.sql_handle) sh
WHERE re.command in ('RESTORE DATABASE', 'BACKUP DATABASE', 'RESTORE LOG', 'BACKUP LOG')
(percent_complete
在 2014 下不起作用,仍然需要找到解决方案)。
在列中,wait_type
您将看到导致备份等待的原因。您可以在此列表。如果它必须等待另一个进程,它将显示在 中blocking_session_id
。然后您可以使用 获取有关该进程的更多详细信息sp_who2 xxx
。
如果您的服务器(磁盘/CPU)可以处理,您可以安排备份并发运行。如果您真的想要性能,请备份到多个文件,跨多个磁盘。
答案3
@BartDeVos 说得对,这取决于你的瓶颈是什么,但他忽略了关键点,那就是如果竞争写锁是你的瓶颈,那么是的,使数据库只读会有所帮助。(如果不是,那么不要担心)。
我的数据库专业知识不涉及 Microsoft 产品,因此我无法评论您使用的特定引擎,并且数据库引擎和备份系统之间的实现细节存在相当大的差异。
编辑。阅读评论。如果使用的备份系统是其他受访者假设的备份系统,那么备份速度不会受到影响,我猜 OP 对.bak
文件的引用倾向于支持这一点。