Як забекапити та відновити базу даних MongoDB з Docker-контейнера

як забекапити базу даних MongoDB

MongoDB – цікавий інструмент. З ним надзвичайно просто створювати та змінювати записи, які в основному являють собою чисту досконалість JSON, іноді зіставлене з інструментами або командами, які змушують нас добре замислитися та поміркувати. 

Рекомендуємо вам ознайомитися із коротким посібником із резервного копіювання та відновлення бази даних MongoDB, який включає всі колекції. На жаль, цей процес не такий елегантний як із PostgreSQL або MariaDB, але, сподіваємося вам не потрібно буде робити це дуже часто. 

Створити дамп бази даних

Можна використовувати наступну команду для створення дампу всієї вашої бази даних, включаючи всі колекції. На відміну від більшості інших рішень для баз даних, дамп буде являти собою набір окремих файлів, тому у цьому випадку не можна із легкістю покладатися на конвеєрну обробку оболонки, щоб отримати це десь безпосередньо на вашому хост-комп’ютері докера. Замість цього ми просто вивантажимо файли кудись у контейнер докера, а потім витягнемо docker cp їх.

❯ docker exec -i <container_name> /usr/bin/mongodump –username <username> –password <password> –authenticationDatabase admin –db <database_name> –out /dump

Тепер, коли ми маємо файли дампу бази даних, нам потрібен спосіб витягти їх з контейнера докерів. Скопіюємо файли з контейнера:

❯ docker cp <container_name>:/dump ~/Downloads/dump

Ось і все, ми нарешті отримали наші файли. Тепер ми можемо зробити протилежне у нашому новому контейнері. Зробимо це далі.

Відновлення

Тепер, коли у нас є готові файли дампу бази даних, давайте продовжимо та імпортуємо (або відновимо) їх. Будь то свіжий і новий контейнер або ви відновлюєте резервну копію, процес буде аналогічним.

Переконайтеся, що спочатку створили користувача

Перш ніж продовжити, необхідно переконатися, що у нас є готовий обліковий запис користувача бази даних з доступом для читання та запису до бази даних, яку ви хочете відновити. Якщо у вас його ще немає, його можна створити наступним чином.

Ви можете запустити наступну команду у вибраному вами клієнті mongodb (cli), щоб створити нового користувача. Після запуску цієї команди з’явиться запрошення, в якому потрібно вказати пароль користувача.

use admin

db.createUser({

    user: “username”,

pwd: passwordPrompt(),

roles:[{role: “readWrite” , db:”<database_name>”}]})

Навіщо “використовувати адміністратора”

Справа в тому, що за замовчуванням, коли ви намагаєтеся підключитися до сервера MongoDB, він очікує, що admin це база даних, в якій існує користувач, навіть якщо у вказаного користувача немає дозволів на доступ до цієї бази даних.

Звичайно, існують способи змінити цю поведінку, але це виходить за межі цієї статті. Оскільки ви вказуєте ролі користувачів, які вказують, до якої бази даних користувач має фактичний доступ, навіть якщо користувач може існувати в admin базі даних, насправді він не має жодних дозволів, щоб щось там робити.

Трохи спантеличує, але, схоже, так влаштований Монго. Продовжимо.

Скопіюйте файли дампу в контейнер

Як і раніше, ми повинні спочатку зробити файли дампу бази даних доступними у контейнері Docker.

❯ docker cp ~/Downloads/dump <container_name>:/dump

Відновлення

Тепер, коли файли дампу доступні в контейнері, виконайте наведену нижче команду, щоб усе було імпортовано.

❯ docker exec -i <container_name> /usr/bin/mongorestore –username <username> –password <password> –authenticationDatabase admin –db <database_name> /dump/<database_name>

Примітка. При mongodump створенні дампу бази даних всі файли поміщаються в підкаталог з ім’ям бази даних. Саме тому у наведеному вище прикладі шлях вказує на /dump/<database_name>. Ви можете залишити це, якщо у вас є інша структура папок.

Завершення та останні штрихи 

Якщо ви хочете видалити файли дампу з будь-якого док-контейнера після імпорту, ви можете відкрити сеанс оболонки в док-контейнері наступним чином:

❯ docker exec -it <container_name> /bin/bash

Тепер можна видалити ці файли, запустивши щось на зразок rm -rf /dump.

От і все! Хоча це не такий простий процес, як з деякими іншими рішеннями для баз даних, на щастя, це завдання по силах виконати навіть недосвідченому інженеру. 

Переклад статті

Отримайте перший практичний досвід роботи з базами даних та Docker на онлайн-курсі DevOps Junior! 86% чистої практики під керівництвом практикуючого ІТ-спеціаліста!

Интересная статья. Поделись с друзьями!

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *