使用RavenDB Smuggler克隆同服务器数据库时无响应且无异常
RavenDB 同服务器克隆数据库操作停滞无响应问题
在同一服务器(相同DocumentStore地址)下,指定已创建的源数据库名和目标数据库名克隆数据库时,操作无任何反应且未抛出异常。控制台应用执行ExportAsync函数时停滞,使用最新版RavenDB及RavenDB.Client,运行环境为.NET 6,预期将源数据库所有内容复制到目标数据库。
相关代码:
Console.WriteLine("start"); var exportOperation = await store .Smuggler .ForDatabase(name) .ExportAsync( new DatabaseSmugglerExportOptions(), store.Smuggler.ForDatabase(target)); await exportOperation.WaitForCompletionAsync(); Console.WriteLine("ends");
排查与解决建议
- 确认目标数据库状态:确保
target对应的数据库已在RavenDB服务器上成功创建,无锁定、异常等不可用情况。 - 显式配置导出选项:默认的
DatabaseSmugglerExportOptions可能缺少必要配置,明确指定导出内容避免默认逻辑遗漏:var exportOptions = new DatabaseSmugglerExportOptions { IncludeDocuments = true, IncludeIndexes = true, IncludeTimestamps = true, IncludeAttachments = true }; - 改用本地文件中转的导入导出方式:避免直接跨数据库传输可能的阻塞,先导出到本地文件再导入目标库:
// 导出到本地文件 var exportPath = "./temp_export.ravendb"; var exportOp = await store.Smuggler.ForDatabase(name) .ExportAsync(new DatabaseSmugglerExportOptions(), exportPath); await exportOp.WaitForCompletionAsync(); // 导入到目标数据库 var importOp = await store.Smuggler.ForDatabase(target) .ImportAsync(new DatabaseSmugglerImportOptions(), exportPath); await importOp.WaitForCompletionAsync(); - 检查服务器日志:查看RavenDB服务器端日志,排查是否存在客户端未捕获的错误,比如权限不足、资源耗尽等问题。
- 避免异步死锁:确保控制台应用的主入口方法使用
async Task而非void,防止同步等待导致的死锁:static async Task Main(string[] args) { // 数据库操作逻辑 }
内容的提问来源于stack exchange,提问作者Umair Javed
相关产品推荐
相关产品推荐

