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、具体的なパラメータ説明
4.1.2、応用例
テストデータの作成:
1)単一テーブルをjson形式にバックアップする
操作手順:
2)単一テーブルをcsv形式にバックアップする
操作手順:
4.2、インポートツールmongoimport
Mongodbのmongoimportツールでは、特定のフォーマットファイルの内容を指定したcollectionにインポートできます.このツールはJSON形式のデータをインポートすることも、CSV形式のデータをインポートすることもできます.
4.2.1、具体的なパラメータの説明
4.2.2、応用例
1)json形式テーブルデータをlog 1に復元する
操作手順:
2)csv形式のファイルをlog 2に復元する
CSV形式ファイルの内容をインポートするには、--typeパラメータでインポート形式を指定する必要があります.
①csv形式のファイルヘッダ行にカラム名がある場合
②csv形式のファイルヘッダ行にカラム名がない場合=>手動でカラム名を追加
3)ケース:mysqlテーブルmongodbインポート
例:mysqlのworldデータベースの下cityテーブルをエクスポートしmongodbにインポート
4)mysqlテーブルmongodbスクリプトの一括インポート
五、mongodump/mongorestoreツール
5.1、紹介
mongodumpでは、Mongodbの実行時にバックアップできます.実行中のMongodbをクエリーし、検出されたすべてのドキュメントをディスクに書き込むのが原理です.しかし、問題がある場合にmongodumpを使用して生成されるバックアップは、必ずしもデータベースのリアルタイムスナップショットではありません.バックアップ時にデータベースに書き込みを行った場合、バックアップされたファイルがMongodbのリアルタイムデータと完全に等しくない可能性があります.また、バックアップ時に他のクライアントのパフォーマンスに悪影響を及ぼす可能性があります.
5.2、mongodumpの使い方
5.3、mongodumpとmongorestore基本使用
5.3.1、全ライブラリバックアップ
5.3.2、worldライブラリのバックアップ
5.3.3、バックアップworldライブラリ下のcity集合
5.3.4、圧縮バックアップ
5.3.5、worldライブラリを回復する
5.3.6、worldライブラリ下のcity集合を回復する
5.3.7、--dropは回復時に前の集合dropを落とす(危険)
六、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の表示
oplogウィンドウの上書き予定時間を表示するには、次の手順に従います.
6.3、oplog応用
ホット・スペアを実現し、バックアップ時に--oplogオプションを使用
1)テストデータの準備
2)oplogとmongodumpを組み合わせてホットスペアを実現
3)回復
4)表示
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)模擬故障環境
2)シミュレーション10点誤削除テーブルcity
3)既存のoplogをバックアップする.rsテーブル
4)元のデータベースにログインし、oplogをdropより前の場所に切り取る
5)バックアップの復元、oplogの適用
6)バックアップデータの表示
(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
四、mongoexport/mongoimportツール
4.1、エクスポートツールmongoexport
Mongodbのmongoexportツールでは、collectionをJSON形式(デフォルト)またはCSV形式のファイルにエクスポートできます.
パラメータでエクスポートされたデータ項目を指定したり、指定した条件に基づいてデータをエクスポートしたりできます.次のシーンに適しています.
$ 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 }