当前位置:   article > 正文

mongodb磁盘碎片整理_will not run compact on an active replica set prim

will not run compact on an active replica set primary as this is a slow bloc

mongodb磁盘碎片产生

  • 删除文档或集合后,mongodb不会将disk空间释放的为OS,mongodb会在数据文件中维护Empty Records的列表。 重新插入数据后,mongodb从Empty Records列表中分配的存储空间给新的文档

一、整理数据碎片的方法

  1. 使用compact命令
  2. 新加一个secondary节点,然后的将此节点切换为primary,一般在数据量非常大的情况下使用
  3. 重建collection

二、查看集合大小等信息

// 查看集合大小
db.collection_name.storageSize()

// 查看的集合索引大小
db.collection_name.totalIndexSize()

// 查看预计回收内存
db.collection_name.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、使用compact命令回收

  • 能够重写和重组集合的data和index
  • 在compact期间会阻塞其他针此collection的操作,最好在业务低峰期进行
  • 在WriedTiger引擎下,compact会整理碎片后并且释放未使用的磁盘空间给系统
  • 在MMAPv1引擎下,compact会整理碎片,重建索引,但是不会将未使用的空间释放会给系统,而是重新分配给新插入的数据
使用语法:

db.runCommand({compact:<collection name>,force:<boolen>})

  • collection name:集合名称
  • force:用于副本集中primary节点整理时使用,否则会报错
// primary节点上执行
rs1:PRIMARY> db.runCommand({compact:"test"})
{
        "ok" : 0,
        "errmsg" : "will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force",
        "operationTime" : Timestamp(1643269045, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1643269045, 1),
                "signature" : {
                        "hash" : BinData(0,"o/GQKZEvC/Tp9T1QQePHdyT0xKo="),
                        "keyId" : NumberLong("7057052573554966530")
                }
        }
}
rs1:PRIMARY> db.runCommand({compact:"test",force:true})
{
        "operationTime" : Timestamp(1643269055, 1),
        "ok" : 0,
        "errmsg" : "collection does not exist",
        "code" : 26,
        "codeName" : "NamespaceNotFound",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1643269055, 1),
                "signature" : {
                        "hash" : BinData(0,"Srm0HtbcI/6BZv6WXCZeXzdvBLA="),
                        "keyId" : NumberLong("7057052573554966530")
                }
        }
}

// secondary节点上执行
rs1:SECONDARY> db.runCommand({compact:"test"})
{
        "ok" : 1,
        "operationTime" : Timestamp(1643269025, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1643269025, 1),
                "signature" : {
                        "hash" : BinData(0,"27nvRIvAmDLzwpO2bKxQ4Z3KuBw="),
                        "keyId" : NumberLong("7057052573554966530")
                }
        }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

四、创建新的secondary回收空间

  • 不会阻塞副本集的读写
  • 消耗时间相对较短
  • 索引会自动创建,不需要手动创建
  • 不能用于复制包含分片集合的数据库

五、重建collection

// 创建新集合
db.createCollection("collection_name_new")
// 手动重建索引
db.collection_name_new.createIndex({"col_name":1},{"background":1})
// 从旧集合复制到新集合
db.collection_name_new.aggregate({$match:{}},{$out:"collection_name_old"})
// 重新命名集合
db.runCommand( { renameCollection: ".collection_name_new", to: ".collection_name" })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/407769?site
推荐阅读
相关标签
  

闽ICP备14008679号