热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库命令

compact命令v1.9+压缩命令会对一个集合进行压缩和除碎片。索引也会被重建和压缩。这会为数据库中其他集合释放空间。在概念上它和repairDatabase类似,但是它仅仅作用于一个集合而不是整个数据库。运行(mongoshell上面的示例):db.runCommand({compact
  compact命令

v1.9+

压缩命令会对一个集合进行压缩和除碎片。索引也会被重建和压缩。这会为数据库中其他集合释放空间。在概念上它和repairDatabase类似,但是它仅仅作用于一个集合而不是整个数据库。

运行(mongo shell上面的示例):

> db.runCommand( { compact : 'mycollectionname' } )
OR
> db.mycollection.runCommand( "compact" )

这个命令直到压缩全部完成才会返回。你可以通过查看mongod记录文件或者在另一个shell实例中运行db.currentOp()来查看中间进展。

由于它会阻塞所有的活动,因此该命令默认情况下不会在复制组的主节点运行。否则它会返回错误。想要强制在复制组主节点上运行,使用将force:true作为参数的压缩命令。

运行一个压缩

与repairDatabase不同,压缩命令不需要两倍的硬盘空间来完成工作。它在工作的时候只需要少量额外的空间。另外,压缩要更快一些。

尽管比repairDatabase要快一些,该命令在运行期间会阻塞所有其他操作,并且慢吞吞的。可以在安排的维护期间运行它。

如果你在复制组的辅助节点运行这个命令,辅助节点会自动把自己降级为"recovery"状态,直到压缩完成。

取消一个压缩

在压缩的开始,集合的索引会被删除。压缩结束时,索引会重建。因此如果在压缩操作的中间你把它取消了,使用killOp或者服务器失效,你的集合的索引可能会丢失。如果你使用了参数--journal运行,在压缩过程中的宕机应该不会有数据丢失,虽然在启动时索引可能不存在了。(尽管如此,永远在系统维护之前像这样做一次备份)当索引重建后,它们将会是2.0版本的索引格式。

如果在这个命令执行期间发生了宕机,只要日志功能启用了,你的数据将会是安全的。不过,一块不可恢复盘区还是留下来了。唯一可以移除这块盘区的办法就是在整个数据库上面执行修复操作。但是除非使用了额外空间,否则这孤立的盘区不会表现出任何问题。

另外,如果压缩操作被中断了,那么这个集合中大部分空闲空间可能变得不可用。在这种情况下推荐再执行一次压缩,完成压缩,恢复空闲空间。

压缩的效果

你可能会在压缩之前和之后运行collstats命令(在shell中是db.collectionname.stats())来查看集合的存储空间都怎么变化了。

这个命令对集合中没有填充因素(Padding Factor)的文档做了充分压缩。如果你常常执行会使文档增大的更新操作,这会降低更新的性能因为文档需要经常移动。

压缩可能会将你的数据文件的总大小增长到2GB。即使在这种情况下,集合使用的总的存储空间还是会下降。

详细信息

压缩可能在复制组辅助节点和从节点上面执行。压缩命令不会复制,因此每一台主机需要单独的进行压缩。

当前,压缩是发布给mongod的命令。在一个分片环境,应该作为一个维护操作对每一个分片单独的执行压缩。(在将来的版本中可能会改变,和其他增强功能一起)

固定大小的集合是不能被压缩的。(然而,固定大小集合中的文档是不受碎片管理的。)

复制组

单独的对每一个成员压缩。

理想的压缩是运行在一个辅助节点(看上面关于force:true的评论)。

如果压缩运行在辅助节点上,辅助节点会自动进入"recovering"状态(阻止在压缩过程中被路由来的读操作)。一旦压缩结束,它会自动返回到辅助状态。

 拷贝数据库命令

mongodb包含有将一个数据库从一台服务器拷贝到另外一台服务器的命令。

这些选项比可选的方法执行mongodump和mongorestore要快,因为它跳过了在磁盘上创建临时BSON描述的步骤。

copydb命令

将一台服务器上面一个名字的整个数据库拷贝到另外一台服务器并使用另外一个名字。在相同的服务器拷贝一个数据库到另外名称的数据库可以省略掉.拷贝命令必须发送并在目标服务器执行。

> // shell helper syntax:
> db.copyDatabase();
> // if you must authenticate with the source database
> db.copyDatabase();
> // pure command syntax (runnable from any driver):
> db.runCommand(
... {copydb: 1, fromhost: , fromdb: ,
... todb: [, slaveOk: , username: ,
... nonce: , key: ]}";
> // command syntax for authenticating with the source:
> n = db.runCommand( { copydbgetnonce : 1, fromhost: ... } );
db.runCommand( { copydb : 1, fromhost: ..., fromdb: ..., todb: ..., username: ..., nonce: n.nonce,
key:  } );

cloneDatabase

和copydb相似,但是使用了简单化的语法。适用于我们只不过拷贝一个数据库到这台服务器,并使用原来的名称。

> db.cloneDatabase();

注释:

copyDatabase 可以对从节点/辅助节点运行(换句话说,源服务器可以是一个从节点/辅助节点)。

copyDatabase没有任何意义上的快照:如果在拷贝期间源数据库正在变化,目标数据库会接收到不同时间点的文档。

这个命令必须运行在目标服务器。

这个命令在执行期间不会锁定源服务器和目标服务器。每一段都会周期性的允许其他的读/写操作通过。

fsync命令

fsync命令允许我们将所有挂起写操作刷新到数据文件。更重要的,它还提供了锁选项让备份更加容易。

fsync命令强制让数据库刷新所有的数据文件:

> use admin
> db.runCommand({fsync:1});

默认情况下这个命令在同步完成后返回。需要立即返回,请使用:

> db.runCommand({fsync:1,async:true});

要定期同步,在命令行选项中使用--syncdelay命令(查看mongod --help输出)。默认每60s做一次强制完全刷新。
锁,快照和解锁
同步命令支持锁选项,这样就可以安全的对数据库的数据文件进行快照。当被锁住后,所有的写操作会阻塞,虽然读操作依旧允许。快照完成后,使用解锁命令对数据库解锁并允许再次上锁。例如:

> use admin
switched to db admin
> db.runCommand({fsync:1,lock:1})
{
"info" : "now locked against writes",
"ok" : 1
}
> db.currentOp()
{
"inprog" : [
],
"fsyncLock" : 1
}
>// do some work here: for example, snapshot datafiles...
>// runProgram("/path/to/my-filesystem-snapshotting-script.sh")
> db.$cmd.sys.unlock.findOne();
{ "ok" : 1, "info" : "unlock requested" }
> // unlock is now requested. it may take a moment to take effect.
> db.currentOp()
{ "inprog" : [ ] }

附加说明

当数据库因为快照而被锁住时是可读的,如果尝试进行写,这会阻塞读的人因为数据库使用了一个读/写锁。这将来会被处理掉。

对从节点快照

上面的流程都是针对复制组从节点的。从节点在被锁期间不会执行任何操作。无论如何,请看附件说明部分。

分片

同步命令只能发给一个单独的节点,而不是整个分片集群。

1.9的改变
mongodb1.9中引入了两个新的shell辅助函数:db.fsyncLock()和db.fsyncUnlock().它们是出于方便的原因提供的,它们包装了上面关于这个接口描述的功能。接下来你可以看一下它们的实现:

> db.fsyncLock
function () {
return db.adminCommand({fsync:1, lock:true});
}
> db.fsyncUnlock
function () {
return db.getSiblingDB("admin").$cmd.sys.unlock.findOne();
}

现在解锁调用会阻塞

值得注意的是,解锁命令做了小小的改动。在1.9.0以前,这个命令会请求解锁并立即返回。这样就很难知道数据库实际上是否已经解锁。

现在的这个命令会阻塞知道数据库被解锁。当它返回时,你就可以确定数据库已经将数据文件同步到磁盘并准备好接收写入了。


推荐阅读
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 服务器虚拟化存储设计,完美规划储存与资源,部署高性能虚拟化桌面
    规划部署虚拟桌面环境前,必须先估算目前所使用实体桌面环境的工作负载与IOPS性能,并慎选储存设备。唯有谨慎估算贴近实际的IOPS性能,才能 ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • Uniswap 与 MoonPay 合作,引入法币交易功能。本文探讨这一合作对用户进入加密货币领域的安全性及便利性的影响。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
author-avatar
Adrian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有