0%

MongoDB修改Oplog大小

有时数据库上线初期没有进行长远规划,导致Oplog设置过小,日志覆盖重写速度过快,存在隐患,所以需要对Oplog进行扩展。

查看oplog状态

1
2
3
4
5
6
> rs.printReplicationInfo()
configured oplog size: 1561.5615234375MB
log length start to end: 423849secs (117.74hrs)
oplog first event time: Wed Sep 09 2015 17:39:50 GMT+0800 (CST)
oplog last event time: Mon Sep 14 2015 15:23:59 GMT+0800 (CST)
now: Mon Sep 14 2015 16:37:30 GMT+0800 (CST)

其中configured oplog size为集合大小,log length start to end为日志覆盖时间,如果该值太小应该考虑增加oplog的大小。也可以结合db.getReplicationInfo()查看复制是否存在延迟

MongoDB3.6开始可以通过replSetResizeOplog修改oplog集合的大小,单位MB。更改大小并不会影响副本集其它成员,需要一一修改

1
db.adminCommand({replSetResizeOplog:1,size:16384})

在MongoDB3.6之前只能通过下列方式修改oplog大小:

  1. 关闭secondary节点
    1
    2
    use admin
    db.shutdownServer()
  2. 以standalone形式启动(修改端口,注释replset参数,分片环境请注释shardsvr并加入skipShardingConfigurationChecks=true)
  3. 备份当前oplog集合
    1
    mongodump --db local --collection 'oplog.rs' --port 37017
  4. 保留最后一条oplog记录
    1
    2
    3
    db = db.getSiblingDB('local')
    db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
    db.temp.find()
  5. 删除现有oplog集合
    1
    2
    db = db.getSiblingDB('local')
    db.oplog.rs.drop()
  6. 创建新的oplog集合
    1
    db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )
  7. 插入最后一条oplog到新集合
    1
    2
    db.oplog.rs.save( db.temp.findOne() 
    db.oplog.rs.find()
  8. 改回参数文件,重新加入副本集,分片环境启动时取消skipShardingConfigurationChecks参数
  9. 依次修改其它secondary节点,再通过rs.stepDown()重新选出一个pramary,再对老primary进行修改