MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Restauration du vidage de la base de données d'une ancienne version de mongo vers une nouvelle version de mongo

J'ai posé cette question même question sur la liste de diffusion officielle de MongoDB . Ils ont dit de ne pas mettre à jour plus d'une version majeure à la fois. (Les versions principales étant :2.2, 2.4, 2.6, 3.0, 3.2, 3.4)

Je ne voulais pas suivre le processus de mise à niveau normal d'installation de chaque version Juste pour lancer mongod puis l'arrêter. J'ai l'impression que cela laisserait du cru derrière moi et j'aime que la construction de mon infrastructure soit scénarisée et contrôlée en version. J'ai donc décidé de lancer de nouvelles instances EC2 avec le dernier Ubuntu (puisque mes serveurs Mongo v2.4 avaient également 2 versions LTS de retard) et le dernier MongoDB. J'ai utilisé des images docker de versions intermédiaires de MongoDB pour effectuer les mises à jour des données.

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

Le gros de la solution est ceci :

# 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