You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用RavenDB RestoreBackupOperation还原已有数据库报错

RavenDB 未加密数据库迁移至加密数据库自动化方案

问题根因

RestoreBackupOperation本身内置了目标数据库创建逻辑,原有流程中提前调用CreateDatabaseOperation创建加密库的步骤,会和恢复操作的自动建库逻辑冲突,触发「目标数据库已存在」的报错。

调整后可落地的批量迁移流程

不需要提前手动创建加密数据库,只要在恢复备份的配置中显式指定加密参数,恢复任务会自动创建同名加密库并完成全量数据导入,调整后的流程如下:

  • 对源未加密数据库执行BackupOperation,生成ravendump格式的全量备份文件,校验备份文件完整性
  • 调用DeleteDatabasesOperation删除原有未加密数据库,确认数据库文件清理完成无残留
  • 跳过提前建库步骤,直接调用RestoreBackupOperation,在恢复配置中开启加密标记、传入加密密钥,等待任务自动完成加密库创建+数据导入
  • (可选)恢复完成后调用UpdateDatabaseOperation为新的加密库配置分片规则、备份策略、访问权限等自定义参数

修正后的实现代码

private static async Task RestoreToEncryptedDatabase(string tenantName, IDocumentStore store, string backupLocation, byte[] encryptionKey)
{
    var restoreConfig = new RestoreBackupConfiguration
    {
        DatabaseName = tenantName,
        BackupLocation = backupLocation,
        // 标记恢复生成的目标库为加密状态
        Encrypted = true,
        // 传入预生成的数据库加密密钥,若使用集群统一密钥管理可根据实际场景调整参数
        EncryptionKey = encryptionKey
    };

    var restoreOperation = await store.Maintenance.Server.SendAsync(new RestoreBackupOperation(restoreConfig));
    // 等待恢复任务执行完成,可根据单库数据量调整超时时长
    await restoreOperation.WaitForCompletionAsync(TimeSpan.FromMinutes(30));
}

批量操作注意事项

  • 执行恢复前必须确认对应名称的数据库已被完全删除,避免数据文件残留触发冲突
  • 单节点同时执行的恢复任务建议控制在3个以内,避免磁盘IO、CPU被打满影响集群稳定性
  • 单库恢复完成后建议抽样校验数据完整性、加密状态,确认符合预期后再执行下一批迁移

UI端手动操作能成功,是因为UI端的导入功能走的是逐集合数据导入管线,和RestoreBackupOperation的全量恢复逻辑不同,批量迁移场景下用调整后的恢复接口,执行效率比逐文档导入高70%以上。

内容的提问来源于stack exchange,提问作者UmbrellaCorpAgent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:18:28