目录
MongoDB备份(mongodump)与恢复(mongorestore)
文档导向的存储:MongoDB是一个面向文档的数据库,它以JSON-like的格式存储数
据,使得数据结构更加灵活和丰富。
索引优化查询:MongoDB允许用户为文档中的任意属性创建索引,例如FirstName和A
ddress,从而提高查询效率和排序性能。
数据镜像与扩展性:通过本地或网络创建数据的副本,MongoDB实现了强大的数据冗余
和扩展能力。水平扩展与分片:面对增加的负载,MongoDB可以通过分片技术将数据分布到计算机网络中的其他节点上,实现水平扩展。
强大的查询语言:MongoDB使用JSON格式的查询语法,支持复杂的查询表达式,包括
对内嵌对象和数组的查询。数据更新:利用 update()命令,MongoDB能够替换整个文档或更新指定的数据字段,MapReduce批量处理:MongoDB的MapReduce功能专为大规模数据处理和聚合操作设计,通过Map函数的emit(key,value)
调用和Reduce函数的逻辑处理,实现高效的
数据汇总。MapReduce脚本编写:Map和Reduce函数使用JavaScript编写,可以通过
db. ru或mapreduce命令在MongoDB中执行。
nCommandGridFS大文件存储:GridFS是MongoDB内置的功能,用于存储和检索大于BSON文档大小限制的文件,如图片和视频。
服务端脚本执行:MongoDB允许在服务端执行JavaScript脚本不,提供了直接在服务端
执行或存储函数定义以供后续调用的能力。
多语言支持:MongoDB提供了对多种编程语言的支持,包括但不限于RUBY、PYTHON、JAVA、C++、PHP和C#。
SQL术语/概念 | MongoDB 术语/概念 |
解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
文档(Document):MongoDB的基本数据单元,通常是一个JSSON-1ike的结构,可以包含
多种数据类型。集合(Collection):类似于关系型数据库中的表,集合是一组文档的容器。在MongoDB中,一个集合中的文档不需要有一个固定的模式。
数据库(Database):包含一个或多个集合的MongoDB实例。
BSON:BinaryJSON的缩写,是MongoDB用来存储和传输文档的二进制形式的JSON
索引(Index):用于优化查询性能的数据结构,可以基于集合中的一个或多个字段创建索
引。分片(Sharding):一种分布数据到多个服务器(称为分片)的为方法,用于处理大数据集和高吞吐量应用。副本集(ReplicaSet):一组维护相同数据集的MongoDB服务器,提供数据的冗余备份和高可用性。主节点(Primary):副本集中负责处理所有写入操作的服务器。从节点(Secondary):副本集中的服务器,用于该取数据和在主节点故障时接管为主节点。MongoDBShell:MongoDB提供的命令行界面,用于与MongoDB实例交互。
聚合框架(AggregationFramework):用于执行复杂的数据处理和聚合操作的一系列操作。Map-Reduce:一种编程模型,用于处理大量数据集的并行计算。
GridFS:用于存储和检索大于BSON文档大小限制的文件的规范。ObjectId:MongoDB为每个文档自动生成的唯一标识符。CRUD操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作。事务(Transactions):从MongoDB4.0开始支持,允许一组操作作为一个原子单元执行。操作符(0perators):用于查询和更新文档的特殊字段。
连接(Join):MongoDB 允许在查询中使用$1ookup操作符来实现类似SQL的连接操作。
TTL(Time-To-Live):可以为集合中的某些字段设置 TTL,!以自动删除旧数据。
存储引擎(Storage Engine):MongoDB用于数据存储和管理的底层技术,如WiredTiger
和MongoDB的旧存储引擎MMAPv1。MongoDB Compass:MongoDB的图形界面工具,用于可视化和管理MongoDB数据。MongoDBAtlas:MongoDB提供的云服务,允许在云中托管MoongoDB数据库。
安装前我们需要安装各个Linux平台依赖包。解压安装包将解压包拷贝到指定目录MongoDB的可执行文件位于bin目录下,所以可以将其添加到PATH路径中:
dnf -y install libcurl openssl
tar zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb
echo
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >>/etc/profile source /etc/profile
我们在启动前可以先创建这两个目录并设置当前用户有读写权限:由于 mongodb 依赖openssl11,需要编译安装openssl11设置 openssl11的环境变量接下来启动 Mongodb 服务:看到以下信息,说明启动成功。
[root@localhost ~]#mkdir-p /var/lib/mongo
[root@localhost ~]#mkdir -p /var/log/mongodb
[root@localhost ~]#chownwhoami`/var/lib/mongo
[root@localhost ~]#chownwhoami /var/log/mongodb
[root@localhost ^]# dnf install -y gcc make perl
[root@localhost `]# tar xzf openssl-1.1.1w.tar.gz
[root@localhost ^]# cd openssl-1.1. l lw
[rootesentinel01 openss1-1.1.1w]#./config --prefix=/opt/openss111 --openssldir=
/opt/openss111/ssl
[root@sentinel01openssl-1.1.1.1w]#make -j$(nproc)
[root@sentinel01 openssl-1.1.1w]#make install
[root@localhost *]# echo 'export_D_LIBRARYPATH=/opt/openss111/lib:$LD_LIBRARY
PATH' | sudo tee /etc/profile.d/openssl11.sh
[root@localhost ~]# source /etc/profile.d/opensslll.sh
[root@localhost ~]#mongod --dbpath /var/lib/mongo --logpath/var/log/mongodb/m
ongod. log --fork
MongoDBShell是MongoDB提供的官方交互式界面,允许用户与MongoDB数据库进行
交互、执行命令和操作数据库。
MongoDBShell是基于JavaScript的,允许用户直接在命令行或者脚本中使用Java
Script语言来操作MongoDB数据库。
[root@localhost ^]# tar xzf mongosh-2.5.0-linux-x64-openss13tg2
[root@localhost ^]# cd mongosh-2.5.0-linux-x64-openss13
[root@localhost mongosh-2.5.0-linux-x64-openss13]# cd bin/
[root@localhost bin]# cp mongosh /usr/local/bin/
[root@localhost bin]# cp mongosh_crypt_vl.so /usr/loca/1ib/
mongosh -- host <hostname> ----port <port>
root@sentinel01 bin]# mongosh
要查看当前MongoDB实例中所有数据库的列表,可以使用
show dbs
show dbs
要查看当前正在使用的数据库,可以使用 db 命令:
db
在MongoDB中,数据库的创建是一个简单的过程,当你首次向MongoDB中插入数据时,
如果数据库不存在,MongoDB会自动创建它。
我们只需选择一个数据库名称,并开始向其中插入文档即可。
当你使用use命令来指定一个数据库时,如果该数据库不存在,MongoDB将自动创建它。
MongoDB 创建数据库的语法格式如下:
use DATABASE_NAME
test> use runoob
switched to db runoob
runoob> db
runoob
runoob>
runoob>
show dbs
admin
40.00KiB
config
60.00KiB
local
40.00 KiB
runoob
runoob> db.runoob.insert0ne({"name":"zhangsan"})
acknowledged: true,
insertedId: ObjectId('680al8f4277aalc07blb2700'
runoob>
show dbs.
admin
40.00KiB
config
60.00KiB
local
40.00KiB
runoob
40.00KiB
runoob>
如果你需要删除数据库,可以使用db.dropDatabase方法:
use myDatabase
db.dropDatabase ()
runoob> show dbs
admin
40.00KiB
config
60.00KiB
local
40.00KiB
runoob 40.00 KiB
runoob> use runoob
already on db runoob
test> db.dropDatabase()
{ ok: 1, dropped: 'runoob
runoob> show dbs
admin
40.00KiB
config
60.00KiB
local
40.00KiB
MongoDB中默认的数据库为test,如果你没有创建新的数据库库,数据将存放在test
数据库中。当您通过shell连接到MongoDB实例时,如果未使用use命令切换到其他数据库,则会默认使用test数据库。
例如,在启动MongoDB实例并连接到MongoDBshell后,如果您开始插入文档而未显
式指定数据库,MongoDB将默认使用 test数据库。
在MongoDB中,admin、config 和 local
是三个特殊的系统内置数据库
数据库:存储所有数据库的用户身份信息和全局权限(如 rcbot
用户)。用admin户必须通过
admin数据库认证后才能执行跨库管理操作。
数据库:仅在分片集群环境中存在。存储分片信息、块(chur1k)分布、集合
config分片策略等关键元数据。
local数据库:存储当前节点的副本集状态、操作日志(opl0g)等本地数据。数据不
会被复制到其他节点,仅存在于当前实例。
> show collections
语法格式:
db.createCollection (name, options)
参数说明:
name:要创建的集合名称。
options:可选参数,指定有关内存大小及索引的选项。
参数名 | 类型 | 描述 | 示例值 |
capped | 布尔值 | 是否创建一个固定大小的集合。 | true |
size | 数值 | 集合的最大大小(以字节为单位)。仅在d 为true 时有效。 :cappe |
10485760 (10MB) |
max | 数值 | 集合中允许的最大文档数。仅在capped 为tru 5000e 时有效。 | 5000 |
validator | 对象 | 用于文档验证的表达式。 | {$jsonSchema: { ... }} |
validationLevel | 字符串 | 指定文档验证的严格程度。 "off":不进行验证。 "strict":插入和更新操作都必须通过验证(默认)。 "moderate":仅现有文档更新时必须通过验证,插 入新文档时不需要。 |
"strict" |
validationAction | 字符串 | 指定文档验证失败时的操作。 "error":阻止插入或更新(默认)。 warn":允许插入或更新,但会发出警告。 |
"error" |
storageEngine | 对象 | 为集合指定存储引擎配置。 | { wiredTiger: { ... }} |
参数名 | 类型 | 描述 | 示例值 |
collation | 对象 | 指定集合的默认排序规则 | { locale: "en" strength: 2 }
|
db.createCollection ("myComplexCollection",
capped: true,
size: 10485760,
max: 5000,
validator:{$jsonSchema: {
bsonType:"object",
required: ["name", "email"],
properties:{
name:
bsonType:
string",
description:"必须为字符串且为必填项"
email: {
bsonType: "string",
pattern:
description:"必须为有效的电子邮件地址"
}},
validationLevel:"strict",
validationAction:"error",
storageEngine: {
wiredTiger:{configString: "block_compressor=zstd
},
collation:{locale:"en", strength:2}
});
renameCollection命令的语法:
db.adminCommand({
renameCollection: "sourceDb. sourceCollection",
to: "targetDb.targetCollection
dropTarget: <boolean>
参数说明:
renameCollection:要重命名的集合的完全限定名称(包括数据库名)。
·to:目标集合的完全限定名称(包括数据库名)。
dropTarget(可选):布尔值。如果目标集合已经存在,是否否删除目标集合。默认值为f
alse.
1.确保已连接到 test数据库
use test
2.运行renameCollection命
db.adminCommand({
renameCollection: "test.oldCollection",
to:"test.newCollection" });
如果你要将集合重命名到另一个数据库,例如将test数据库中的oldCollection重命名
为production数据库中的newCollection,可以这样做:
db.adminCommand({
renameCollection: "test.oldCollection",
to:"production. newCollection" });
>use mydb
switched to db
>db.createCollection("kgc")
{ok:1}
mydb>show collections
kgc
>db.kgc.drop()
true
方法 | 用途 | 是否弃用 |
insertone () | 插入单个文档 | 否 |
方法 | 用途 | 是否弃用 |
insertMany() | 插入多个文档 | 否 |
insert () | 插入单个或多个文档 | 是 |
save | 插入或更新文档 | 是 |
db.myCollection. insertOne({
"Alice",
name
25,
age:
city: "New York"
db.myCollection.find();
db.myCollection.find(
$gt: 25 } },
age:
age: 1, id: 0 }
name:
常用的删除文档方法包括deleteOne()、deleteMany
以及findOneAndDelete
db.myCollection.findOneAndDelete(
name:
"Charlie"
projection:
1.
name:
age:
在MongoDB中,更新文档的操作可以使用多种方法实现,常用的方法包括
updateOne()、updateMany()、replaceOne()和findOneAndUpdate()。
插入测试数据
db. myCollection. insertMany([{ name: "Alice", age: 25,city: "LosAngeles", statu
"inactive" },{name: "Bob",age: 30,city: "Los Angeles",status:
"active"
S:
"Charlie", age: 35, city: "Chicago", status:
"active"}]);
name:
MongoDB备份(mongodump)与恢复(mongorestore)
mongodump
用于创建 MongoDB 数据的二进制备份,支持全量备份或指定库 / 集合的增量备份
# 全量备份(默认连接 localhost:27017)
mongodump --out /path/to/backup/directory
# 指定主机和端口
mongodump --host example.com --port 27017 --out /backup/dir
# 指定认证信息(用户名和密码)
mongodump --username admin --password yourpassword --authenticationDatabase admin --out /backup/dir
# 备份单个数据库
mongodump --db mydatabase --out /backup/dir
# 备份单个集合
mongodump --db mydatabase --collection mycollection --out /backup/dir
# 压缩输出(4.2+ 版本支持)
mongodump --gzip --out /backup/dir
恢复数据库 (mongorestore
)
mongorestore
用于从 mongodump
创建的备份中恢复数据
# 从备份目录恢复(默认恢复到 localhost:27017)
mongorestore /path/to/backup/directory
# 指定目标主机和端口
mongorestore --host example.com --port 27017 /backup/dir
# 指定认证信息
mongorestore --username admin --password yourpassword --authenticationDatabase admin /backup/dir
# 恢复到指定数据库(可重命名目标库)
mongorestore --db targetdb /backup/dir/sourcedb
# 恢复单个集合
mongorestore --db targetdb --collection mycollection /backup/dir/sourcedb/mycollection.bson
# 恢复时不删除现有数据(追加模式)
mongorestore --drop # 恢复前删除同名集合(默认行为)
mongorestore --noDrop # 保留现有数据,追加新文档
# 从压缩备份恢复
mongorestore --gzip /backup/dir
使用 Homebrew(推荐)
# 安装 MongoDB Database Tools
brew tap mongodb/brew
brew install mongodb-database-tools
手动下载二进制包
从 MongoDB 官网 下载适合 macOS 的 .tgz
包解压并移动到系统路径
tar -zxvf mongodb-database-tools-macos-x86_64-<version>.tgz
sudo cp mongodb-database-tools-macos-x86_64-<version>/bin/* /usr/local/bin/
Ubuntu/Debian
# 添加 MongoDB 官方仓库
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
# 安装 Database Tools
sudo apt-get install -y mongodb-database-tools
CentOS/RHEL
# 添加 MongoDB 官方仓库
echo "[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-6.0.repo
# 安装 Database Tools
sudo yum install -y mongodb-database-tools
# 全量备份(默认 localhost:27017)
mongodump --out /data/backup/$(date +%Y%m%d)
# 指定认证信息和压缩
mongodump --username admin --password 'pass' \
--authenticationDatabase admin \
--gzip --out /data/backup/$(date +%Y%m%d)
# 1. 冻结写入(临时阻塞写操作)
use admin
db.fsyncLock()
# 2. 创建文件系统快照(如 LVM、云磁盘快照)
lvcreate -L 10G -s -n mongodb_snap /dev/mapper/vg_mongodb-lv_data
# 3. 解除冻结
db.fsyncUnlock()
# 首次全量备份(含 oplog)
mongodump --oplog --out /data/backup/full_$(date +%Y%m%d)
# 后续增量备份(从上次 oplog 时间点开始)
LATEST_OPLOG_TIME=$(cat /data/backup/full_*/oplog.bson | bsondump | tail -n 1 | jq -r '.ts.$timestamp.t')
mongodump --oplogReplay --oplogLimit "{'ts': {'\$gt': Timestamp($LATEST_OPLOG_TIME, 1)}}" --out /data/backup/incremental_$(date +%Y%m%d)
使用 mongorestore
恢复逻辑备份
从 mongodump
创建的备份中恢复数据
# 恢复全部数据库(默认覆盖同名集合)
mongorestore /path/to/backup/directory
# 指定目标数据库(可重命名)
mongorestore --db newdb /path/to/backup/olddb
# 恢复单个集合
mongorestore --db targetdb --collection users /path/to/backup/sourcedb/users.bson
# 恢复时保留现有数据(追加模式)
mongorestore --noDrop /path/to/backup
创建管理员用户(首次配置)
启动 MongoDB 服务(未启用认证)
mongod --dbpath /data/db
连接 MongoDB 并创建管理员用户:
use admin
db.createUser({
user: "admin",
pwd: passwordPrompt(), // 交互式输入密码
roles: [ { role: "root", db: "admin" } ]
})
db.auth("admin", passwordPrompt()) // 返回 1 表示认证成功
用户管理操作
创建普通用户
use mydb // 切换到目标数据库
db.createUser({
user: "appuser",
pwd: passwordPrompt(),
roles: [
{ role: "readWrite", db: "mydb" }, // 读写权限
{ role: "read", db: "otherdb" } // 只读权限
]
})