Serwer

Jak wykonać cykliczne kopie zapasowe bazy danych MongoDB?

Zarządzanie danymi: Efektywne strategie tworzenia kopii zapasowych MongoDB

Ostatnio zaktualizowany:

Jeżeli zarządzasz aplikacjami opartymi na bazie MongoDB, pewnie zauważyłeś, że wraz ze wzrostem ilości przechowywanych danych i ich coraz intensywniejszym użyciem, pojawia się potrzeba tworzenia kopii zapasowych. W tym artykule podzielę się moim doświadczeniem i wskazówkami, jak zautomatyzować proces tworzenia kopii zapasowych bazy MongoDB.

Moja konfiguracja i sposób działania

Korzystam z serwera dedykowanego, na którym zainstalowany jest pakiet MongoDB. Regularne zrzuty bazy danych generowane są za pomocą skryptu shell, a za ich cykliczne wywoływanie odpowiada crontab.

Po utworzeniu zrzutu, pliki są kompresowane. Następnie sprawdzana jest ich data i usuwane są te, które są starsze niż 60 dni. Dodatkowo, skrypt shell z wykorzystaniem aplikacji rclone przesyła pliki z folderu na zewnętrzną lokalizację (Google Drive) raz w tygodniu. Po wykonaniu wszystkich tych działań, otrzymuję maila z informacją o przebiegu procesu tworzenia kopii.

Preferuję eksport do formatu JSON, ponieważ łatwiej jest później zaimportować taką bazę poprzez MongoDB Compass, a także jest to format bardziej przejrzysty niż cały zrzut w formacie BSON.

Jak to zrobić: Przykładowy skrypt i przydatne komendy

W oficjalnej dokumentacji MongoDB znajdziesz wiele przydatnych komend, które pozwalają na tworzenie zrzutów bazy do odpowiednich plików. Te komendy możesz zaimplementować w swoich aplikacjach (NodeJS, PHP). Pamiętaj, aby odblokować port wychodzący 27017, jeśli chcesz połączyć się z bazą znajdującą się na innym serwerze.

  • Mongoexport (dostępny od wersji MongoDB 3.6+) [dokumentacja]

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

Z wykorzystaniem powyższych komend możesz pobrać zrzut bazy danych. Mongodump wykonuje zrzut w formacie BSON i umożliwia automatyczną kompresję. Z kolei Mongoexport pozwala na eksport kolekcji do pliku JSON. Niestety ta funkcja została wprowadzona dopiero od wersji 3.6.

Przykładowy skrypt Shell

#!/bin/bash

# Connection to the database, select collection with -c parameter, file format with --type, and output directory (-o)

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

# Compress the collection to zip - in my case, the whole folder with all dumped .json collections is compressed

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

# After compression, json files are no longer needed, so I delete them

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

# Mongodump - another way to dump a database, has the --archive parameter, which allows for automatic backup of the file

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

# If the compressed files in the 'kopia' folder are older than 60 days (mtime parameter), they are found and then deleted

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 posiadasz odpowiednią konfigurację serwerową, każde wywołanie skryptu spowoduje wysłanie wiadomości na adres e-mail z informacją o przebiegu procesu.

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

Custom Sidebar

You can set categories/tags/taxonomies to use the global sidebar, a specific existing sidebar or create a brand new one.