在 MongoDB 中,admin、config 和 local 是三个特殊的数据库,它们由 MongoDB 内部使用,或用于管理目的,每个都有其特定的功能和用途。
1. admin 数据库
- 用途:
admin数据库是一个“管理”数据库,用于存储与 MongoDB 实例的管理和授权相关的元数据。它包含全局的命令和管理功能。 - 内容:
- 用户和角色信息: 当你创建用户并指定了在
admin数据库中创建用户时(通常用于全局管理员),这些用户的认证和授权信息会存储在这里。 - 系统命令: 许多管理命令,例如
shutdown、enableSharding、authenticate等,都需要在admin数据库的上下文中运行,或者它们的权限控制与admin数据库相关。 - 鉴权信息:用于身份验证和授权的凭证信息。
- 用户和角色信息: 当你创建用户并指定了在
- 权限: 只有具有适当权限的用户才能访问
admin数据库。通常,管理操作只能在该数据库中进行。 - 重要性: 对于管理 MongoDB 实例(尤其是集群)至关重要。
2. config 数据库 (仅限分片集群)
- 用途:
config数据库是一个特殊的数据库,仅存在于分片集群 (Sharded Cluster) 中。它用于存储分片集群的元数据和配置信息,包括集群的结构、每个分片的数据范围、每个分片的副本集成员、集合的分片键等。 - 内容:
- 分片信息: 存储集群中所有分片的列表及其地址。
- 集合信息: 记录哪些集合是分片的,它们的分片键是什么。
- 块 (Chunk) 信息: 存储每个分片集合的数据被划分成多少个块,以及每个块当前位于哪个分片上。这是数据分布的核心元数据。
- 分片操作日志: 记录分片集群内部的各种操作,如块迁移等。
- 存储位置:
config数据库通常存储在 Config Server 副本集 中。Config Server 负责维护整个分片集群的状态。 - 重要性: 对于分片集群的正常运行和数据管理是绝对核心的。如果没有
config数据库,或者它损坏了,分片集群就无法正常工作。 - 用户操作: 一般用户不应该直接操作
config数据库,因为这可能导致集群数据不一致或损坏。所有分片操作都应通过mongos路由来实现。
3. local 数据库
- 用途:
local数据库是一个“本地”数据库,用于存储 MongoDB 实例的本地数据和操作日志。这些数据通常是实例特定的,不能被复制到其他副本集成员。 - 内容:
- oplog (操作日志): 在副本集中,
local数据库存储着 oplog.rs 集合,这是 MongoDB 副本集实现数据复制的关键。oplog 记录了所有对数据库进行写操作(插入、更新、删除)的日志,主节点将这些日志复制到从节点,从节点应用这些日志以保持数据同步。 - system.replset 集合: 存储副本集的配置信息,例如副本集成员列表、优先级等。
- 启动和关机信息: 可能会存储一些实例的启动和关机相关的内部元数据。
- oplog (操作日志): 在副本集中,
- 复制行为:
local数据库中的数据(特别是oplog.rs)是用于复制的,但local数据库本身不会被复制。每个副本集成员都有自己的local数据库,并且其中的oplog.rs集合可能包含不同的历史记录(从节点会裁剪自己的 oplog 到一定大小)。 - 重要性: 对于副本集的数据复制和高可用性至关重要。没有
oplog.rs,副本集就无法正常工作。 - 用户操作: 同样不建议用户直接操作
local数据库,尤其是oplog.rs集合,否则可能严重破坏副本集的一致性。
总结表格
| 数据库 | 主要用途 | 存在位置 | 主要内容 | 用户操作建议 |
|---|---|---|---|---|
admin | 全局管理、用户认证、授权 | 所有实例 (Standalone, 副本集, 分片) | 全局用户/角色、系统命令权限、鉴权 | 仅限管理员进行管理操作 |
config | 分片集群元数据和配置 | 仅限分片集群 (Config Server) | 分片列表、集合分片键、块信息 | 严禁直接操作 |
local | 副本集操作日志 (oplog)、本地配置数据 | 副本集成员 | oplog.rs (操作日志)、system.replset (副本集配置) | 严禁直接操作 |
这三个数据库对于 MongoDB 的内部维护、集群管理和数据复制机制都是不可或缺的。作为普通用户或开发者,通常你不会直接与它们交互,而是通过 MongoDB 提供的标准接口和命令来间接利用它们的功能。