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>パラメータを使用して、操作を再生する必要があります.