MongoDB-備份和恢復


一、工具介紹

(1)mongoexport/mongoimport   #導入/導出的是JSON格式或者CSV格式

(2)mongodump/mongorestore    #導入/導出的是BSON格式

二、備份工具區別

(1)JSON可讀性強但體積較大,BSON則是二進制文件,體積小但對人類幾乎沒有可讀性。

(2)在一些mongodb版本之間,BSON格式可能會隨版本不同而有所不同,所以不同版本之間用mongodump/mongorestore可能不會成功,具體要看版本之間的兼容性。當無法使用BSON進行跨版本的數據遷移的時候,使用JSON格式即mongoexport/mongoimport是一個可選項。跨版本的mongodump/mongorestore個人並不推薦,實在要做請先檢查文檔看兩個版本是否兼容(大部分時候是的)。

(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>  number of insert operations to run concurrently                                                  (defaults to 1)
//並行

4.2.2、應用例子

1)恢復json格式表數據到log1

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格式的文件到log2

導入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是一個定容集合(capped collection),它的默認大小是磁盤空間的5%(可以通過--oplogSizeMB參數修改),位於local庫的db.oplog.rs

2)其中記錄的是整個mongod實例一段時間內數據庫的所有變更(插入/更新/刪除)操作。

3)當空間用完時新記錄自動覆蓋最老的記錄。 #最好按全備的一個周期來設置

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、背景

每天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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM