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 方案的关键优势:
- 完全控制数据流——直接写入云存储或媒体服务器
- 独立于 SQL Server 的文件系统
- 支持条带化操作以提升吞吐量
- 统一的错误处理和日志记录入口
- 符合企业备份系统对存储策略管理的要求
与简化方案不同,“Beresta”项目将 VDI 实现为 SQL Server 与存储后端之间的完整传输适配器,支持从 2008 到 2022 版本的兼容性。
VDI 客户端架构:从准备到执行
实现分为两个逻辑阶段。在准备阶段,验证参数,通过 ODBC 连接 SQL Server,并形成任务集。至关重要的是,该项目支持多种 ODBC 驱动程序(包括当前的 Driver 17/18),这提升了异构环境中的兼容性。
执行期间,激活 VDI 流:
- 通过 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 参数会创建如下文件:
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
暂无评论。