如何使数据库备份更快?

SQL*_*Boy 6 sql-server-2008 sql-server backup

我最近参加了下一份工作的面试,并被问到:

如何在 SQL Server 中加快大小接近 1TB 或 800 GB 的数据库的备份?

我的回答:我们可以使用数据库压缩或使用 Light Speed 之类的第三方工具。

但他们期待这个我不知道的答案:

解决方案:通过添加更多目标文件来提高吞吐量

例子

我通过添加更多备份目标文件创建了这个示例脚本:

DBCC TRACEON (3605, -1) 
DBCC TRACEON (3213, -1) 

BACKUP DATABASE [AdventureWorks2008] TO 
    DISK = N'E:\ADWBackup\AdventureWorks2008-Full.bak',
    DISK = N'E:\ADWBackup\AdventureWorks2008-Full-File2.bak', 
    DISK = N'E:\ADWBackup\AdventureWorks2008-Full-File3.bak'
WITH 
    NOFORMAT, INIT, NAME = N'AdventureWorks2008-Full Database Backup', 
    SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10 

DBCC TRACEOFF(3605, -1) 
DBCC TRACEOFF(3213, -1)
Run Code Online (Sandbox Code Playgroud)

能否请您回答以下问题:

  1. 遵循这种方法而不是使用单个文件有什么用?
  2. 如果我这样做会有任何时差吗?
  3. 如何使用多个拆分文件恢复数据库?
  4. 真的会提高备份速度吗?

Ant*_*rds 5


理论

备份的多个目标可能非常有用,但仅限于某些情况。

  • 您的源数据库的读取速度可以比您当前的单个文件备份的写入速度更快。

  • 每个数据库的备份目标位于不同的轴上。

  • 您没有在 SQL Server 实例和媒体之间使用共享的 SAN HBA 或 iSCSI 或其他带宽。

  • 即写入备份文件 A 的 IOPS不要使用与写入备份文件 B 相同的磁盘。

如果所有这些都是真的,那么某种程度的并行性(许多输出文件)可能会提高速度。如果所有这些都不是真的,很可能会导致一组或多组磁盘抖动,并且您的多文件备份实际上会变慢,并且还可能导致操作系统文件系统或存储级碎片,因为您正在编写同时备份文件A和备份文件B!

请注意,我在对事务日志备份串行或并行的回答中涵盖了许多相同的内容,因为这是关于并行写入(虽然不一定是读取,取决于您的文件组和文件的布局方式)。


实验

要真正理解这一点,您可能需要了解向亲密朋友借用一些设备。

  • 获得一 (1) 个快速固态磁盘

    • 任何好的 SATA2 或 SATA3 或 mSATA Samsung、Crucial、Mushkin 等内部驱动器都可以

    • 您需要确保读取速度比写入速度快。

  • 除了 SQL Server 数据和日志文件所在的驱动器之外,请求、借用或购买至少两个磁盘驱动器。

    • 其中一 (1) 个可以是插入 USB2 端口的 USB2 外部驱动器(或 USB3 驱动器)

    • 其中一 (1) 个可以是插入 USB3 端口的 USB2 外部驱动器

      • 我们可以合理地确定 USB2 和 USB3 端口不共享总线不同的控制器

      • 您不能将 USB3 驱动器插入此处的 USB3 端口,因为我们希望我们的备份设备单独运行缓慢,但不会相互竞争总线带宽

    • 一个或多个驱动器可以是 SATA 旋转磁盘

  • 登录到本地 SQL Server Developer 或 SQL Server Express 实例

    • 使用快速 SATA SSD 上的数据和日志文件创建一个相当大的数据库。

    • 现在尝试连续备份两次(同一 SQL 批处理中的两个BACKUP DATABASE命令)到每个备份设备,一次一个设备

    • 记录备份速度并仅在每个备份的第二个备份上进行验证,即在缓存已填充之后。

    • 现在你知道每个人的速度有多快了;一个可能比其他的更好。

    • 现在尝试一次连续备份两次(同一 SQL 批处理中的两个BACKUP DATABASE命令)到所有备份设备(即使用多个 DISK 参数)

看到速度差异了吗?

现在尝试使用 BUFFERCOUNT、MAXTRANSFERSIZE,如果您使用的是开发者版本,则使用 COMPRESSION。

始终使用 CHECKSUM 选项!


小智 1

我认为加速 1TB 数据库备份过程(和恢复)的完美方法是拍摄 SAN 或 VMWare 快照。

尽管如此,你的潜在雇主所期望的答案是可以的,但在某些情况下可能根本不会给出任何结果。要使这种方法发挥作用,您必须拥有多个磁盘阵列。为了简化这个想法,想象一下,如果您将 5 个不同的备份文件并行写入 5 个不同的 SSD,而不是 1 个 SSD。这就是他们的想法。

您的脚本非常好,但如果您在笔记本电脑上测试它,如前所述,您可能几乎没有任何改进。另外,您还必须考虑其他因素,例如网络的吞吐量等。

一篇好的开始文章是https://www.mssqltips.com/sqlservertip/935/backup-to-multiple-files-for-faster-and-smaller-sql-server-files/