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
相关产品推荐
相关产品推荐

