web-dev-qa-db-ja.com

MongoDB-Mongorestoreが期待どおりに機能しない

とても良い一日、

以下のようなmongodbにスーパーユーザー権限を持つユーザーがいます(show usersコマンドを使用してロール設定を確認しました)

{
    "_id" : "admin.mongoadmin",
    "user" : "mongoadmin",
    "db" : "admin",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "admin"
        },
        {
            "role" : "root",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

mongorestoreを使用してoplogを復元しようとすると、エラーが発生します。

失敗:復元エラー:oplogの適用エラー:applyOps:管理者によるコマンドの実行は許可されていません {applyOps:[{ts:Timestamp(1552828309、1)、h:4632811839329880092、v:2、op: " c "、ns:" admin。$ cmd "、o:{create:" system.keys "、idIndex:{v:2、key:{_id:1}、name:" id "、ns:" admin.system.keys "}}、o2:{}}]、$ db:" admin "}

mongorestore -u admin -p password --authenticationDatabase=admin --oplogFile 0000000000_0_oplog.bson  --oplogReplay --oplogLimit=1552828432 --dir='/oplog/temp'
2019-03-17T13:47:36.945+0000    preparing collections to restore from
2019-03-17T13:47:36.945+0000    replaying oplog
2019-03-17T13:47:36.962+0000    Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { applyOps: [ { ts: Timestamp(1552828309, 1), h: 4632811839329880092, v: 2, op: "c", ns: "admin.$cmd", o: { create: "system.keys", idIndex: { v: 2, key: { _id: 1 }, name: "_id_", ns: "admin.system.keys" } }, o2: {} } ], $db: "admin" }

[〜#〜] note [〜#〜]:bsondumpから取得した最後の値でoploglimit(--oplogLimit = 1552828432)を指定しましたこれは正しいですか?または、何か不足していますか?

(すなわち)

{"ts":{"$timestamp":{"t":1552828432,"i":79}},"t":{"$numberLong":"1"},"h":{"$numberLong":"-2072015676601300967"},"v":2,"op":"i","ns":"inventory.hari","ui":{"$binary":"avdlGH8AS1eBPXRytlO1Yg==","$type":"04"},"wall":{"$date":"2019-03-17T13:13:52.139Z"},"o":{"_id":"79","name":"Hari","role":"Developer","isEmployee":true}}
{"ts":{"$timestamp":{"t":1552828432,"i":80}},"t":{"$numberLong":"1"},"h":{"$numberLong":"-6279494628130059002"},"v":2,"op":"u","ns":"inventory.hari","ui":{"$binary":"avdlGH8AS1eBPXRytlO1Yg==","$type":"04"},"o2":{"_id":"79"},"wall":{"$date":"2019-03-17T13:13:52.139Z"},"o":{"_id":"79","name":"WD_Userjava.util.Random@9a7504c","role":"Developer","isEmployee":true}}

編集:

以下のように復元しました

mongorestore -u mongoadmin -p password --authenticationDatabase admin -d itsm_inventory -c hari 0000000000_0_oplog.bson

成功したようです

このように挿入しました

{ "_id" : "0", "name" : "WD_Userjava.util.Random@2bbf4b8b", "role" : "Developer", "isEmployee" : true }
{ "_id" : "1", "name" : "WD_Userjava.util.Random@7a765367", "role" : "Developer", "isEmployee" : true }

以下のように復元されます

{ "_id" : ObjectId("5c91eac58fe872c878289d83"), "ts" : Timestamp(1552888901, 2), "t" : NumberLong(1), "h" : NumberLong("-3584326290393879639"), "v" : 2, "op" : "i", "ns" : "itsm_inventory.hari", "ui" : UUID("b5f574f1-c55a-4a5b-8729-4483f56f5c9d"), "wall" : ISODate("2019-03-18T06:01:41.062Z"), "o" : { "_id" : "1", "name" : "WD_Userjava.util.Random@7a765367", "role" : "Developer", "isEmployee" : true } }
{ "_id" : ObjectId("5c91eac58fe872c878289d84"), "ts" : Timestamp(1552888901, 3), "t" : NumberLong(1), "h" : NumberLong("-3618415120025822301"), "v" : 2, "op" : "i", "ns" : "itsm_inventory.hari", "ui" : UUID("b5f574f1-c55a-4a5b-8729-4483f56f5c9d"), "wall" : ISODate("2019-03-18T06:01:41.062Z"), "o" : { "_id" : "2", "name" : "WD_Userjava.util.Random@76b0bfab", "role" : "Developer", "isEmployee" : true } }

マニの回答編集:

mongorestore -u mongoadmin -p password --authenticationDatabase=admin --oplogFile 0000000000_0_oplog.bson  --oplogReplay --oplogLimit=1553063755 --dir='/oplog/temp'
2019-03-21T10:46:42.435+0000    preparing collections to restore from
2019-03-21T10:46:42.435+0000    replaying oplog
2019-03-21T10:46:42.457+0000    Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { applyOps: [ { ts: Timestamp(1552888562, 3), h: -8964353497436574374, v: 2, op: "c", ns: "admin.$cmd", o: { create: "system.keys", idIndex: { v: 2, key: { _id: 1 }, name: "_id_", ns: "admin.system.keys" } }, o2: {} } ], $db: "admin" }

どんな助けでもありがたいです。前もって感謝します。

2
Harry

MongoDB jiraブログ ここmongorestore--oplogによると、mongodump操作中に取得されたoplogエントリは適用されず、mongorestoreを使用しようとするとエラーで終了します復元の役割と、アクセス制御を使用するMongoDBデプロイメントを使用します。詳細については、 restore role のドキュメントを参照してください。

それは2.6.103.04のようなMongoDBバージョンに影響するためです。このようなエラーを回避するには、MongoDBを現在のバージョンに更新する必要があります。復元ロールは、applyOpsコマンドへのアクセスをユーザーに提供しません。mongorestoreは--oplogReplayオプションで使用します。

[〜#〜]回避策[〜#〜]

mongorestore--oplogReplayオプションを使用してデータを復元するには、ユーザーは ロールを作成するanyAction を許可する anyResource を付与できます。このロールを他のユーザーに割り当てないでください。この役割は、システムへの完全な無制限のアクセスを提供します。

あるいは、ユーザーは、インストール中に--authオプションなしでmongodインスタンスを開始し、復元の完了後に--authを再度有効にすることで、データの復元中に認証を無効にすることができます。

OPとの会話後(ハリー)&編集

MongoDBで「.bson」ファイルを復元する方法

C:\Program Files\MongoDB\Server\4.0\bin>mongorestore -d test -c oplog C:\data\oplog.bson
2019-03-20T10:06:35.981+0300    checking for collection data in C:\data\oplog.bson
2019-03-20T10:06:35.985+0300    restoring test.oplog from C:\data\oplog.bson
2019-03-20T10:06:37.058+0300    no indexes to restore
2019-03-20T10:06:37.058+0300    finished restoring test.oplog (10138 documents)
2019-03-20T10:06:37.059+0300    done

上記のmongorestoreコマンドでは、testはデータベース名&oplogです。コレクション名です。 C:\data\oplog.bson.bsonファイルパスの場所です。

さらにあなたの参照 ここ

1

アップロードした oplogファイル に基づいて、最小タイムスタンプは1552888560、最大タイムスタンプは1553063754です。ただし、質問で述べた--oplogLimit=1552828432は、タイムスタンプの最小値よりも小さい制限内にありません。そのため、どのドキュメントも復元されませんでした。

0000000000_0_oplog.bsonファイルが存在するフォルダーから次のコマンドを実行します。

mongorestore -u admin -p password --authenticationDatabase=admin --oplogFile 0000000000_0_oplog.bson  --oplogReplay --oplogLimit=1553063755 --dir='/oplog/temp'

また、.bsonフォルダに/oplog/tempファイルが存在しないことを確認してください。

1
Mani