【问题标题】:Importing to CosmosDB MongoDB API using mongorestore fails with retryable writes error使用 mongorestore 导入 CosmosDB MongoDB API 失败并出现可重试写入错误
【发布时间】:2020-09-15 11:30:01
【问题描述】:

我正在尝试使用 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 中工作。

【问题讨论】:

  • 是什么产生了这条消息 - mongorestore 或 cosmosdb?驱动程序不会向服务器发送“retryWrites”,这是一个仅限客户端的参数。服务器将其作为交易号接收。
  • 这也是我的问题。其实我不知道。
  • 什么是mongorestore版本?
  • 您要恢复到的服务器的 ismaster 输出是什么。
  • mongorestore version: 100.1.1 { ismaster: true, maxBsonObjectSize: 16777216, maxMessageSizeBytes: 48000000, maxWriteBatchSize: 1000, localTime: 1600175975194, logicalSessionTimeoutMinutes: 30, minWireVersion: 0, maxWireVersion:6 , 标签:{ region: 'West Europe' }, hosts: ['-westeurope.mongo.cosmos.azure.com:10255'], setName: 'globaldb', setVersion: 1, primary: ' -westeurope.mongo.cosmos.azure.com:10255',我:'-westeurope.mongo.cosmos.azure.com:10255',connectionId:620417038,ok:1}

标签: mongodb azure-cosmosdb-mongoapi mongorestore


【解决方案1】:

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

【讨论】:

  • 这个对我有用 mongo 4.4 工具和 cosmosDB 和 mongo v 3.6
  • 这对我也有用。 mongoimport 版本:100.3.0 cosmosDB with mongo v 3.6
  • 确认这也适用于 mongorestore v100.3.0 和 cosmos DB 以及 mongo server v4.0
【解决方案2】:

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

您提供的 ismaster 输出包括:

logicalSessionTimeoutMinutes:30

这个advertises session supporthttps://docs.microsoft.com/en-us/azure/cosmos-db/mongodb-feature-support-36 说cosmosdb 不支持会话。

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

【讨论】:

  • 谢谢!这解决了连接错误,但引入了其他一些索引问题。
  • @CMarker - 你根据这些信息做了什么改变?
【解决方案3】:

在 Windows 上,无法在连接字符串上附加(如果从 Azure 门户复制则不需要)

retryableWrite=false

也不是--writeConcern w:0 开关 但我最终尝试了所有以前的档案,mongo tools100.0.0 的神奇组合在 CosmosDB 和 MongoServer v3.6 上运行。

【讨论】:

    【解决方案4】:

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

    这会影响使用 API v4.0 的 CosmosDb。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2021-12-22
      • 2018-10-21
      相关资源
      最近更新 更多