Jak wykonać cykliczne kopie zapasowe bazy danych MongoDB?

 w Poradniki,

Posiadam kilka aplikacji opartych na bazie mongoDB, która przechowuje dużą ilość danych, niestety wraz z powiększaniem się bazy i coraz większym jej użyciem przez osoby zewnętrzne zmuszony byłem szukać rozwiązania jak wykonać kopie zapasowe bazy mongoDB. A dzisiaj się z wami tym podzielę 🙂

Na wstępie, moja konfiguracja i sposób działania. Wykorzystuje serwer dedykowany, który ma zainstalowany pakiet mongodb. Następnie, skryptem shell generuje w określonym czasie zrzut bazy danych, za wywołanie cykliczne skryptu odpowiada crontab.

Po pobraniu zrzutu, pliki są kompresowane, sprawdzana jest ich data i kasowane są, starsze niż 60 dni. Inny skrypt shell, wykorzystujący aplikacje rclone wysyła pliki z folderu na lokalizację zewnętrzną (Google Drive) raz w tygodniu. Po wszystkich tych działaniach otrzymuje maila z informacja o przebiegu tworzenia kopii

Preferuje eksport do JSON ponieważ łatwiej jest później zaimportować taką bazę poprzez MongoDB Compass i jest bardziej przejrzysta niż cały zrzut w formacie BSON

Poniższe komendy znajdują się w oficjalnej dokumentacji bazy danych i pozwalają na zrzucenie do odpowiednich plików  – można je zaimplementować w różnych aplikacjach (NodeJS, PHP).

💡 Jeżeli wybierzesz taki sposób, to odblokuj port wychodzący 27017 bo inaczej nie połączy Cię z bazą znajdującą się na innym serwerze.

mongoexport --uri="mongodb://mongodb0.example.com:27017/reporting"  --collection=events  --out=events.json [additional options]

mongodump --uri="mongodb+srv://..."  --gzip  --archive=... --db=test --excludeCollection=users --excludeCollection=salaries

Wykorzystując powyższe komendy możesz pobrać zrzut bazy danych. Mongodump wykonuje zrzut w formacie BSON i automatyczną kompresje. Mongoexport pozwala na eksport kolekcji do pliku JSON, niestety ta komenda została wprowadzona dopiero od wersji 3.6

Gotowy skrypt Shell

#!/bin/bash

#Połączenie się z bazą danych, wybiera kolekcje parametrem c i format pliku --type, oraz to gdzie je zapisać (-o)

mongoexport --uri="mongodb+srv://..." -c kolekcja --type=json -o /home/.../kopia/zrzutkolekcja_$(date +%Y-%m-%d).json

#kompresuje kolekcje do zipa - w moim wypadku kompresuje cały folder z wszystkimi zrzuconymi kolekcjami .json

zip /home/.../kopia/kopia_$(date +%Y-%m-%d).zip /home/.../kopia/zrzutkolekcja_*

#po wykonaniu kompresji, pliki json nie są już potrzebne, więc je kasuje

rm -f /home/.../kopia/zrzutkolekcja*

#mongodump - inny sposób na wykonanie zrzutu bazy danych, posiada parametr --archive, który umożliwia automatyczną kopie pliku

mongodump --uri="mongodb+srv://..."  --gzip  --archive=/home/.../kopia/kopiabson_$(date +%Y-%m-%d).gz

#jeżeli pliki spakowane w folderze kopia są starsze niż 60 dni (parametr mtime), następuje ich wyszukanie, a następnie skasowane.

find /home/.../kopia/ -name "*.gz" -type f -mtime +60 -exec rm -f {} \;

find /home/.../kopia/ -name "*.zip" -type f -mtime +60 -exec rm -f {} \;

Jeżeli posiadacie odpowiednią konfigurację serwerową, każde wywołanie skryptu, spowoduje wysłanie wiadomości na adres e-mail z jej przebiegiem.

mongodb database copy mail notification

Wiadomość e-mail potwierdzająca wykonanie kopii zapasowej bazy danych w MongoDB

Zostaw komentarz