MongoDB-バックアップとリカバリ

23127 ワード

一、ツール紹介
(1)mongoexport/mongoimport#インポート/エクスポートはJSON形式またはCSV形式
(2)mongodump/mongorestore#BSON形式でインポート/エクスポート
二、バックアップツールの違い
(1)JSONは可読性は強いが体積が大きく,BSONはバイナリファイルであり,体積は小さいが人間にはほとんど可読性がない.
(2)一部のmongodbバージョンの間では、BSONフォーマットはバージョンによって異なる場合があるため、バージョン間の互換性によってはmongodump/mongorestoreでは成功しない場合があります.BSONを使用してバージョン間のデータ移行ができない場合は、JSON形式のmongoexport/mongoimportを使用するとオプションです.バージョン間mongodump/mongorestoreは個人的には推奨されていませんが、実際には2つのバージョンが互換性があるかどうかを確認してください(ほとんどの場合).
(3)JSONはクロスバージョン汎用性に優れているが,データ部分のみが保持され,インデックス,アカウントなどの他の基礎情報は保持されていない.使うときは注意すべきです.
三、シーンの適用
mongoexport/mongoimport:  json csv
  • 異機種プラットフォーム移行mysql mongodb
  • 同プラットフォーム、跨大バージョン:mongodb 2------>mongodb 3
  • mongodump/mongorestore:日常バックアップリカバリ使用
    四、mongoexport/mongoimportツール
    4.1、エクスポートツールmongoexport
    Mongodbのmongoexportツールでは、collectionをJSON形式(デフォルト)またはCSV形式のファイルにエクスポートできます.
    パラメータでエクスポートされたデータ項目を指定したり、指定した条件に基づいてデータをエクスポートしたりできます.次のシーンに適しています.
  • (1)バージョンの差が大きい
  • (2)異機種プラットフォームデータ移行
  • 4.1.1、具体的なパラメータ説明
    $ mongoexport --help  
    
    #    :
    -h:         IP
    -u:         
    -p:        
    -d:        
    -c:  collection   
    -f:        
    -o:          
    -q:           
    --authenticationDatabase admin:   
    

    4.1.2、応用例
    テストデータの作成:
    [mongod@mongo ~]$ mongo -u root -p root123 10.0.0.21/admin
    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    > use oldboy
    switched to db oldboy
    > for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
    Date()})}
    WriteResult({ "nInserted" : 1 })
    > db.log.find()
    { "_id" : ObjectId("5d9809219455703947fc9855"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.040Z") }
    { "_id" : ObjectId("5d9809219455703947fc9856"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.052Z") }
    { "_id" : ObjectId("5d9809219455703947fc9857"), "uid" : 2, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.053Z") }
    { "_id" : ObjectId("5d9809219455703947fc9858"), "uid" : 3, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.053Z") }
    { "_id" : ObjectId("5d9809219455703947fc9859"), "uid" : 4, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.054Z") }
    { "_id" : ObjectId("5d9809219455703947fc985a"), "uid" : 5, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.054Z") }
    { "_id" : ObjectId("5d9809219455703947fc985b"), "uid" : 6, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.055Z") }
    { "_id" : ObjectId("5d9809219455703947fc985c"), "uid" : 7, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.055Z") }
    { "_id" : ObjectId("5d9809219455703947fc985d"), "uid" : 8, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.056Z") }
    { "_id" : ObjectId("5d9809219455703947fc985e"), "uid" : 9, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.056Z") }
    { "_id" : ObjectId("5d9809219455703947fc985f"), "uid" : 10, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.057Z") }
    { "_id" : ObjectId("5d9809219455703947fc9860"), "uid" : 11, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.058Z") }
    { "_id" : ObjectId("5d9809219455703947fc9861"), "uid" : 12, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
    { "_id" : ObjectId("5d9809219455703947fc9862"), "uid" : 13, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
    { "_id" : ObjectId("5d9809219455703947fc9863"), "uid" : 14, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
    { "_id" : ObjectId("5d9809219455703947fc9864"), "uid" : 15, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
    { "_id" : ObjectId("5d9809219455703947fc9865"), "uid" : 16, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
    { "_id" : ObjectId("5d9809219455703947fc9866"), "uid" : 17, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
    { "_id" : ObjectId("5d9809219455703947fc9867"), "uid" : 18, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.061Z") }
    { "_id" : ObjectId("5d9809219455703947fc9868"), "uid" : 19, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.061Z") }
    Type "it" for more
    > 

    1)単一テーブルをjson形式にバックアップする
    mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
    #  :            ,     JSON     
    

    操作手順:
    [mongod@mongo ~]$ mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
    2019-10-05T11:12:02.048+0800	connected to: localhost:27017
    2019-10-05T11:12:02.406+0800	exported 10000 records
    [mongod@mongo ~]$ ll /mongodb/log.json 
    -rw-rw-r-- 1 mongod mongod 1278890 Oct  5 11:12 /mongodb/log.json
    [mongod@mongo ~]$ head -2 /mongodb/log.json
    {"_id":{"$oid":"5d9809219455703947fc9855"},"uid":0.0,"name":"mongodb","age":6.0,"date":{"$date":"2019-10-05T03:08:17.040Z"}}
    {"_id":{"$oid":"5d9809219455703947fc9856"},"uid":1.0,"name":"mongodb","age":6.0,"date":{"$date":"2019-10-05T03:08:17.052Z"}}
    

    2)単一テーブルをcsv形式にバックアップする
    #        CSV     ,     --type=csv  :
    mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log --type=csv -f uid,name,age,date  -o /mongodb/log.csv

    操作手順:
    [mongod@mongo ~]$ mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log --type csv -f uid,name,age,date -o /mongodb/log.csv
    2019-10-05T11:17:21.864+0800	connected to: localhost:27017
    2019-10-05T11:17:21.994+0800	exported 10000 records
    [mongod@mongo ~]$ ll /mongodb/log.csv
    -rw-rw-r-- 1 mongod mongod 398908 Oct  5 11:17 /mongodb/log.csv  ##excel    (   window  )
    [mongod@mongo ~]$ head -5 /mongodb/log.csv 
    uid,name,age,date
    0,mongodb,6,2019-10-05T03:08:17.040Z
    1,mongodb,6,2019-10-05T03:08:17.052Z
    2,mongodb,6,2019-10-05T03:08:17.053Z
    3,mongodb,6,2019-10-05T03:08:17.053Z

    4.2、インポートツールmongoimport
    Mongodbのmongoimportツールでは、特定のフォーマットファイルの内容を指定したcollectionにインポートできます.このツールはJSON形式のデータをインポートすることも、CSV形式のデータをインポートすることもできます.
    4.2.1、具体的なパラメータの説明
    $ mongoimport --help
    
    #    :
    -h:         IP
    -u:         
    -p:        
    -d:        
    -c:  collection   
    -f:        
    -j, --numInsertionWorkers=  number of insert operations to run concurrently                                                  (defaults to 1)
    //  

    4.2.2、応用例
    1)json形式テーブルデータをlog 1に復元する
    mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json
    
    #  :
    mongo -uroot -proot123 10.0.0.21/admin
    use oldboy
    show tables
    db.log1.find()
    

    操作手順:
    [mongod@mongo ~]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json 
    2019-10-05T11:24:04.405+0800	connected to: localhost:27017
    2019-10-05T11:24:04.616+0800	imported 10000 documents
    [mongod@mongo ~]$ mongo -uroot -proot123 10.0.0.21/admin
    MongoDB shell version v3.6.11-14-g48d999c
    connecting to: mongodb://10.0.0.21:27017/admin?gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("22f6f963-7f08-4a08-a674-eca7afb3ecdb") }
    MongoDB server version: 3.6.11-14-g48d999c
    > use oldboy
    switched to db oldboy
    > show tables
    log
    log1
    > db.log1.find()
    { "_id" : ObjectId("5d9809219455703947fc9855"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.040Z") }
    { "_id" : ObjectId("5d9809219455703947fc9856"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.052Z") }
    ....
    Type "it" for more
    > 

    2)csv形式のファイルをlog 2に復元する
    CSV形式ファイルの内容をインポートするには、--typeパラメータでインポート形式を指定する必要があります.
    ①csv形式のファイルヘッダ行にカラム名がある場合
    mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d oldboy -c log2 --type=csv --headerline --file  /mongodb/log.csv
    
    #--headerline:        ,     。
    

    ②csv形式のファイルヘッダ行にカラム名がない場合=>手動でカラム名を追加
    mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d oldboy -c log3 --type=csv -f id,name,age,date --file  /mongodb/log1.csv

    3)ケース:mysqlテーブルmongodbインポート
    例:mysqlのworldデータベースの下cityテーブルをエクスポートしmongodbにインポート
    #1、mysql      
    vim /etc/my.cnf
    secure-file-priv=/tmp
    
    #2、       
    /etc/init.d/mysqld restart
    
    #3、  mysql city   
    source /root/world.sql
    select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';  #     
    
    #4、      
    desc world.city       
    vim /tmp/city.csv   #         
    ID,Name,CountryCode,District,Population
    
    #5、 mongodb     
    mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world  -c city --type=csv -f ID,Name,CountryCode,District,Population --file  /tmp/city1.csv
    
    #6、  mongodb  
    mongo -uroot -proot123 --port 27017
    use world
    db.city.find({CountryCode:"CHN"});

    4)mysqlテーブルmongodbスクリプトの一括インポート
    [root@db03 scripts]# cat  mysql_mongo.sh
    #/bin/sh
    DATABASE=world
    [ ! -d /tmp/bak ] &&  mkdir /tmp/bak || rm -fr /tmp/bak/*
    BACKDIR=/tmp/bak
    chmod 777 $BACKDIR
    
    for TABLE in  `mysql -e "show tables from ${DATABASE};"|sed '1d'`
    do
    	TABLE_HEAD="select COLUMN_NAME from information_schema.columns where TABLE_SCHEMA='${DATABASE}' and TABLE_NAME='${TABLE}' into outfile '$BACKDIR/${DATABASE}_${TABLE}.txt' fields terminated by ','  lines terminated by ',';"
    	mysql -e "$TABLE_HEAD"
    	sed -i -r 's#(.*).#\1#g' $BACKDIR/${DATABASE}_${TABLE}.txt
    done
    
    #create data file
    DATA_SQL="select * from (select concat(\"select * from \",table_schema,\".\",table_name ,\" into outfile '$BACKDIR/\",table_schema,\"_\",table_name,\".csv' fields terminated by ',';\") from information_schema.tables where table_schema ='${DATABASE}') aa into outfile '$BACKDIR/bak_${DATABASE}.sql';"
    mysql -e "$DATA_SQL"
    mysql -e "source $BACKDIR/bak_${DATABASE}.sql;"
    rm -f $BACKDIR/bak_${DATABASE}.sql
    
    for TABLE in  `mysql -e "show tables from ${DATABASE};"|sed '1d'`
    do
    	HEAD=`cat $BACKDIR/${DATABASE}_${TABLE}.txt`
    	sed -i "1i ${HEAD}" $BACKDIR/${DATABASE}_${TABLE}.csv
    	mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d ${DATABASE}  -c ${TABLE} --type=csv --headerline  --file  $BACKDIR/${DATABASE}_${TABLE}.csv
    	rm -f $BACKDIR/${DATABASE}_${TABLE}.txt
    done

    五、mongodump/mongorestoreツール
    5.1、紹介
    mongodumpでは、Mongodbの実行時にバックアップできます.実行中のMongodbをクエリーし、検出されたすべてのドキュメントをディスクに書き込むのが原理です.しかし、問題がある場合にmongodumpを使用して生成されるバックアップは、必ずしもデータベースのリアルタイムスナップショットではありません.バックアップ時にデータベースに書き込みを行った場合、バックアップされたファイルがMongodbのリアルタイムデータと完全に等しくない可能性があります.また、バックアップ時に他のクライアントのパフォーマンスに悪影響を及ぼす可能性があります.
    5.2、mongodumpの使い方
    $ mongodump --help
        :
    -h:         IP
    -u:         
    -p:        
    -d:        
    -c:  collection   
    -o:          
    -q:           
    -j, --numParallelCollections=  number of collections to dump in parallel (4 by default)
    --oplog         oplog

    5.3、mongodumpとmongorestore基本使用
    5.3.1、全ライブラリバックアップ
    mkdir /mongodb/backup
    mongodump  -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
    
    [mongod@db03 mongodb]$ tree backup/
    backup/
    |-- admin
    |   |-- system.users.bson
    |   |-- system.users.metadata.json
    |   |-- system.version.bson
    |   `-- system.version.metadata.json
    `-- world
        |-- city.bson				#bson    
        |-- city.metadata.json		#json   
        |-- country.bson
        |-- country.metadata.json
        |-- countrylanguage.bson
        `-- countrylanguage.metadata.json
    

    5.3.2、worldライブラリのバックアップ
    mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/

    5.3.3、バックアップworldライブラリ下のcity集合
    mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city -o /mongodb/backup/

    5.3.4、圧縮バックアップ
    mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/ --gzip			#      world   
    
    [mongod@db03 backup]$ tree
    .
    `-- world
        |-- city.bson.gz
        |-- city.metadata.json.gz
        |-- country.bson.gz
        |-- country.metadata.json.gz
        |-- countrylanguage.bson.gz
    `-- countrylanguage.metadata.json.gz
    
    mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city -o /mongodb/backup/ --gzip			#          

    5.3.5、worldライブラリを回復する
    mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1  /mongodb/backup/world

    5.3.6、worldライブラリ下のcity集合を回復する
    mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city  --gzip  /mongodb/backup.bak/oldboy/log1.bson.gz

    5.3.7、--dropは回復時に前の集合dropを落とす(危険)
    mongorestore  -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy

    六、Oplog
    注:replica setまたはmaster/slaveモード専用です
    --oplog:use oplog for taking a point-in-time snapshot
    6.1、oplog紹介
    1)replica setにおけるoplogは、localライブラリのdbに位置するディスク領域の5%(oplogSizeMBパラメータで変更可能)のデフォルトサイズの集合である.oplog.rs.
    2)mongodインスタンス全体で一定期間データベースのすべての変更(挿入/更新/削除)操作が記録されます.
    3)スペースが切れたときに、新しいレコードは最も古いレコードを自動的に上書きします.全備の1サイクルで設定することが望ましい
    4)そのカバー範囲をoplogタイムウィンドウと呼ぶ.注意しなければならないのは、oplogは定容集合であるため、時間ウィンドウがカバーできる範囲は、単位時間内の更新回数によって変化します.
    6.2、oplogの表示
    pkill mongod
    pkill mongos
    
    #     
    mongod -f /mongodb/28017/conf/mongod.conf 
    mongod -f /mongodb/28018/conf/mongod.conf 
    mongod -f /mongodb/28019/conf/mongod.conf 
    mongod -f /mongodb/28020/conf/mongod.conf
    
        :
    mongo --port 28017
    my_repl:PRIMARY> use local
    switched to db local
    my_repl:PRIMARY> show tables
    me
    oplog.rs  #oplog
    replset.election
    replset.minvalid
    startup_log
    system.replset
    system.rollback.id
    my_repl:PRIMARY>  db.oplog.rs.find().pretty()
    {
    	"ts" : Timestamp(1553952478, 1), #   mysql  GTID,            (      )
    	"h" : NumberLong("-6103337942439244917"),	
    	"v" : 2,
    	"op" : "n",		#op         
    	"ns" : "",
    	"wall" : ISODate("2019-03-30T13:27:58.054Z"),
    	"o" : {			#    
    		"msg" : "initiating set"
    	}
    }
    ……
    
    #op     :
    "i": insert
    "u": update
    "d": delete
    "c": db cmd
    "db":       
    "n":no op,    ,            
    
    #    op      
    db.oplog.rs.find({op: "i"}).pretty()	#  insert  
    db.oplog.rs.find({op: "u"}).pretty()	#  uodate  

    oplogウィンドウの上書き予定時間を表示するには、次の手順に従います.
    my_repl:PRIMARY> rs.printReplicationInfo()
    configured oplog size:   2048MB					#    
    log length start to end: 1573secs (0.44hrs)		#        (           )
    oplog first event time:  Sat Mar 30 2019 21:27:58 GMT+0800 (CST)
    oplog last event time:   Sat Mar 30 2019 21:54:11 GMT+0800 (CST)
    now:                     Sat Mar 30 2019 21:54:14 GMT+0800 (CST)

    6.3、oplog応用
    ホット・スペアを実現し、バックアップ時に--oplogオプションを使用
    1)テストデータの準備
    mongo --port 28017
    use oldboy
    for(var i = 1 ;i < 100; i++) {
        db.foo.insert({a:i});
    }
    
    #  oplog  
    use local
    db.oplog.rs.find({"op":"i"}).pretty()

    2)oplogとmongodumpを組み合わせてホットスペアを実現
    mongodump --port 28017 --oplog -o /mongodb/backup
    #    :--oplog              。  oplog.bson    
    
    [mongod@db03 backup]$ mongodump --port 28017 --oplog -o /mongodb/backup
    [mongod@db03 backup]$ ll
    total 4
    drwxrwxr-x 2 mongod mongod  69 Mar 30 22:06 admin
    drwxrwxr-x 2 mongod mongod  47 Mar 30 22:06 oldboy
    -rw-rw-r-- 1 mongod mongod 110 Mar 30 22:06 oplog.bson	#             (  XBK  )
    drwxrwxr-x 2 mongod mongod 163 Mar 30 20:41 world
    

    3)回復
    mongorestore  --port 28017 --oplogReplay /mongodb/backup		#      
    mongorestore  --port 28017 --oplogReplay --drop /mongodb/backup	#      

    4)表示
    mongo --port 28017
    use oldboy
    db.foo.find()

    6.4、oplogケース
    6.4.1、背景
    1日0時フルタイム、oplogリカバリウィンドウは48時間
    ある日、午前10時world.cityビジネステーブルが誤って削除されました
    6.4.2、考え方を回復する
    1、応用停止
    2、テストライブラリを探す
    3、昨日の夜に完全に回復した
    4、全備を切り取ってworldに着く.cityは、時点のoplogを誤って削除し、テストライブラリに復元します.
    5、誤った削除表をエクスポートして、生産庫に回復する
    6.4.3、回復手順
    1)模擬故障環境
    #1、      
    [mongod@mongo backup]$ mongo --port 28017
    my_repl:PRIMARY> use world
    switched to db world
    my_repl:PRIMARY> for(var i = 1 ;i < 20; i++) {db.city.insert({a: i});}
    WriteResult({ "nInserted" : 1 })
    my_repl:PRIMARY> show tables
    city
    my_repl:PRIMARY> db.city.find()
    { "_id" : ObjectId("5d983997fad4d5a54c3147a1"), "a" : 1 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147a2"), "a" : 2 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147a3"), "a" : 3 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147a4"), "a" : 4 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147a5"), "a" : 5 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147a6"), "a" : 6 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147a7"), "a" : 7 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147a8"), "a" : 8 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147a9"), "a" : 9 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147aa"), "a" : 10 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147ab"), "a" : 11 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147ac"), "a" : 12 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147ad"), "a" : 13 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147ae"), "a" : 14 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147af"), "a" : 15 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147b0"), "a" : 16 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147b1"), "a" : 17 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147b2"), "a" : 18 }
    { "_id" : ObjectId("5d983997fad4d5a54c3147b3"), "a" : 19 }
    
    #2、    
    [mongod@mongo backup]$ rm -rf /mongodb/backup/*
    [mongod@mongo backup]$ mongodump --port 28017 --oplog -o /mongodb/backup
    #--oplog  :     ,               .       /mongodb/backup ,     oplog.bson
    
    #3、      
    [mongod@mongo backup]$ mongo --port 28017
    my_repl:PRIMARY> use world
    switched to db world
    my_repl:PRIMARY> db.city1.insert({id:1})
    WriteResult({ "nInserted" : 1 })
    my_repl:PRIMARY> db.city2.insert({id:2})
    WriteResult({ "nInserted" : 1 })
    my_repl:PRIMARY> show tables
    city
    city1
    city2
    my_repl:PRIMARY> db.city1.find()
    { "_id" : ObjectId("5d983a5fdce58094f164378b"), "id" : 1 }
    my_repl:PRIMARY> db.city2.find()
    { "_id" : ObjectId("5d983a61dce58094f164378c"), "id" : 2 }

    2)シミュレーション10点誤削除テーブルcity
    [mongod@mongo backup]$ mongo --port 28017
    my_repl:PRIMARY> use world
    switched to db world
    my_repl:PRIMARY> db.city.drop()
    true
    my_repl:PRIMARY> show tables;
    city1
    city2

    3)既存のoplogをバックアップする.rsテーブル
    [mongod@mongo backup]$ mongodump --port 28017 -d local -c oplog.rs  -o /mongodb/backup
    2019-10-05T14:40:54.659+0800	writing local.oplog.rs to 
    2019-10-05T14:40:54.665+0800	done dumping local.oplog.rs (2150 documents)
    [mongod@mongo backup]$ ll
    total 4
    drwxrwxr-x 2 mongod mongod  69 Oct  5 14:36 admin
    drwxrwxr-x 2 mongod mongod  57 Oct  5 14:40 local
    -rw-rw-r-- 1 mongod mongod 110 Oct  5 14:36 oplog.bson
    drwxrwxr-x 2 mongod mongod  49 Oct  5 14:36 world
    [mongod@mongo backup]$ cd local/
    [mongod@mongo local]$ ll
    total 292
    -rw-rw-r-- 1 mongod mongod 292559 Oct  5 14:40 oplog.rs.bson
    -rw-rw-r-- 1 mongod mongod    125 Oct  5 14:40 oplog.rs.metadata.json

    4)元のデータベースにログインし、oplogをdropより前の場所に切り取る
    [mongod@mongo local]$ mongo --port 28017
    my_repl:PRIMARY> use local
    db.oplog.rs.find({op:"c"}).pretty();
    
    {
    	"ts" : Timestamp(1570257582, 1),  #     
    	"t" : NumberLong(2),
    	"h" : NumberLong("5961626649005236896"),
    	"v" : 2,
    	"op" : "c",
    	"ns" : "world.$cmd",
    	"ui" : UUID("394fa2d3-1609-4946-8254-3e5e657b5447"),
    	"wall" : ISODate("2019-10-05T06:39:42.558Z"),
    	"o" : {
    		"drop" : "city"
    	}
    }
    

    5)バックアップの復元、oplogの適用
    [mongod@mongo local]$ ls
    oplog.rs.bson  oplog.rs.metadata.json
    [mongod@mongo local]$ cp oplog.rs.bson ../oplog.bson 
    [mongod@mongo local]$ cd ../
    [mongod@mongo backup]$ rm -fr local
    [mongod@mongo backup]$ mongorestore --port 28017  --oplogReplay --oplogLimit "1570257582:1"  --drop   /mongodb/backup/

    6)バックアップデータの表示
    [mongod@mongo local]$ mongo --port 28017
    my_repl:PRIMARY> use world
    switched to db world
    my_repl:PRIMARY> show tables
    city
    city1
    city2
    my_repl:PRIMARY> db.city.findOne()
    { "_id" : ObjectId("5d983997fad4d5a54c3147a1"), "a" : 1 }