返回首页

SQL Server 的 VDI:无需 .bak 文件的备份 | 指南

MS SQL Server 备份的 VDI 客户端实现的详细技术分解。交互架构、通过条带备份的并行处理以及链式恢复均有详细描述。该解决方案兼容 SQL Server 2008-2022,并与企业备份系统集成。

SQL Server 备份的 VDI 集成完整指南
Advertisement 728x90

VDI 集成:无需 .bak 文件构建 MS SQL 备份

MS SQL Server 中的标准 BACKUP DATABASE 命令仅限于本地磁盘存储。要与外部备份系统集成,需要 VDI——这是一个接口,允许直接从 SQL Server 截取数据流。我们剖析了“Beresta”项目中 VDI 客户端的实现,该项目提供无需中间 .bak 文件的完整备份和恢复周期。

现代备份系统中为何需要 VDI

通过 TO DISK 的 SQL Server 原生备份机制无法满足外部数据保护系统的需求。当需要作业生命周期管理、数据路由、并行处理或与对象存储集成时,就需要一个中间层。VDI(虚拟设备接口)就充当了这样的桥梁:SQL Server 继续执行标准的 BACKUP 和 RESTORE 命令,但不是物理文件,而是与外部应用程序管理的虚拟设备交互。

VDI 方案的关键优势:

Google AdInline article slot
  • 完全控制数据流——直接写入云存储或媒体服务器
  • 独立于 SQL Server 的文件系统
  • 支持条带化操作以提升吞吐量
  • 统一的错误处理和日志记录入口
  • 符合企业备份系统对存储策略管理的要求

与简化方案不同,“Beresta”项目将 VDI 实现为 SQL Server 与存储后端之间的完整传输适配器,支持从 2008 到 2022 版本的兼容性。

VDI 客户端架构:从准备到执行

实现分为两个逻辑阶段。在准备阶段,验证参数,通过 ODBC 连接 SQL Server,并形成任务集。至关重要的是,该项目支持多种 ODBC 驱动程序(包括当前的 Driver 17/18),这提升了异构环境中的兼容性。

执行期间,激活 VDI 流:

Google AdInline article slot
  • 通过 CoInitializeEx 初始化 COM
  • 创建 IClientVirtualDeviceSet2 对象
  • 为虚拟设备生成 GUID
  • 设置 VDConfig 参数(块大小、超时、缓冲深度)
  • 通过 CreateEx 发布设备
  • 启动指定 VIRTUAL_DEVICE 的 T-SQL 命令
  • 在工作线程中处理数据

核心组件是 transferThreadProc,它实现了与 SQL Server 的交换逻辑:

while (true) {
    VDC_Command* command;
    device->GetCommand(&command);
    
    switch (command->dwCommandCode) {
        case VDC_Write:
            WriteToFile(command->pvBuffer, command->dwByteCount);
            break;
        case VDC_Read:
            ReadFromFile(command->pvBuffer, command->dwByteCount);
            break;
        case VDC_Flush:
            FlushBuffer();
            break;
    }
    device->CompleteCommand(command, S_OK);
}

此循环确保同步交互:SQL Server 作为块数据的生产者,而 VDI 客户端作为消费者,将数据重定向到目标存储。

并行性和性能管理

单线程处理是企业级工作负载的瓶颈。该项目通过条带化备份/恢复来解决这个问题,每个条带由单独线程处理。指定 --stripes=N 参数会创建如下文件:

Google AdInline article slot
db_full_20260412_101530_s0.bak
db_full_20260412_101530_s1.bak
...

这种方法带来三重好处:

  • 将 I/O 负载分布到磁盘或网络通道
  • 吞吐量的线性可扩展性
  • 与具有多流架构的工业备份系统对齐

影响性能的关键参数:

  • blockSize——目标存储的最佳块大小
  • maxTransferSize——最大传输数据包大小
  • buffersPerStripe——每个线程的缓冲深度
  • vdiTimeoutSec——I/O 操作超时

通过实验调整这些参数,可以根据具体基础设施特性定制解决方案——从本地 SSD 到缓慢的网络存储。

恢复链:从完整备份到日志

该项目支持完整的恢复周期,包括差异备份和事务日志。正确的链处理至关重要:

  • 对于差异备份,自动选择相同时间戳的最后一个完整备份
  • 完整恢复使用 WITH NORECOVERY 执行,随后差异备份使用 WITH RECOVERY
  • 日志备份仅允许 FULL/BULK_LOGGED 恢复模型的数据库
  • master 数据库排除在差异操作之外(SQL Server 限制)

集合发现机制使用命名约定:

{db}_{type}_{timestamp}_s{n}.bak

目录扫描函数基于时间戳构建恢复链。对于完整恢复,选择最新集合;对于差异恢复,仅选择具有匹配完整和差异文件的那些。条带数由文件名中最高 sN 索引确定。

恢复前,必须将数据库切换到单用户模式:

ALTER DATABASE [db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

这可防止与活动连接冲突。恢复成功后,将数据库恢复到 MULTI_USER 模式。

关键要点

  • VDI 消除对 SQL Server 文件系统的依赖,将数据流重定向到任意目标存储
  • 支持完整/差异/日志场景,并自动构建恢复链
  • 通过条带化架构的并行处理确保吞吐量的线性可扩展性
  • 与 SQL Server 2008-2022 兼容,不绑定特定 ODBC 驱动程序
  • 实现考虑了 SQL Server 特性(例如 master 数据库限制)

“Beresta”项目展示了即使是相对紧凑的 VDI 客户端实现,也能满足企业备份系统的关键要求。关注完整操作周期(包括错误处理和数据库状态管理)使其具备生产就绪能力。该架构可与任何存储后端集成——从本地磁盘到云对象存储——这在混合 IT 环境中尤为相关。

— Editorial Team

Advertisement 728x90

继续阅读