【问题标题】:mongodb oplog: does "insert" op add "create collection" op?mongodb oplog:“插入”操作是否添加“创建集合”操作?
【发布时间】:2017-10-17 17:23:21
【问题描述】:

当我们插入一个文档时,如果数据库和/或集合不存在,它们会在插入之前创建。 oplog 中是否有这个“create db/collection”操作?

我感兴趣的原因是因为我们想从 v2.4 升级到 v3.2 但根据https://jira.mongodb.org/browse/SERVER-17634,如果集合丢失,“applyOps”命令将在插入操作上失败。

【问题讨论】:

  • 您需要将 2.4 升级到 2.6,然后将 2.6 升级到 3.0,然后从 3.0 升级到 3.2。这是一个相当长的链条。如果我是你,我只会在维护窗口内进行这样的升级,而不会对数据库进行任何写入。这种情况下不需要重放opplog。
  • 我们重放 oplog,因为我们保留了客户数据的镜像。因此,每当向我们发送数据时,我们都必须重播 oplog。但是,我不明白为什么必须逐步更新

标签: mongodb mongodb-oplog


【解决方案1】:

是的,插入到新集合中会在 oplog 中生成 2 个条目:

  1. {op: "c", o: {create: "name_of_the_collection"}} 创建集合

  2. {op: "i", ns: "name_of_the_collection", o:{the document}}插入文档

回答后续问题:

official documentation 写着:

oplog(操作日志)是一个特殊的上限集合,它保留了所有操作的滚动记录,这些操作会修改存储在数据库中的数据。

“所有操作”包括创建集合、数据库等。如果主成员上不存在集合,则在第一次插入时创建:https://github.com/mongodb/mongo/blob/v3.2/src/mongo/db/catalog/database.cpp#L454

新建集合时,对应的文档记录到oplog:https://github.com/mongodb/mongo/blob/v3.2/src/mongo/db/catalog/database.cpp#L511

同样的逻辑适用于其他命令,包括创建数据库。

Format of oplog documents 包含在正确的数据库、集合和文档上重放所有操作所需的所有信息:

/* we write to local.oplog.rs:
     { ts : ..., h: ..., v: ..., op: ..., etc }
   ts: an OpTime timestamp
   h: hash
   v: version
   op:
    "i" insert
    "u" update
    "d" delete
    "c" db cmd
    "db" declares presence of a database (ns is set to the db name + '.')
    "n" no op
   bb param:
     if not null, specifies a boolean to pass along to the other side as b: param.
     used for "justOne" or "upsert" flags on 'd', 'u'
*/

【讨论】:

  • 谢谢!是否有任何官方文件说明这一点?在发布问题之前我找不到任何东西
  • “创建数据库”操作怎么样? applyOps 怎么知道这个集合属于哪个 db?
  • 我猜它和ns一样?形式为db.collection?
  • 我已经更新了答案,但它偏离了原来的问题。建议创建单独的问题,而不是扩展现有问题。
  • 所以基本上没有文档说明如果 collection/db 不存在,则在 oplog 中添加 2 个条目。我认为对您答案的编辑不会回答我的任何后续问题。您在回答中提到的 name_of_the_collection 只是一个小小的混淆
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
相关资源
最近更新 更多