Восстановление дампа базы данных старой версии монго на новую версию монго

В настоящее время в моей системе работает более старая версия mongo, то есть 2.6. У меня уже есть мой сайт в работе и много клиентских данных. Я планирую перейти на mongo 3.2.

Итак, мой вопрос: работает ли mongorestore mongo v3.2 с дампом данных v2.6? Или, как известно, создает проблемы?

Любые ответы будут бесценны! Спасибо


person sp497    schedule 15.06.2016    source источник


Ответы (2)


Я задал этот тот же вопрос в официальном списке рассылки MongoDB. Они сказали не обновлять более одной основной версии за раз. (Основные версии: 2.2, 2.4, 2.6, 3.0, 3.2, 3.4)

Я не хотел следовать обычному процессу обновления установки каждой версии. Просто запустить mongod, а затем закрыть его. Мне кажется, что это оставит хлам позади, и мне нравится, когда моя инфраструктура написана по сценарию и контролируется версия. Итак, я решил запустить новые экземпляры EC2 с последней версией Ubuntu (поскольку мои серверы Mongo v2.4 также отставали на 2 версии LTS) и последней версией MongoDB. Я использовал образы докеров промежуточных версий MongoDB для обновления данных.

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

Основная часть решения такова:

# 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
person Bruno Bronosky    schedule 25.01.2017
comment
Меня всегда пугает, когда мой ответ получает плюсы и нет комментариев. Может ли мой код быть таким ясным? В конце концов, это Баш. - person Bruno Bronosky; 19.07.2017
comment
Комментарий только для спокойствия Бруно ;) Спасибо, Бруно! Вы спасли мой день (или два :)! Из коробки не вылетело, т.к. не получилось получить mongodump -h ‹host› удаленно, также пришлось монтировать новый отдельный 30GB EBS на амазоне из-за везения требуемого свободного места на /диске (и соответственно менять пути здесь и там). Также во время 1-го шага (когда вы выполняете mongorestore) возникла ошибка: вход в пространство имен [admin.system.users] утверждение: 17415 Невозможно восстановить пользователей со схемой версии 1 в систему с сервером версии 2.5.4 или выше, обходным путем было удаление Папка /data/db/dump/admin. - person Dmitry Shevkoplyas; 08.11.2017

Поскольку у вас есть данные из mongo 2.6, ограничение поля индекса уже выполнено. Mongo 3.2 без проблем восстановит эту резервную копию.

Другой способ обновить базу данных (если у вас есть набор реплик) — заменить одного члена 2.6 на 3.2 и дождаться синхронизации, а затем другого... Это обеспечит непрерывность бизнеса :-)

person profesor79    schedule 15.06.2016
comment
Да, я задал этот вопрос в официальном списке рассылки MongoDB, и мне сказали не обновлять более одной основной версии за раз. (Основные версии: 2.2, 2.4, 2.6, 3.0, 3.2, 3.4) groups.google.com/d/msg/mongodb-user/cbXeM283iHM/y0QbW1h4BQAJ - person Bruno Bronosky; 25.01.2017
comment
Просто добавлю пояснение для дальнейшего использования: в приведенной выше ссылке указано, что только смежные основные версии совместимы друг с другом для целей обновления, когда они являются частью одного и того же набора реплик. Тем не менее, он явно предлагает путь прямого восстановления дампа 2.4 в 3.2 с единственной оговоркой схемы аутентификации. Итак, чтобы ответить на исходный вопрос - это должно работать на практике. - person Shlomi Uziel; 24.05.2020