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).
- Mongoexport (wersja 3.6+ MongoDB) [dokumentacja]
mongoexport --uri="mongodb://mongodb0.example.com:27017/reporting" --collection=events --out=events.json [additional options]
- Mongodump [dokumentacja]
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.