- 文档
- 教程
- 数据库
【免费下载链接】db-tutorial
📚 后端程序员应该掌握的主流数据库知识
本文以 MongoDB 运维 为骨架,结合本仓库codes/javadb/mongodb模块中的 Spring Boot 连接配置、示例数据文件(books/products/students JSON)与集成测试,系统讲解 MongoDB 在 Windows/Linux 上的安装启动、管理员账号创建、mongodump/mongorestore备份恢复,以及mongoimport/mongoexport导入导出四大运维场景。读完本文,你将能独立完成一套 MongoDB 实例从部署、认证到数据迁移的全流程操作,并可直接用仓库自带的 JSON 数据文件演练导入导出。
MongoDB 安装
MongoDB 是 C++ 编写的基于文档的分布式数据库,数据以类似 JSON 的 BSON 格式存储。安装 MongoDB 后,核心的运维对象有两个守护进程:
mongod:数据库服务进程,负责存储与查询;mongo(新版为mongosh):客户端 Shell,用于连接与操作。
Windows 安装
(1)下载并解压到本地:进入 MongoDB 官网的 Community Server 下载页面,选择合适的版本(例如 4.4.0)下载压缩包,解压到本地目录,如D:\Tools\Server\mongodb\mongodb-4.4.0。
(2)创建数据目录:MongoDB 默认将数据存储在db子目录下,但该目录不会自动创建,安装完成后需要手动创建,例如:
D:\Tools\Server\mongodb\mongodb-4.4.0\data\db(3)运行 MongoDB 服务:在命令窗口中执行mongod并指定数据目录:
mongod --dbpath D:\Tools\Server\mongodb\mongodb-4.4.0\data\db(4)客户端连接 MongoDB:另开一个命令窗口,运行mongo.exe(或新版mongosh)即可连接上本机 MongoDB 实例。默认监听地址为127.0.0.1:27017。
(5)配置 MongoDB 服务:如需开机自启,可在 Windows 服务管理器中注册服务,例如:
mongod --dbpath "D:\Tools\Server\mongodb\mongodb-4.4.0\data\db" --logpath "D:\Tools\Server\mongodb\mongodb-4.4.0\log\mongod.log" --install --serviceName MongoDB之后可通过net start MongoDB启动服务。注意--install需要管理员权限,且logpath目录同样需要提前创建。
Linux 安装
(1)使用安装包安装:安装前需要先安装各 Linux 平台的依赖包。
Red Hat/CentOS:
sudo yum install libcurl opensslUbuntu 18.04 LTS ("Bionic") / Debian 10 "Buster":
sudo apt-get install libcurl4 opensslUbuntu 16.04 LTS ("Xenial") / Debian 9 "Stretch":
sudo apt-get install libcurl3 openssl(2)创建数据目录:默认情况下 MongoDB 启动后会初始化以下两个目录:
- 数据存储目录:
/var/lib/mongodb - 日志文件目录:
/var/log/mongodb
启动前可先创建这两个目录,并设置当前用户拥有读写权限:
sudo mkdir -p /var/lib/mongo sudo mkdir -p /var/log/mongodb sudo chown `whoami` /var/lib/mongo # 设置权限 sudo chown `whoami` /var/log/mongodb # 设置权限(3)运行 MongoDB 服务:
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork其中--fork表示以后台守护进程方式运行。打开/var/log/mongodb/mongod.log看到以下信息,说明启动成功:
# tail -10f /var/log/mongodb/mongod.log 2020-07-09T12:20:17.391+0800 I NETWORK [listener] Listening on /tmp/mongodb-27017.sock 2020-07-09T12:20:17.392+0800 I NETWORK [listener] Listening on 127.0.0.1 2020-07-09T12:20:17.392+0800 I NETWORK [listener] waiting for connections on port 27017日志中的waiting for connections on port 27017表明服务已就绪。生产环境更推荐将mongod注册为 systemd 服务,并统一使用配置文件(如/etc/mongod.conf)管理 dbpath、logpath、port、bindIp 等参数,便于随系统启动和集中运维。
(4)客户端连接 MongoDB:
cd /usr/local/mongodb4/bin ./mongo与应用层连接配置的衔接
安装并启动 MongoDB 之后,应用即可通过连接串访问。以本仓库的 javadb/mongodb 模块为例,它基于 Spring Boot 2.6.3 与spring-boot-starter-data-mongodb构建,其连接配置位于 application.properties:
spring.data.mongodb.host = localhost spring.data.mongodb.port = 27017 spring.data.mongodb.database = test #spring.data.mongodb.username = #sprin.data.mongodb.password =即默认连接localhost:27017上的test数据库;当开启用户认证后,只需去掉注释并填入创建的用户名与密码即可。仓库中多个ApplicationConfiguration(如 customer/ApplicationConfiguration.java)注释也印证了这一约定——测试配置连接的是名为test的 MongoDB 实例,并启用 Spring Data repositories。
设置用户名、密码
生产环境必须开启访问控制。在未开启认证的实例上,通过mongo客户端进入admin库创建管理员用户:
> use admin switched to db admin > db.createUser({"user":"root","pwd":"root","roles":[{"role":"userAdminAnyDatabase","db":"admin"}]}) Successfully added user: { "user" : "root", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } >要点说明:
use admin切换到系统管理库,管理员账号统一建在admin库中;db.createUser的roles数组指定角色与所属库。userAdminAnyDatabase允许在任意数据库上管理用户;- 创建完成后,需要为
mongod配置--auth参数(或在配置文件中设置security.authorization: enabled)并重启服务,认证才会真正生效; - 认证开启后,客户端连接需指定用户名、密码及认证库。对应到上文 application.properties 中的
spring.data.mongodb.username/spring.data.mongodb.password,而命令行工具则需配合-u/-p与--authenticationDatabase admin使用(见下文导入导出部分)。
备份和恢复
备份恢复是运维的底线保障。MongoDB 提供一对配套命令:mongodump负责逻辑备份(导出 BSON/JSON),mongorestore负责恢复。
数据备份(mongodump)
mongodump命令可以导出全部或指定数据到目标目录,基本语法如下:
mongodump -h dbhost -d dbname -o dbdirectory参数说明:
-h:MongoDB 所在服务器地址,例如127.0.0.1,也可以指定端口号127.0.0.1:27017;-d:需要备份的数据库实例,例如test;-o:备份数据的存放位置,例如c:\data\dump。该目录需提前创建;备份完成后系统会自动在dump目录下建立一个test目录,存放该数据库实例的备份数据。
mongodump常用可选参数列表:
| 语法 | 描述 | 实例 |
|---|---|---|
mongodump --host HOST_NAME --port PORT_NUMBER | 备份所有 MongoDB 数据 | mongodump --host runoob.com --port 27017 |
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY | 通过数据文件路径离线备份 | mongodump --dbpath /data/db/ --out /data/backup/ |
mongodump --collection COLLECTION --db DB_NAME | 备份指定数据库中的指定集合 | mongodump --collection mycol --db test |
补充:备份命令中若实例开启了认证,还需追加
-u/-p与--authenticationDatabase admin;需要压缩落盘时可加--gzip,需要单一归档文件时可加--archive=backup.archive。
【示例】备份全量数据:
$ mongodump -h 127.0.0.1 --port 27017 -o test2 ... 2020-09-11T11:55:58.086+0800 done dumping test.company (18801 documents) 2020-09-11T11:56:00.725+0800 [#############...........] test.people 559101/1000000 (55.9%) 2020-09-11T11:56:03.725+0800 [###################.....] test.people 829496/1000000 (82.9%) 2020-09-11T11:56:06.725+0800 [#####################...] test.people 884614/1000000 (88.5%) 2020-09-11T11:56:08.088+0800 [########################] test.people 1000000/1000000 (100.0%) 2020-09-11T11:56:08.350+0800 done dumping test.people (1000000 documents)【示例】备份指定数据库:
mongodump -h 127.0.0.1 --port 27017 -d admin -o test3备份输出中的进度条[####...]展示每个集合的导出百分比,done dumping ... (N documents)表示该集合备份完成。
数据恢复(mongorestore)
mongorestore命令用于将mongodump产生的备份恢复到 MongoDB,基本语法如下:
mongorestore -h <hostname><:port> -d dbname <path>参数说明:
--host <:port>/-h <:port>:MongoDB 所在服务器地址,默认为localhost:27017;--db/-d:需要恢复的数据库实例,例如test,该名称可以与备份时的数据库名不同(如test2);--drop:恢复前先删除当前集合数据再恢复备份数据。即恢复后,备份之后新增、修改的数据都会被删除,慎用;<path>:mongorestore的最后一个参数,指定备份数据所在位置,例如c:\data\dump\test。<path>与--dir不能同时指定;--dir:指定备份目录,与<path>二者只能选其一。
【示例】恢复备份(带--drop):
$ mongorestore -h 127.0.0.1 --port 27017 -d test --dir test --drop ... 2020-09-11T11:46:16.053+0800 finished restoring test.tweets (966 documents, 0 failures) 2020-09-11T11:46:18.256+0800 [###.....................] test.people 164MB/1.03GB (15.6%) 2020-09-11T11:46:21.255+0800 [########................] test.people 364MB/1.03GB (34.6%) 2020-09-11T11:46:24.256+0800 [############............] test.people 558MB/1.03GB (53.0%) 2020-09-11T11:46:27.255+0800 [###############.........] test.people 700MB/1.03GB (66.5%) 2020-09-11T11:46:30.257+0800 [###################.....] test.people 846MB/1.03GB (80.3%) 2020-09-11T11:46:33.255+0800 [######################..] test.people 990MB/1.03GB (94.0%) 2020-09-11T11:46:34.542+0800 [########################] test.people 1.03GB/1.03GB (100.0%) 2020-09-11T11:46:34.543+0800 no indexes to restore 2020-09-11T11:46:34.543+0800 finished restoring test.people (1000000 documents, 0 failures) 2020-09-11T11:46:34.544+0800 1000966 document(s) restored successfully. 0 document(s) failed to restore.finished restoring ... (N documents, 0 failures)与末尾的N document(s) restored successfully是校验恢复是否完整的关键输出。注意恢复完成后通常需要重建索引(日志中的no indexes to restore提示备份未包含索引定义时尤其要留意)。
导入导出
与mongodump/mongorestore的 BSON 二进制格式不同,mongoimport和mongoexport面向 JSON/CSV 文本格式,适用于跨系统数据交换与日常调试。
重要限制:mongoimport和mongoexport并不能可靠地保存所有的富文本 BSON 数据类型,因为 JSON 仅能表示 BSON 支持类型的一个子集。因此,用这些工具导出导入的数据可能会丢失部分精度(例如Date、ObjectId、二进制等特殊类型),对精度敏感的数据应优先使用mongodump/mongorestore。
导入操作(mongoimport)
默认情况下,mongoimport将数据导入到本地主机端口 27017 上的 MongoDB 实例。要导入到其他主机或端口,通过--host和--port选项指定主机名或端口;使用--drop选项可在导入前删除已存在的同名集合,确保集合只包含本次导入的数据。
语法格式:
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名常用参数:-h/--host主机、--port端口、-u/-p用户名密码(认证开启时配合--authenticationDatabase)、-d/--db目标数据库、-c/--collection目标集合、--type文件类型(json/csv/tsv)、--headerline(csv 首行为字段名)、--upsert(按_id或--upsertFields指定的字段更新插入)、--drop(先删集合再导入)。
【示例】导入表数据(.dat为 JSON 文本文件):
$ mongoimport -h 127.0.0.1 --port 27017 -d test -c book --drop test/book.dat 2020-09-11T10:53:56.359+0800 connected to: mongodb://127.0.0.1:27017/ 2020-09-11T10:53:56.372+0800 dropping: test.book 2020-09-11T10:53:56.628+0800 431 document(s) imported successfully. 0 document(s) failed to import.【示例】从 JSON 文件导入表数据(--upsert按_id更新插入,避免重复):
$ mongoimport -h 127.0.0.1 --port 27017 -d test -c student --upsert test/student.json 2020-09-11T11:02:55.907+0800 connected to: mongodb://127.0.0.1:27017/ 2020-09-11T11:02:56.068+0800 200 document(s) imported successfully. 0 document(s) failed to import.【示例】从 CSV 文件导入表数据(--headerline将首行解析为字段名):
$ mongoimport -h 127.0.0.1 --port 27017 -d test -c product --type csv --headerline test/product.csv 2020-09-11T11:07:49.788+0800 connected to: mongodb://127.0.0.1:27017/ 2020-09-11T11:07:51.051+0800 11 document(s) imported successfully. 0 document(s) failed to import.【示例】导入部分字段并指定更新键(--upsertFields name,price表示按 name、price 两字段判断是否更新):
$ mongoimport -h 127.0.0.1 --port 27017 -d test -c product --type json --upsertFields name,price test/product.json 2020-09-11T11:14:05.410+0800 connected to: mongodb://127.0.0.1:27017/ 2020-09-11T11:14:05.612+0800 11 document(s) imported successfully. 0 document(s) failed to import.导出操作(mongoexport)
语法格式:
mongoexport -h <IP> --port <端口> -u <用户名> -p <密码> -d <数据库> -c <表名> -f <字段> -q <条件导出> --csv -o <文件名>参数说明:
-f:导出指定字段,以逗号分隔,例如-f name,email,age导出 name、email、age 三个字段;-q:按查询条件导出,例如-q '{ "uid" : "100" }'只导出 uid 为 100 的数据;--csv:导出为 CSV 格式。该格式通用性较强,大部分关系型数据库都支持 CSV,便于异构系统间迁移数据。
【示例】导出整张表:
$ mongoexport -h 127.0.0.1 --port 27017 -d test -c product -o test/product.dat 2020-09-11T10:44:23.161+0800 connected to: mongodb://127.0.0.1:27017/ 2020-09-11T10:44:23.177+0800 exported 11 records【示例】导出表到 JSON 文件:
$ mongoexport -h 127.0.0.1 --port 27017 -d test -c product --type json -o test/product.json 2020-09-11T10:49:52.735+0800 connected to: mongodb://127.0.0.1:27017/ 2020-09-11T10:49:52.750+0800 exported 11 records【示例】导出表中部分字段到 CSV 文件:
$ mongoexport -h 127.0.0.1 --port 27017 -d test -c product --type csv -f name,price -o test/product.csv 2020-09-11T10:47:33.160+0800 connected to: mongodb://127.0.0.1:27017/ 2020-09-11T10:47:33.176+0800 exported 11 records用仓库自带的 JSON 数据文件实战演练
本仓库的 javadb/mongodb 模块 恰好提供了与上文示例对应的三份真实数据文件,可以直接用于演练导入导出:
- books.json:约 400 余本书籍数据(与上文
book集合示例对应),每条记录包含title、isbn、pageCount、authors、status等字段; - students.json:3600 行学生成绩数据(与上文
student集合示例对应),包含name与嵌套数组scores; - products.json:204 行商品数据(与上文
product集合示例对应),包含_id、name、brand、price、rating等字段。
以students.json为例,启动 MongoDB 后直接执行:
mongoimport -h 127.0.0.1 --port 27017 -d test -c student --drop codes/javadb/mongodb/src/main/resources/db/students.json即可在test.student集合中看到完整的学生成绩数据(每条文档含scores数组,正好可以体验 MongoDB 文档嵌套结构的导入效果)。
值得一提的是,仓库的集成测试 SpringBooksIntegrationTests.java 展示了另一种数据装载方式:通过 Spring Data 的MongoOperations,用ClassPathResource("books.json")读取文件,Document.parse解析后operations.insert(books, "books")批量写入books集合——这正是mongoimport导入流程在 Java 应用层的等价实现,可作为自动化灌数场景的参考。
参考资料
- 本文关联文档:MongoDB 运维
- MongoDB 系列教程索引(含应用指南、CRUD、聚合、事务、建模、索引、复制、分片等):MongoDB 教程
- 仓库 MongoDB Spring Boot 示例模块:codes/javadb/mongodb,连接配置见 application.properties
- 官方文档、GitHub 仓库与免费课程等外部资料入口,可参考 MongoDB 教程目录 中的“资料”清单
- 文档
- 教程
- 数据库
【免费下载链接】db-tutorial
📚 后端程序员应该掌握的主流数据库知识
相关推荐
VSCode数据库客户端数据操作实战:CRUD、导入导出与备份恢复
VSCode数据库客户端数据操作实战:CRUD、导入导出与备份恢复 VSCode数据库客户端是一款功能强大的数据库管理工具,支持MySQL、PostgreSQL
开发工具Databasus 安装部署与备份运维实战指南:自托管 PostgreSQL 备份、PITR 与恢复验证
Databasus 安装部署与备份运维实战指南:自托管 PostgreSQL 备份、PITR 与恢复验证 Databasus 是一款免费、开源、可自托管的 Po
数据库灾备Etherpad 运维实战指南:安装部署、Pad 管理与数据备份恢复全解
Etherpad 运维实战指南:安装部署、Pad 管理与数据备份恢复全解 本篇技术指南基于 Etherpad 官方 FAQ 整理并深入源码验证,系统讲解 Eth
后端协同办公WebSocket前端富文本
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考