Mongorestore to a different database

MongodbMongorestore

Mongodb Problem Overview


In MongoDB, is it possible to dump a database and restore the content to a different database? For example like this:

mongodump --db db1 --out dumpdir
mongorestore --db db2 --dir dumpdir

But it doesn't work. Here's the error message:

> building a list of collections to restore from dumpdir dir > > don't know what to do with subdirectory "dumpdir/db1", skipping... > > done

Mongodb Solutions


Solution 1 - Mongodb

You need to actually point at the "database name" container directory "within" the output directory from the previous dump:

mongorestore -d db2 dumpdir/db1

And usually just <path> is fine as a positional argument rather than with -dir which would only be needed when "out of position" i.e "in the middle of the arguments list".

p.s. For archive backup file (tested with mongorestore v3.4.10)

mongorestore --gzip --archive=${BACKUP_FILE_GZ} --nsFrom "${DB_NAME}.*" --nsTo "${DB_NAME_RESTORE}.*"

Solution 2 - Mongodb

mongodump --db=DB_NAME --out=/path-to-dump
mongorestore --nsFrom "DB_NAME.*" --nsTo "NEW_DB_NAME.*" /path-to-dump

Solution 3 - Mongodb

In addition to the answer of Blakes Seven, if your databases use authentication I got this to work using the --uri option, which requires a recent mongo version (>3.4.6):

mongodump --uri="mongodb://$sourceUser:$sourcePwd@$sourceHost/$sourceDb" --gzip --archive | mongorestore --uri="mongodb://$targetUser:$targetPwd@$targetHost/$targetDb" --nsFrom="$sourceDb.*" --nsTo="$targetDb.*" --gzip --archive

Solution 4 - Mongodb

Thank you! @Blakes Seven

Adding Docker notes: container names are interchangeable with container ID's

(assumes authenticated, assumes named container=my_db and new_db)

dump:

docker exec -it my_db bash -c "mongodump --uri mongodb://db:password@localhost:27017/my_db --archive --gzip | cat > /tmp/backup.gz"

copy to workstation:

docker cp my_db:/tmp/backup.gz c:\backups\backup.gz

copy into new container(form backups folder):

docker cp .\backup.gz new_db:/tmp

restore from container tmp folder:

docker exec -it new_db bash -c "mongorestore --uri mongodb://db:password@localhost:27017/new_db --nsFrom 'my_db.*' --nsTo 'new_db.*' --gzip --archive=/tmp/backup.gz"

Solution 5 - Mongodb

You can restore DB with another name. The syntax is:

mongorestore --port 27017 -u="username" -p="password" 
    --nsFrom "dbname.*" 
    --nsTo "new_dbname.*" 
    --authenticationDatabase admin /backup_path 

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCykerView Question on Stackoverflow
Solution 1 - MongodbBlakes SevenView Answer on Stackoverflow
Solution 2 - MongodbMostafa NazariView Answer on Stackoverflow
Solution 3 - Mongodbuser1587520View Answer on Stackoverflow
Solution 4 - MongodbGregView Answer on Stackoverflow
Solution 5 - MongodbManvendra SinghView Answer on Stackoverflow