sql >> Databasteknik >  >> NoSQL >> MongoDB

Återställer databasdumpen för en äldre version av mongo till en ny version av mongo

Jag frågade detta samma fråga på den officiella MongoDB-sändlistan . De sa att man inte skulle uppgradera mer än en större version åt gången. (Större versioner är:2.2, 2.4, 2.6, 3.0, 3.2, 3.4)

Jag ville inte följa den normala uppgraderingsprocessen att installera alla versioner Bara för att starta mongod och sedan stänga av den. Det känns för mig som att det skulle lämna cruft bakom mig och jag gillar att ha min infrastrukturbyggnad skriptad och versionskontrollerad. Så jag bestämde mig för att lansera nya EC2-instanser med den senaste Ubuntu (eftersom mina Mongo v2.4-servrar också låg två LTS-versioner efter) och den senaste MongoDB. Jag använde docker-avbildningar av mellanversioner av MongoDB för att göra datauppgraderingarna.

https://gist.github.com/RichardBronosky/2d04c7c2e9a5bea67cd9760a35415a3f#file-uat_mongodb_upgrade_from_prod -sh

Huvuddelen av lösningen är denna:

# mongo.conf is using the default dbPath: /var/lib/mongodb
# this path is for temporary use by the mongo docker container
mkdir -p /data/db/dump
# see: https://hub.docker.com/_/mongo/ (search for /data/db)
# see: https://github.com/docker-library/mongo/blob/30d09dbd6343d3cbd1bbea2d6afde49f5d9a9295/3.4/Dockerfile#L59
cd /data/db
mongodump -h prodmongo.int

# Get major versions from https://hub.docker.com/r/library/mongo/tags/
step=0
for major_version in 2.6.12 3.0.14 3.2.11 3.4.1; do
    sudo docker stop some-mongo || true
    sudo docker rm   some-mongo || true
    sudo docker run --name some-mongo -v /data/db:/data/db -d mongo:$major_version
    false; while [[ $? > 0 ]]; do
        sleep 0.5
        sudo docker exec -it some-mongo mongo --eval 'printjson((new Mongo()).getDBNames())'
    done
    if (( $step == 0 )); then
        sudo docker exec -it some-mongo mongorestore /data/db/dump
    fi
    ((step += 1))
done

# Finish up with docker
sudo rm -rf /data/db/dump/*
sudo docker exec -it some-mongo bash -c 'cd /data/db; mongodump'
sudo docker stop some-mongo
sudo docker rm   some-mongo

# Load upgraded data into latest version of MongoDB (WiredTiger storage engine will be used)
mongorestore /data/db/dump
sudo rm -rf /data


  1. Mongoose befolka inbäddad

  2. Finns det några fördelar med att använda ett anpassat _id för dokument i MongoDB?

  3. Hur kan jag bläddra i eller fråga efter live MongoDB-data?

  4. MongoDB infoga dokument eller inkrementfält om det finns i array