MongoDB 資料備份與恢復
阿新 • • 發佈:2020-08-20
MongoDB 備份與恢復資料
備份恢復工具
1.mongoexport/mongoimport # 資料分析時使用
2.mongodump/mongorestore # 單純備份時使用
匯出工具 mongoexport
# 備份成 json 格式 [mongo@redis03 ~]$ mongoexport --port 27017 -d database -c table -o ~/table.json [mongo@redis03 ~]$ mongoexport -uadmin -p123456 --port 27017 --authenticationDatabase admin -d database -c table -o ~/table.json # 備份成 csv 格式 [mongo@redis03 ~]$ mongoexport --port 27017 -d database -c table --type=csv -f name,age -o ~/table.csv [mongo@redis03 ~]$ mongoexport -uadmin -p123456 --port 27017 --authenticationDatabase admin -d database -c table --type=csv -f name,age -o ~/table.csv -h:指明資料庫宿主機的IP -u:指明資料庫的使用者名稱 -p:指明資料庫的密碼 -d:指明資料庫的名字 -c:指明集合的名字 -f:指明要匯出那些列 -o:指明到要匯出的檔名 -q:指明匯出資料的過濾條件
恢復工具 mongoimport
# 刪除集合 > use database switched to db database > show tables table > db.table.drop() true # 恢復資料 [mongo@redis03 ~]$ mongoimport --port 27017 -d database -c table ~/table.json [mongo@redis03 ~]$ mongoimport --port 27017 -d database -c table --type=csv --headerline --file ~/table.csv -h:指明資料庫宿主機的IP -u:指明資料庫的使用者名稱 -p:指明資料庫的密碼 -d:指明資料庫的名字 -c:指明集合的名字 -f:指明要匯入那些列
生產案例:MySQL 資料遷移至 MongoDB
配置 MySQL 資料庫
# 開啟安全路徑
[root@redis04 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
# 為了使用 outfile 命令選項
secure-file-priv=/tmp
# 重啟資料庫
[root@redis04 ~]# systemctl restart mysql
匯出 csv 格式檔案
mysql> select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
檢視生成檔案
[root@redis04 ~]# cat /tmp/city1.csv
手動處理檔案
# 將資料庫欄位加到檔案的第一行
[root@redis04 ~]# vim /tmp/city1.csv
ID,Name,CountryCode,District,Population
1,Kabul,AFG,Kabol,1780000
2,Qandahar,AFG,Qandahar,237500
匯入 MongoDB
[root@redis04 ~]# scp /tmp/city1.csv 172.16.1.121:/tmp/
[mongo@redis03 ~]$ mongoimport -uadmin -p123456 --port 27017 --authenticationDatabase admin -d world -c city --type=csv --headerline --file /tmp/city1.csv
驗證資料
[mongo@redis03 ~]$ mongo -uadmin -p123456 --authenticationDatabase admin
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
read 0.000GB
world 0.000GB
write 0.000GB
> use world
switched to db world
> show tables
city
> db.city.find()
......
> it
生產案例:資料誤刪除恢復
模擬故障過程
每天凌晨 1 點進行全備
10 點進行誤操作,刪除了資料
恢復資料
模擬全備資料
# 連線副本集的主庫(只有在副本集模式才能使用 mongodump)
[mongo@redis03 ~]$ mongo localhost:28018
dba:PRIMARY> use backup
dba:PRIMARY> db.backuptable.insertMany([{id:1},{id:2},{id:3}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5ecfe698e99e372e2e4fe1fd"),
ObjectId("5ecfe698e99e372e2e4fe1fe"),
ObjectId("5ecfe698e99e372e2e4fe1ff")
]
}
dba:PRIMARY> db.backuptable.find()
{ "_id" : ObjectId("5ecfe698e99e372e2e4fe1fd"), "id" : 1 }
{ "_id" : ObjectId("5ecfe698e99e372e2e4fe1fe"), "id" : 2 }
{ "_id" : ObjectId("5ecfe698e99e372e2e4fe1ff"), "id" : 3 }
執行全備
[mongo@redis03 ~]$ mongodump --port 28018 --oplog -o /data
[mongo@redis03 ~]$ ll /data/oplog.bson
-rw-rw-r-- 1 mongo mongo 110 May 29 02:01 /data/oplog.bson
模擬增量資料
[mongo@redis03 ~]$ mongo 10.0.0.121:28018
dba:PRIMARY> use backup
switched to db backup
dba:PRIMARY> db.backuptable.insertMany([{id:4},{id:5},{id:6}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5ecfe86f5c1085fcf692a3cb"),
ObjectId("5ecfe86f5c1085fcf692a3cc"),
ObjectId("5ecfe86f5c1085fcf692a3cd")
]
}
刪除資料
dba:PRIMARY> use backup
switched to db backup
dba:PRIMARY> db.backuptable.drop()
true
dba:PRIMARY> show tables
Oplog 日誌(類似 MySQL binlog)
Oplog 是 local 庫下的一個固定集合,從庫就是通過檢視主庫的 oplog 這個集合來進行復制的。每個節點都有 oplog,記錄這從主節點複製過來的資訊,這樣每個成員都可以保證切換主庫時的資料同步
查詢刪除動作的時間點
# 連線mongodb
[mongo@redis03 ~]$ mongo 10.0.0.121:28018
# 切換到local庫
dba:PRIMARY> use local
# 檢視oplog資訊
dba:PRIMARY> db.oplog.rs.find()
dba:PRIMARY> db.oplog.rs.find().pretty()
{
# 同步的時間點,選舉時會選擇最新的時間戳提升為主庫
"ts" : Timestamp(1590640219, 1),
"t" : NumberLong(1),
"h" : NumberLong("-8962736529514397515"),
"v" : 2,
# 操作型別 i代表insert u代表update d代表delete n代表沒有操作只是保持連線傳送訊息
"op" : "n",
# 當前資料庫的庫、表
"ns" : "",
"wall" : ISODate("2020-05-28T04:30:19.080Z"),
# 操作的內容
"o" : {
"msg" : "periodic noop"
}
}
# oplog 資訊
dba:PRIMARY> rs.printReplicationInfo()
configured oplog size: 1024MB # oplog檔案大小
log length start to end: 1543secs (0.43hrs) # oplog日誌的啟用時間段
oplog first event time: Wed May 27 2020 23:26:46 GMT+0800 (CST) # 第一個事務日誌的產生時間
oplog last event time: Wed May 27 2020 23:52:29 GMT+0800 (CST) # 最後一個事務日誌的產生時間
now: Wed May 27 2020 23:52:38 GMT+0800 (CST) # 現在的時間
# 查詢到刪除的時間點
dba:PRIMARY> db.oplog.rs.find({ns:"backup.$cmd"}).pretty()
{
"ts" : Timestamp(1590683811, 1),
"t" : NumberLong(2),
"h" : NumberLong("3968458855036608631"),
"v" : 2,
"op" : "c",
"ns" : "backup.$cmd",
"ui" : UUID("bec471f5-cd2a-44fe-8056-4c5c2de5de03"),
"wall" : ISODate("2020-05-28T16:36:51.227Z"),
"o" : {
"drop" : "backuptable"
}
}
1590690412
備份最新的 Oplog
[mongo@redis03 ~]$ mongodump --port 28018 -d local -c oplog.rs -o /data/
[mongo@redis03 ~]$ ll /data/local/
total 140
-rw-rw-r-- 1 mongo mongo 1380121 May 29 00:56 oplog.rs.bson
-rw-rw-r-- 1 mongo mongo 125 May 29 00:56 oplog.rs.metadata.json
把最新的 Oplog 替換全備的 Oplog
[mongo@redis03 ~]$ mv /data/local/oplog.rs.bson /data/oplog.bson
恢復資料
[mongo@redis03 data]$ rm -rf /data/local
[mongo@redis03 data]$ mongorestore --port 28018 --oplogReplay --oplogLimit "1590690412:1" --drop /data/
檢視資料
[mongo@redis03 ~]$ mongo localhost:28018
dba:PRIMARY> show databases
dba:PRIMARY> use backup
switched to db backup
dba:PRIMARY> show tables;
dba:PRIMARY> db.backuptable.find()
MongoDB 升級
# 1.首先確保是副本集狀態
# 2.先關閉1個副本節點
# 3.檢測資料是否可以升級
# 4.升級副本節點的可執行檔案
# 5.更新配置檔案
# 6.啟動升級後的副本節點
# 7.確保叢集工作正常
# 8.滾動升級其他副本節點
# 9.最後主節點降級
# 10.確保叢集 可用
# 11.關閉降級的老的主節點
# 12.升級老的主節點
# 13.重新加入叢集