Mongodb数据管理
1.登录数据库,查看默认的库
bash
[root@db51~]# mongo
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
> use admin
switched to db admin
> show tables
system.version
>
- admin库:
admin
是 MongoDB 的管理数据库,用于存储用户、角色和系统范围的配置。具有admin
数据库权限的用户可以管理整个 MongoDB 实例 - **
config
库:**如果 MongoDB 部署为分片集群(sharded cluster),config
数据库会存储分片信息和路由元数据 - **
local
数据库:**存储的是与本地节点相关的数据,不会被复制到其他节点。例如存储复制集的元数据(如oplog.rs
集合
2.1 命令分类
DB对象相关命令;
sql
db.[TAB][TAB]
db.help()
db.zhiyong.[TAB][TAB]
db.zhiyong.help()
RS复制集相关命令(replication set);
sql
rs.[TAB][TAB]
rs.help()
SH分片集群相关命令(sharding cluster);
sql
sh.[TAB][TAB]
sh.help()
> rs.help
function() {
print(
"\trs.status() { replSetGetStatus : 1 } checks repl set status");
.......
> db.getname
xiaoQ.getname
2.2 库的管理
bash
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
# 相当于创建一个库
> use wzyboy;
switched to db wzyboy
# 删除库
> db.dropDatabase();
{ "ok" : 1 }
# 创建一个叫 a 表
> db.createCollection("a");
{ "ok" : 1 }
> show tables
a
# 随意插入数据
switched to db wzy666
> db.test.insert({name:"zhangsan"})
WriteResult({ "nInserted" : 1 })
> db.stu.insert({id:101,name:"zhangsan",age:20,gender:"m"})
WriteResult({ "nInserted" : 1 })
> show tables;
stu
# 查询指定数据
> db.log.find({uid:999})
{ "_id" : ObjectId("66b19bbddd8229605d070b7e"), "uid" : 999, "name" : "mongodb", "age" : 6, "date" : ISODate("2024-08-06T03:42:53.818Z") }
# 设置显示50条信息
> DBQuery.shellBatchSize=50;
50
> db.log.find()
...
# 显示出50条数据~
2.3 文档操作
sql
# 数据录入到log表
> for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})}
WriteResult({ "nInserted" : 1 })
# 查询数据行数
> db.log.count()
10000
# 全表信息查询
> db.log.find()
{ "_id" : ObjectId("6403169ac7c3cb20a4ebd465"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2021-06-04T09:59:54.234Z") }
{ "_id" : ObjectId("6403169ac7c3cb20a4ebd466"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2021-06-04T09:59:54.240Z") }
{ "_id" : ObjectId("6403169ac7c3cb20a4ebd467"), "uid" : 2, "name" : "mongodb", "age" : 6, "date" : ISODate("2021-06-04T09:59:54.241Z") }
-- 默认每页显示20行数据信息
# 每页显示50条记录信息
> DBQuery.shellBatchSize=50;
50
> db.log.find()
# 按照条件查询数据
> db.log.find({uid:999})
{ "_id" : ObjectId("6403169ac7c3cb20a4ebd84c"), "uid" : 999, "name" : "mongodb", "age" : 6, "date" : ISODate("2021-06-04T09:59:54.548Z") }
# 以标准的json格式输出内容
> db.log.find({uid:999}).pretty()
{
"_id" : ObjectId("6403169ac7c3cb20a4ebd84c"),
"uid" : 999,
"name" : "mongodb",
"age" : 6,
"date" : ISODate("2021-06-04T09:59:54.548Z")
}
# 删除集合中所有记录,表示清空集合中的所有文档内容
> db.log.remove({})
WriteResult({ "nRemoved" : 10000 })
> db.log.find()
# 或者表示将文档内容和集合信息全部删除
> db.log.drop()
true
> show tables
# 查看集合存储信息
> for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})}
WriteResult({ "nInserted" : 1 })
> db.log.totalSize()
40960
# 或者集合中索引+数据库压缩存储之后的大小
> db.log.stats()
2.4 用户管理
用户管理概述
验证库(authenticationDatabase):建立用户时use到的库,就是验证库,在使用用户时,要加上验证库才能登录,主要限制远程
对于管理员用户,必须在admin下创建:
- 建立用户时,use到的库,就是此用户的验证库
- 登录时,必须明确指定验证库才能登录
- 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
- 如果直接登录到数据库,不进行use,默认的验证库是test,不是企业生产建议的
- 从3.6版本开始,不添加bindIp参数,默认不让远程登录,只能本地管理员登录(远程登录需要配置bindIp参数)
创建超级管理员
1.管理所有数据库(必须use admin再去创建)
sql
> use admin
switched to db admin
> db.createUser(
{
"user": "root",
"pwd": "root123",
"roles": [
{
"role": "root",
"db": "admin"
}
]
}
)
# 输出内容:
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
# 验证用户是否创建成功
> db.auth('root','root123')
# 查看指定用户
db.getUser("root")
# 修改用户的密码,以root为例
// 切换到 admin 数据库
use admin
// 修改 root 用户的密码
db.changeUserPassword("root", "this_is_new_password")
# 查看一个库的所有用户
use admin
db.getUsers()
[
{
"_id" : "admin.app02",
"userId" : UUID("b9945460-b130-4958-8f9d-e7383a412e5d"),
"user" : "app02",
"db" : "admin",
"roles" : [
{
"role" : "readWrite",
"db" : "wzyboy"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
},
{
"_id" : "admin.root",
"userId" : UUID("7d31739d-3535-4b76-99d2-e2b3def9d069"),
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
]
2.配置文件中,加入以下验证功能配置,然后重启数据库,就可以实现mongodb身份验证功能
yaml
cat >> /mongodb/conf/mongodb.yaml <<EOF
security:
authorization: enabled
EOF
3.进行用户登录验证,本地登录不需要加验证库信息
sql
# 本地登录用户验证
[root@db51~]# mongo -uroot -proot123 admin
> use admin
switched to db admin
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
wzy 0.000GB
> use admin
switched to db admin
> db.auth('root','root123')
1
4.远程登录用户验证,远程登录必须加验证库信息
sql
# 登录时就直接验证
[root@db51~]# mongo -uroot -proot123 10.0.0.51:27017/admin
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
wzy 0.000GB
[root@db51~]# mongo 10.0.0.51:27017/admin
# 没有验证通过时不能看到数据库的
> show databases;
> use admin
switched to db admin
> db.auth('root','root123')
1
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
wzy 0.000GB
5.使用navicat工具进行连接

创建普通用户
1.创建一个普通用户app01,并授予对 wzyboy 库的管理权限
sql
> use wzyboy
switched to db wzyboy
> db.createUser(
{
user: "app01",
pwd: "app01",
roles: [ { role: "readWrite", db: "wzyboy" } ]
}
)
# 输出结果:应用程序用户创建成功
Successfully added user: {
"user" : "app01",
"roles" : [
{
"role" : "readWrite",
"db" : "wzyboy"
}
]
}
# 应用程序用户是否创建成功
> db.auth('app01','app01')
1
# 插入表测试
> db.student.insert({name:"zhangsan"})
WriteResult({ "nInserted" : 1 })
# 验证数据写入成功
> DBQuery.shellBatchSize=2;
> db.student.find()
{ "_id" : ObjectId("6766509af1117827689ed0b2"), "name" : "zhangsan" }
2.进行用户登录验证
sql
# 本地登录用户验证,本地登录应用程序用户登录也需要加验证库信息
[root@db51~]# mongo -uapp01 -papp01 wzyboy
> use wzyboy
> show tables;
log
stu
test
# 远程登录用户验证
[mongod@master ~]$ mongo -uapp01 -papp01 192.168.30.101:27017/wzyboy
> use admin
switched to db admin
> db.auth('app01','app01')
Error: Authentication failed.
0
-- 访问非验证库会出现报错信息
> use wzyboy
switched to db wzyboy
> db.auth('app01','app01')
1
-- 远程登录必须加验证库信息,访问对应验证库信息会顺利完成验证
用户删除
删除指定用户,必须进入到指定的验证库中,才能删除相应的用户信息
bash
[root@db51~]# mongo -uroot -proot123 10.0.0.51:27017/admin
> use wzyboy
> db.createUser ({user:"app02",pwd:"app02",roles:[{role:"readWrite",db:"wzyboy"}]})
> use wzyboy;
> db.dropUser("app02")
true
用户总结
创建用户要有验证库信息,管理员对应admin库,普通用户对应要管理的库
用户进行数据库服务远程登录时,要注意登录命令中有验证库信息
2.5 MongoDB的数据备份
2.5.1 数备备份/恢复工具介绍
序号 | 备份工具命令 | 恢复工具命令 |
---|---|---|
逻辑备份-单表迁移 json csv | mongoexport | mongoimport |
物理备份-全库操作 分库分表 | mongodump | mongorestore |
两种类型的备份恢复工具应用场景区别:
++类型一:(mongoexport/mongoimport)++
- 异构平台迁移,比如:mysql <---> mongodb
- 相同平台迁移,比如:跨版本迁移 mongodb 2 ---> mongodb 3
++类型二:(mongodump/mongorestore)++
- 日常数据信息备份保存使用;
- 日常数据信息恢复修复使用;
2.5.2 数据库导出
1 mongoexport
数据导出工具:mongoexport
获取帮助:mongoexport --help
参数 | 解释说明 |
---|---|
-h | 指明数据库宿主机的IP |
-u | 指明数据库宿主机的用户名 |
-p | 指明数据库的密码 |
-d | 指定数据库的名称 |
-c | 指定数据集合名称 |
-f | 指明要导出哪些列 |
-o | 指明导出后的文件名 |
-q | 指明导出数据的过滤条件 |
--authenticationDatabase | 指明验证库信息 |
1.没有使用密码时的备份方式。
本次备份的是之前分片集群里的zhiyong库中的vast集合
bash
mongoexport --port 38017 -d zhiyong -c vast -o /mongodb/vast.json
2.如果设置了认证,那么备份方式为:
bash
mongoexport \
-uroot -proot123 --port 27017 \
--authenticationDatabase admin -d zhiyong -c vast \
-o /mongodb/vast.json
3.单表 vast 备份为csv格式
bash
mongoexport \
--port 38017 -d zhiyong -c vast --type=csv \
-f id,name,age,date \
-o /mongodb/vast.csv
2 mongodump
1.全量备份数据(也可以-d 指定要备份的库)
shell
mongodump \
-h localhost:27017 \
-o /tmp/mong_export \
-u root \
-p='123456789' \
--authenticationDatabase=admin
# 查看备份成功的数据
[root@db51 ~]# ll /tmp/mong_export/
drwxr-xr-x 2 root root 4096 Feb 12 17:20 admin
drwxr-xr-x 2 root root 4096 Feb 12 17:22 wzyboy
2.创建一个新的实例27018,执行数据恢复操作
shell
mongorestore \
-h localhost:27018 \
/tmp/mong_export
3.登录27018实例,验证恢复的库wzyboy
shell
mongo --host 127.0.0.1 --port 27018
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
wzyboy 0.000GB
> use wzyboy;
switched to db wzyboy
> show tables;
a
test
恢复选项
1.注:如果设置了密码可以这样进行数据恢复
shell
mongorestore \
-h localhost:27018 \
-u root \
-p='aa' \
--authenticationDatabase=admin \
/tmp/mong_export
2.如果只需要恢复某个数据库,可以指定数据库名称
shell
mongorestore \
-h localhost:27018 \
--db wzyboy \
/tmp/mong_export/wzyboy
3.如果只需要恢复某个集合,可以指定集合名称:
shell
mongorestore \
-h localhost:27018 \
/tmp/mong_export/wzyboy \
--collection your_collection_name \
/tmp/mong_export/your_database_name/your_collection_name.bson
2.5.3 数据导入mongoimport
参数 | 解释说明 |
---|---|
-h | 指明数据库宿主机的IP |
-u | 指明数据库宿主机的用户名 |
-p | 指明数据库的密码 |
-d | 指定数据库的名称 |
-c | 指定数据集合名称 |
-f | 指明要导入哪些列 |
-j | 指定并行导入的行数信息 |
--authenticationDatabase | 指明验证库信息 |
1 json恢复
1.带密码的备份:
如果导入的表已经存在,可以在导入命令中加入 drop参数,将源表删除在导入
bash
mongoimport \
-uroot -proot123 --port 27017 \
--authenticationDatabase admin \
-d zhiyong -c vast1 /mongodb/log.json
2.还是以分片集群为例测试数据导入:
bash
mongoimport --port 38017 \
-d zhiyong -c vast1 /mongodb/vast.json
3.验证导入成功
bash
[root@db51~]# mongo --port 38017
mongos> use zhiyong;
mongos> show tables;
vast
vast1
2 csv恢复
如果要带入csv格式文件中的内容,需要通过--type参数指定导入格式
还是用之前导出的csv文件
bash
ls /mongodb/vast.*
/mongodb/vast.csv /mongodb/vast.json
1.csv格式的文件头行,headerline参数表示指定第一行是列名,不需要导入
bash
mongoimport --port 38017 -d zhiyong -c vast2 --type=csv --headerline --file /mongodb/vast.csv
2.验证导入成功
bash
mongos> show tables;
vast
vast1
vast2
2.5.4 异构平台迁移案例
1.以mysql8.0.26导出json为例,需开启安全目录设置
bash
cat >> /data/3306/my.cnf <<EOF
secure-file-priv=/tmp
EOF
2.开始把数据导出为/tmp/json
sql
select * from world.city into outfile '/tmp/city.csv' fields terminated by ',';
3.处理备份后的csv文件,添加表头信息
bash
vim /tmp/city.csv
ID,Name,CountryCode,District,Population
4.迁移数据导入到mongodb数据库
bash
mongoimport --port 38017 -d world -c city --type=csv -f \
ID,Name,CountryCode,District,Population \
--file /tmp/city.csv
5.在navicat查看数据

6.MySQL导出数据为 csv
先创建表,接受要存储的数据
sql
DROP TABLE IF EXISTS wzy1.test_info;
CREATE TABLE wzy1.test_info (
id INT,
city_name VARCHAR(255),
country_code VARCHAR(10),
region VARCHAR(255),
population INT
);
iv=/tmp
EOF
2.开始把数据导出为/tmp/json
```sql
select * from world.city into outfile '/tmp/city.csv' fields terminated by ',';
3.处理备份后的csv文件,添加表头信息
bash
vim /tmp/city.csv
ID,Name,CountryCode,District,Population
4.迁移数据导入到mongodb数据库
bash
mongoimport --port 38017 -d world -c city --type=csv -f \
ID,Name,CountryCode,District,Population \
--file /tmp/city.csv
5.在navicat查看数据
[外链图片转存中...(img-axmKWEED-1739555316937)]
6.MySQL导出数据为 csv
先创建表,接受要存储的数据
sql
DROP TABLE IF EXISTS wzy1.test_info;
CREATE TABLE wzy1.test_info (
id INT,
city_name VARCHAR(255),
country_code VARCHAR(10),
region VARCHAR(255),
population INT
);