Mongodb数据管理

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
);
相关推荐
今夜星辉灿烂3 分钟前
异构数据库数据同步最佳实践
数据库·elasticsearch
电商API_1800790524716 分钟前
微店商品详情接口micro.item_get请求参数响应参数解析
大数据·数据库·人工智能·爬虫
我今晚不熬夜41 分钟前
JSON在java中的使用
java·开发语言·json
····懂···2 小时前
开源数据库PostgreSQL专家技术
数据库·postgresql·开源
Asu52022 小时前
思途SQL学习 0729
数据库·sql·学习
北亚数据恢复2 小时前
服务器数据恢复—RAID上层部署的oracle数据库数据恢复案例
数据库·oracle·服务器数据恢复·北亚数据恢复
不辉放弃3 小时前
kafka的消息存储机制和查询机制
数据库·kafka·pyspark·大数据开发
ZZH1120KQ4 小时前
ORACLE的用户维护与权限操作
数据库·oracle
妮妮喔妮4 小时前
图片上传 el+node后端+数据库
javascript·数据库·vue.js
仰望星空的凡人10 小时前
【JS逆向基础】数据库之MongoDB
javascript·数据库·python·mongodb