MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wiederherstellen des Datenbank-Dumps einer älteren Mongo-Version in einer neuen Mongo-Version

Ich habe dies gefragt dieselbe Frage auf der offiziellen MongoDB-Mailingliste . Sie sagten, nicht mehr als eine Hauptversion gleichzeitig zu aktualisieren. (Hauptversionen sind:2.2, 2.4, 2.6, 3.0, 3.2, 3.4)

Ich wollte nicht dem normalen Upgrade-Prozess folgen, bei dem jede Version installiert wird, nur um Mongod zu starten und dann herunterzufahren. Das fühlt sich für mich so an, als würde es Cruft hinter sich lassen, und ich möchte, dass meine Infrastruktur geskriptet und versioniert wird. Also habe ich mich entschieden, neue EC2-Instances mit dem neuesten Ubuntu (da meine Mongo v2.4-Server auch 2 LTS-Versionen hinter sich hatten) und der neuesten MongoDB zu starten. Ich habe Docker-Images von Zwischenversionen von MongoDB verwendet, um die Daten-Upgrades durchzuführen.

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

Der Großteil der Lösung ist dies:

# 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