使用 mongorestore 导入到 CosmosDB MongoDB API 失败并出现可重试写入错误

Importing to CosmosDB MongoDB API using mongorestore fails with retryable writes error

我正在尝试使用 mongodump 和 mongorestore MongoDB API 将数据从旧的 MongoDB 数据库服务器导出和导入到 Azure CosmosDB。但是我在连接到 CosmosDB 时遇到问题。我正在使用带有 URI 标志的连接字符串。

我的包含连接字符串的 mongorestore 命令如下:

mongorestore --uri="mongodb://$COSMOS_USERNAME:$COSMOS_PASSWORD@$COSMOS_HOST:$COSMOS_PORT/?maxIdleTimeMS=120000&retrywrites=false&appName=@$DB_NAME@&replicaSet=globaldb&ssl=true" --archive="$ARCHIVE_NAME"

命令的错误消息是:

error restoring from archive 'testProdExport.archive': (BadValue) Retryable writes are not supported. Please disable retryable writes by specifying "retrywrites=false" in the connection string or an equivalent driver specific config.

正如您在连接字符串中看到的那样,我包含了 retrywrites=false URI 参数,但 CosmosDB 似乎无法识别该参数。

有没有人有过类似的经历?

//编辑:我已经尝试并验证连接字符串在 mongoose 连接以及 MongoDB Compass 中正常工作。

您可以试用 MongoDB 3.4 附带的 mongorestore 版本。不过,这可能无法读取最近的转储。

您提供的 ismaster 输出包括:

logicalSessionTimeoutMinutes: 30

advertises session support but https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb-feature-support-36 表示 cosmosdb 不支持会话。

CosmosDB 宣传支持它未实现的功能,然后工具(正确地)尝试使用它。这是 cosmosdb 中的错误。

我发现各种 mongotools(mongoimport、mongorestore 等)似乎忽略了 URI 中的 retrywrites=falseretryWrites=false,但是添加选项 --writeConcern="{w:0}" 允许命令 运行 在不支持可重试写入的实例上成功

在 Windows 上,没有成功附加到连接字符串(如果从 Azure 门户复制则不需要)

retryableWrite=false

也不--writeConcern w:0切换 但我最终尝试了所有以前的档案和 mongo tools 100.0.0 的神奇组合在 CosmosDB 上与 MongoServer v3.6 一起工作。

注意:请注意这可能会导致您恢复的集合中的数据丢失。使用不同版本的 mongorestore 对其进行了多次测试。使用版本 4.0.27 的 mongoserver 存档中的版本。在此版本中,您根本不需要提供 writeConcern。它还将显示恢复了多少文档,而不是较新版本中的 0。

这会影响 API v4.0 的 CosmosDb。