MongoDB的CURD基本操作(四)——刪除、備份及恢復

注:本文基於MongoDB 4.2.6編寫

1、刪除

  • 刪除某個文檔
> db.bb.find().pretty()
{
	"_id" : ObjectId("5ed6549830571733ccb3d678"),
	"jordan" : 23,
	"haha" : "ending"
}
{
	"_id" : ObjectId("5ed6549830571733ccb3d679"),
	"kobe" : 24,
	"haha" : "ending"
}
> db.bb.remove({jordan: 23})
WriteResult({ "nRemoved" : 1 })
> db.bb.find().pretty()
{
	"_id" : ObjectId("5ed6549830571733ccb3d679"),
	"kobe" : 24,
	"haha" : "ending"
}

刪除某個文檔首先需要匹配到這個文檔,而對於匹配規則來說,和update()以及find()都是一致的。

不過需要注意的是,remove()會刪除所有匹配的文檔

> db.bb.find().pretty()
{
	"_id" : ObjectId("5ed6549830571733ccb3d679"),
	"kobe" : 24,
	"haha" : "ending"
}
{
	"_id" : ObjectId("5ed6549830571733ccb3d67a"),
	"tmac" : 1,
	"haha" : "ending"
}
{
	"_id" : ObjectId("5ed6554230571733ccb3d67b"),
	"name" : "jay",
	"hello" : "ball",
}
> db.bb.remove({"haha" : "ending"})
WriteResult({ "nRemoved" : 2 })
> db.bb.find().pretty()
{
	"_id" : ObjectId("5ed6554230571733ccb3d67b"),
	"name" : "jay",
	"hello" : "ball"
}
  • 刪除集合所有文檔
> db.aa.find().pretty()
{ "_id" : ObjectId("5ed7b329582b5fea09b920a6"), "name" : "aa", "id" : 100 }
{ "_id" : ObjectId("5ed7b351582b5fea09b920a7"), "name" : "bb", "id" : 101 }
> db.aa.remove()
2020-06-03T10:30:01.574-0400 E  QUERY    [js] uncaught exception: Error: remove needs a query :
DBCollection.prototype._parseRemove@src/mongo/shell/collection.js:357:15
DBCollection.prototype.remove@src/mongo/shell/collection.js:384:18
@(shell):1:1
> db.aa.remove({})
WriteResult({ "nRemoved" : 2 })
> db.aa.find().pretty()
> show collections
aa

注意,remove()刪除所有文檔時需要添加查詢語句,也就是{},否則會報錯。另外,remove()不會刪除集合本身。

  • 刪除集合

如果需要連集合一起刪除的話,可以使用drop()

> db.aa.find().pretty()
{ "_id" : ObjectId("5ed7b4f5582b5fea09b920ac"), "name" : "aa", "id" : 100 }
{ "_id" : ObjectId("5ed7b4f8582b5fea09b920ad"), "name" : "bb", "id" : 101 }
> db.aa.drop()
true
> show collections
>
  • 刪除數據庫
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

2、備份

  • 目錄備份
    直接使用cp或者rsync命令拷貝MongoDB的數據目錄,但是需要注意,拷貝前需要停止所有mongod實例,否則拷貝的文件還有寫入的話,備份的數據就會變得不一致。
    當然也可不停止實例,但是需要刷緩存並禁止寫入,此時就可以保證讀操作正常進行,可以使用以下命令鎖住數據庫,
> db.fsyncLock()
{
	"info" : "now locked against writes, use db.fsyncUnlock() to unlock",
	"lockCount" : NumberLong(1),
	"seeAlso" : "http://dochub.mongodb.org/core/fsynccommand",
	"ok" : 1
}

備份完之後,再使用以下命令解鎖,

> db.fsyncUnlock()
{ "info" : "fsyncUnlock completed", "lockCount" : NumberLong(0), "ok" : 1 }
  • mongodump命令備份
mongodump -d dbname -u username -p password --authenticationDatabase admin --host="mongodb-ip:27017" -o /home/data/mydb_$(date +%Y%m%d)

其中,
-d指定數據庫名稱
-u指定用戶名
-p指定密碼
–authenticationDatabase指定要連接認證的數據庫
–host指定數據庫ip及端口號
-o指定備份文件存放路徑

執行後就能到對應目錄查看備份信息,

[root@localhost data]# mongodump -d abc -u root -p root --authenticationDatabase admin --host="localhost:27017" -o /home/mongodb/data/db_$(date +%Y%m%d)
2020-06-20T23:32:59.930-0400	writing abc.bb to 
2020-06-20T23:32:59.931-0400	done dumping abc.bb (2 documents)
[root@localhost data]# ls
db_20200620
[root@localhost data]# cd db_20200620/
[root@localhost db_20200620]# ls
abc
[root@localhost db_20200620]# cd abc/
[root@localhost abc]# ls
bb.bson  bb.metadata.json

對於dump出來的文件,我們可以用bsondump文件查看,

[root@localhost abc]# bsondump bb.bson 
{"_id":{"$oid":"5ed6554230571733ccb3d67b"},"name":"jay","hello":"ball","animals":{"dog":{"$numberDouble":"50.0"},"cat":{"$numberDouble":"100.0"}},"happy":"ending","players":[{"name":"aa","score":{"$numberDouble":"98.0"}},{"name":"dan","score":{"$numberDouble":"95.0"}},{"name":"du","score":{"$numberDouble":"100.0"}}]}
{"_id":{"$oid":"5ed6579b30571733ccb3d67c"},"name":"jack","hello":"may","happy":"ending","players":[{"name":"aa","score":{"$numberDouble":"99.0"}},{"name":"dan","score":{"$numberDouble":"98.0"}},{"name":"du","score":{"$numberDouble":"90.0"}}]}
2020-06-20T23:44:27.676-0400	2 objects found 

備份時還會涉及到一個問題,備份需要時間,因此需要考慮備份時的數據修改如何處理,一不小心就會造成數據不一致的情況,這時就可以使用< --oplog>參數,但會保存備份開始到結束時這段時間數據庫的所有操作,然後在恢復備份時將該操作回放,以保證數據的一致性。

3、恢復

備份後,我們把該數據庫的集合刪除,模擬異常,

> db
abc
> show collections
bb
> db.bb.drop()
true
>

然後用剛纔備份的數據進行恢復,使用mongorestore命令,

[root@localhost data]# mongorestore --host=localhost:27017 -u root  --authenticationDatabase=admin /home/mongodb/data/db_20200620
Enter password:

2020-06-20T23:56:38.747-0400	preparing collections to restore from
2020-06-20T23:56:38.747-0400	reading metadata for abc.bb from /home/mongodb/data/db_20200620/abc/bb.metadata.json
2020-06-20T23:56:38.754-0400	restoring abc.bb from /home/mongodb/data/db_20200620/abc/bb.bson
2020-06-20T23:56:38.757-0400	no indexes to restore
2020-06-20T23:56:38.757-0400	finished restoring abc.bb (2 documents, 0 failures)
2020-06-20T23:56:38.757-0400	2 document(s) restored successfully. 0 document(s) failed to restore.

恢復完成後,在數據庫中查看數據,確認完整性,

> show collections
bb
> db.bb.find()
{ "_id" : ObjectId("5ed6554230571733ccb3d67b"), "name" : "jay", "hello" : "ball", "animals" : { "dog" : 50, "cat" : 100 }, "happy" : "ending", "players" : [ { "name" : "aa", "score" : 98 }, { "name" : "dan", "score" : 95 }, { "name" : "du", "score" : 100 } ] }
{ "_id" : ObjectId("5ed6579b30571733ccb3d67c"), "name" : "jack", "hello" : "may", "happy" : "ending", "players" : [ { "name" : "aa", "score" : 99 }, { "name" : "dan", "score" : 98 }, { "name" : "du", "score" : 90 } ] }
> 

當然,如果備份時使用了< --oplog>參數,恢復時需要使用< --oplogReplay>參數,回放操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章