在 MongoDB 中,adminconfiglocal 是三个特殊的数据库,它们由 MongoDB 内部使用,或用于管理目的,每个都有其特定的功能和用途。

1. admin 数据库

  • 用途: admin 数据库是一个“管理”数据库,用于存储与 MongoDB 实例的管理和授权相关的元数据。它包含全局的命令和管理功能。
  • 内容:
    • 用户和角色信息: 当你创建用户并指定了在 admin 数据库中创建用户时(通常用于全局管理员),这些用户的认证和授权信息会存储在这里。
    • 系统命令: 许多管理命令,例如 shutdownenableShardingauthenticate 等,都需要在 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 集合: 存储副本集的配置信息,例如副本集成员列表、优先级等。
    • 启动和关机信息: 可能会存储一些实例的启动和关机相关的内部元数据。
  • 复制行为: 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 提供的标准接口和命令来间接利用它们的功能。