MongoDB操作与管理简介
-
1. 前言
- 在上一章中介绍 shell 的时候已经对DB的基本操作(插入、更新、删除、查询) 做了一些简单的说明,本章将不再做重复介绍。本章主要对数据库操作原理,以及管理方面做一些介绍。
2. 数据库基本操作介绍
- 插入、删除、更新、查询 数据库操作原理和作用介绍。
2.1 插入
- 执行插入操作的时候,MongoDB 会先将其转换成 BSON 的形式以后再进行解析。检验是否包含“_id”键且文档小于4MB,除此之外不做其他的数据验证,而是将文档原样存入数据库中。这种原理有好有坏:好处是它可以让数据库的加载变得更快,并可以防止注入式攻击。坏处是它允许插入无效的数据,可能会导致今后大量脏数据的产生。
- MongoDB 在插入时并不执行代码,正因为这个与传统关系数据库的区别,传统的注入式攻击可以说对 MongoDB 是无效的,就算是类似的注入式攻击也是可以很轻松的避开。
//插入示例代码 > db.person.insert({"name":"jason","age":30})
2.2 更新
- 更新有两个参数,一个是查询文档,用来找出需要更新的文档,一个是修改器文档,用来描述对找到的文档做了哪些修改。
- 更新的操作具有原子性,当两个更新同时发生的时候,采用先进先出原则来执行。所以,可有效的避免更新的时候发生冲突,以及死锁的产生,并在最大程度上降低数据相互干扰的风险。
//更新示例代码 //db.person.update({参数1},{参数2}) > db.person.update({"name":"jason","age":30},{"name":"loraine","age":25})
2.3 删除
- 删除可以支持一个查询文档作为可选参数。输入这个参数以后,只有符合条件的文档才会被删除。
- 删除数据动作一旦发生就是不可逆的,因此每次在决定做删除动作的时候需要小心谨慎。
//删除示例代码 //db.person.remove({参数}) > db.person.remove({"name":"loraine","age":25})
2.4 查询
- 查询就是返回一个集合在文档的子集,范围从0个文档到整个集合,第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节。
- 查询在使用的时候也存在一些限制,查询文档的值必须是常量,不能引用文档中其他键的值。
//查询示例代码 // db.person.find({参数}) > db.person.find({"name":"jason"})
3. 数据库命令介绍
- 前面的章节我们已经介绍了数据库中的基本操作。MongoDB 还支持大量的高级操作,这些操作都是通过命令的方式来实现。
3.1 数据库命令原理
- 命令的响应是作为结果的一个文档,它包含了命令是否成功执行,还可能有些其他的命令输出信息。命令的响应总是有一个 键来判断命令是否成功执行,我们假设这个键的值为 true,如果不为 true 就代表命令的执行出了某些问题。
- 命令其实是作为一种特殊类型的查询来实现的,这些查询针对 $cmd 集合来执行,runCommand 仅仅是接受命令文档,执行等价查询。当 MongoDB 服务器得到查询 $cmd 集合的请求时,会启动一套特殊的逻辑来处理,而不是交给普通的查询代码来执行。几乎所有 MongoDB 驱动程序都提供一个类似与 runCommand 的帮助方法来执行命令。但是如果有必要,总是可以使用一个简单查询的方式来执行命令。
- 访问有些命令需要拥有管理员权限,且必须在 admin 数据库里面运行。如果在其他数据库里面运行这些命令,可能会报拒绝访问的错误。
3.2 命令参考
- MongoDB 支持接近100个命令,要获得最新的所有命令列表,有两种方法:
(1) 在 shell 中运行 db.listCommands() ,或者从驱动程序中运行等价命令 list-Commands
(2) 打开管理员浏览器地址:http://localhost:28017/_commands
4. MongoDB 管理
- 尽可能的简化系统操作是当初 MongoDB 的设计理念,所以管理 MongoDB 相对还是比较容易的,无论是备份还是多节点的系统操作都有快捷的方式。系统会尽量自动完成各种配置,需要手工干预的任务很少。
4.1 MongoDB 启动和停止
- 要启动 MongoDB 服务器需要先运行 mongod 可执行文件,如果之前没有配置数据库目录参数,会默认将数据库文件写到/data.db (windows 下为:C:\data\db) ,并占用 27017 端口,还需要确保目录权限为可写,否则会启动失败。
- mongod 还会启动一个 HTTP 服务器,监听比默认端口高 1000 ,换算出来就是 28017,也就是通过浏览器访问 http://localhost:28017 来查看数据库管理信息。
- 数据库在已启动的状态时,在 shell 中输入 Ctrl+C 可以完全停止MongoDB 数据库。另外一种比较安全的方法是使用 showdown 命令,需要在 admin 数据库下并输入:db.shutdownServer()。
4.2 MongoDB 的监控
- 监控 MongoDB 的状态和性能,对于管理员来说是一个非常重要的工作,还好 MongoDB 提供了很多功能,让监控变得很容易。
- 虽然通过 shell 可以查看一些 MongoDB 的基本信息,但是通过 HTTP接口查看到的信息更加全面且易读。
- 如果要获取运行中的 MongoDB 服务器统计信息,可以使用 serverStatus 命令:
> db.runCommand({"serverStatus" : 1})
- 除了 serverStatus 还可以利用第三方插件来监控服务器运行情况,例如 Nagios、Ganglia、Cacti、Munin。登陆 http://dochub.mongodb.org/core/monitoring 查看与监控相关文档。
4.3 MongoDB 备份与恢复
- 数据库默认目录为 /data.db/ (Windows 下C:\data\db) 。所有的数据都存放在数据目录下,想要备份 MongoDB 也就是只需要实现对数据目录中的文件创建副本即可。
- 当 MongoDB 在运行的时候,备份数据目录是非常不安全的,建议先将服务器关闭再进行备份工作,这一点与很多数据库的冷备份方式的原理是基本一致的。
- 在实际的工作中大部分时候数据库不能采取冷备份的方式,这个时候就需要使用 mongodump 这是一个 MongoDB 自带的热备份工具,具体使用方可以参考帮助文档。
D:\mongodb\bin>mongodump --help Usage: mongodump <options> Export the content of a running server into .bson files. Specify a database with -d and a collection with -c to only dump that database or collection. See http://docs.mongodb.org/manual/reference/program/mongodump/ for more information. general options: /help print usage /version print the tool version and exit verbosity options: /v, /verbose:<level> more detailed log output (include multiple times for more verbosity, e.g. -vvvvv, orspecify a numeric value, e.g. --verbose=N) /quiet hide all log output connection options: /h, /host:<hostname> mongodb host to connect to (setname/host1,host-2 for replica sets) /port:<port> server port (can also use --host hostname:port) authentication options: /u, /username:<username> username for authentication /p, /password:<password> password for authentication /authenticationDatabase:<database-name> database that holds the user'scredentials /authenticationMechanism:<mechanism> authentication mechanism to use namespace options: /d, /db:<database-name> database to use /c, /collection:<collection-name> collection to use query options: /q, /query: query filter, as aJSON string, e.g., '{x:{$gt:1}}' /queryFile: path to a filecontaining a query filter (JSON) /readPreference:<string>|<json> specify either a preference name or a preference json object /forceTableScan force a table scan output options: /o, /out:<directory-path> output directory, or '-' for stdout (defaults to 'dump') /gzip compress archive our collection output with Gzip /repair try to recover documents from damaged data files (not supported by all storage engines) /oplog use oplog for taking a point-in-time snapshot /archive:<file-path> dump as an archive to the specifiedpath. If flag is specified without a value, archive is written to stdout /dumpDbUsersAndRoles dump user and role definitions for the specified database /excludeCollection:<collection-name> collection to exclude from the dump (may be specified multiple times to exclude additional collections) /excludeCollectionsWithPrefix:<collection-prefix> exclude all collections from the dump that have the given prefix (may be specified multiple times to exclude additional prefixes) /j, /numParallelCollections: number of collections to dump in parallel (4 by default)
- MongoDB 还提供了一个从备份中恢复数据的工具 mongorestore 。
5. 总结
- MongoDB 实际上就是一个通过 mongod 来调用普通的命令行程序。
- 提供了内置的管理接口和监控功能,方便与第三方插件集成。
- 拥有丰富的备份方式,用户可以根据不同的应用场景来选择。