Mongodb數據管理
1.登錄數據庫,查看默認的庫
[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對象相關命令;
db.[TAB][TAB]
db.help()db.zhiyong.[TAB][TAB]
db.zhiyong.help()
RS復制集相關命令(replication set);
rs.[TAB][TAB]
rs.help()
SH分片集群相關命令(sharding cluster);
sh.[TAB][TAB]
sh.help()
> rs.help
function() {print("\trs.status() { replSetGetStatus : 1 } checks repl set status");
.......> db.getname
xiaoQ.getname
2.2 庫的管理
> 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 文檔操作
# 數據錄入到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再去創建)
> 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身份驗證功能
cat >> /mongodb/conf/mongodb.yaml <<EOF
security:authorization: enabled
EOF
3.進行用戶登錄驗證,本地登錄不需要加驗證庫信息
# 本地登錄用戶驗證
[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.遠程登錄用戶驗證,遠程登錄必須加驗證庫信息
# 登錄時就直接驗證
[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 庫的管理權限
> 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.進行用戶登錄驗證
# 本地登錄用戶驗證,本地登錄應用程序用戶登錄也需要加驗證庫信息
[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
-- 遠程登錄必須加驗證庫信息,訪問對應驗證庫信息會順利完成驗證
用戶刪除
刪除指定用戶,必須進入到指定的驗證庫中,才能刪除相應的用戶信息
[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集合
mongoexport --port 38017 -d zhiyong -c vast -o /mongodb/vast.json
2.如果設置了認證,那么備份方式為:
mongoexport \
-uroot -proot123 --port 27017 \
--authenticationDatabase admin -d zhiyong -c vast \
-o /mongodb/vast.json
3.單表 vast 備份為csv格式
mongoexport \
--port 38017 -d zhiyong -c vast --type=csv \
-f id,name,age,date \
-o /mongodb/vast.csv
2 mongodump
1.全量備份數據(也可以-d 指定要備份的庫)
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,執行數據恢復操作
mongorestore \-h localhost:27018 \/tmp/mong_export
3.登錄27018實例,驗證恢復的庫wzyboy
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.注:如果設置了密碼可以這樣進行數據恢復
mongorestore \-h localhost:27018 \-u root \-p='aa' \--authenticationDatabase=admin \/tmp/mong_export
2.如果只需要恢復某個數據庫,可以指定數據庫名稱
mongorestore \-h localhost:27018 \--db wzyboy \/tmp/mong_export/wzyboy
3.如果只需要恢復某個集合,可以指定集合名稱:
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參數,將源表刪除在導入
mongoimport \
-uroot -proot123 --port 27017 \
--authenticationDatabase admin \
-d zhiyong -c vast1 /mongodb/log.json
2.還是以分片集群為例測試數據導入:
mongoimport --port 38017 \
-d zhiyong -c vast1 /mongodb/vast.json
3.驗證導入成功
[root@db51~]# mongo --port 38017mongos> use zhiyong;mongos> show tables;
vast
vast1
2 csv恢復
如果要帶入csv格式文件中的內容,需要通過–type參數指定導入格式
還是用之前導出的csv文件
ls /mongodb/vast.*
/mongodb/vast.csv /mongodb/vast.json
1.csv格式的文件頭行,headerline參數表示指定第一行是列名,不需要導入
mongoimport --port 38017 -d zhiyong -c vast2 --type=csv --headerline --file /mongodb/vast.csv
2.驗證導入成功
mongos> show tables;
vast
vast1
vast2
2.5.4 異構平臺遷移案例
1.以mysql8.0.26導出json為例,需開啟安全目錄設置
cat >> /data/3306/my.cnf <<EOF
secure-file-priv=/tmp
EOF
2.開始把數據導出為/tmp/json
select * from world.city into outfile '/tmp/city.csv' fields terminated by ',';
3.處理備份后的csv文件,添加表頭信息
vim /tmp/city.csv
ID,Name,CountryCode,District,Population
4.遷移數據導入到mongodb數據庫
mongoimport --port 38017 -d world -c city --type=csv -f \
ID,Name,CountryCode,District,Population \
--file /tmp/city.csv
5.在navicat查看數據
6.MySQL導出數據為 csv
先創建表,接受要存儲的數據
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文件,添加表頭信息
vim /tmp/city.csv
ID,Name,CountryCode,District,Population
4.遷移數據導入到mongodb數據庫
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
先創建表,接受要存儲的數據
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
);