CodeGym /Kursy /SQL SELF /Automatyzacja backupów z pg_cron i c...

Automatyzacja backupów z pg_cron i cron w Linuxie

SQL SELF
Poziom 44, Lekcja 0
Dostępny

Automatyzacja backupów to jak automatyczne mycie zębów, tylko dla twojej bazy danych. Regularny proces robienia kopii zapasowych ratuje świat (czyli twoje dane) przed katastrofą. Nikt nie chce dostać o 3 w nocy wiadomości, że serwer padł, uświadamiając sobie, że ostatni backup był dwa tygodnie temu. Automatyzacja rozwiązuje ten problem: koniec z ryzykiem utraty danych przez czynnik ludzki.

Narzędzi do automatyzacji jest sporo, ale dziś pogadamy o dwóch najpopularniejszych:

  1. cron — uniwersalny i dobrze znany planer zadań w Linuxie.
  2. pg_cron — rozszerzenie PostgreSQL, które pozwala odpalać zadania bezpośrednio przez sam serwer bazy danych.

Rozszerzenie pg_cron pod spodem korzysta z serwisu cron. Ten serwis jest dostępny tylko na Linuxie!

No to lecimy!

Instalacja pg_cron

pg_cron to rozszerzenie PostgreSQL, które pozwala ustawiać automatyczne zadania prosto w bazie. To wygodne, eleganckie i podnosi twój PostgreSQL do poziomu mini centrum operacyjnego.

Kroki instalacji:

  1. Upewnij się, że używasz PostgreSQL 10+, bo pg_cron działa tylko na nowszych wersjach.
  2. Zainstaluj rozszerzenie przez menedżera pakietów twojego systemu. Dla Ubuntu na przykład:

    sudo apt install postgresql-<version>-cron
    

    Zamień <version> na wersję PostgreSQL, którą masz zainstalowaną.

  3. Włącz rozszerzenie w konfiguracji PostgreSQL. Otwórz plik postgresql.conf i dodaj:

    shared_preload_libraries = 'pg_cron'
    

    Po co to? pg_cron wymaga, żeby biblioteka ładowała się przy starcie PostgreSQL — to konieczne.

  4. Zrestartuj serwer PostgreSQL:

    sudo systemctl restart postgresql
    
  5. Aktywuj rozszerzenie w swojej bazie danych:

    CREATE EXTENSION pg_cron;
    

Na tym etapie pg_cron jest gotowy do działania!

Tworzenie zadania do automatycznego backupu

Największy bajer pg_cron to możliwość odpalania komend o określonej godzinie. Zróbmy zadanie do automatycznego odpalenia pg_dump.

Przykład:

SELECT cron.schedule(
    'nocny_backup', -- nazwa zadania
    '0 2 * * *', -- harmonogram (każdej nocy o 2)
    $$pg_dump -U username -F c -f /backups/university_backup.dump university$$ -- komenda
);

Rozkładamy magię na czynniki pierwsze:

  • 'nocny_backup' — to własna nazwa zadania, żebyś łatwo je rozpoznał.
  • '0 2 * * *' — harmonogram w formacie cron: codziennie o 2:00.
  • Komenda w $$ $$: odpalamy pg_dump żeby zrobić backup bazy university.

Po utworzeniu zadania będzie się ono wykonywać zgodnie z harmonogramem!

Podgląd i usuwanie zadań pg_cron

Żeby zobaczyć wszystkie istniejące zadania:

SELECT * FROM cron.job;

Jeśli jakieś zadanie już nie jest potrzebne, możesz je usunąć tak:

SELECT cron.unschedule(job_id);

Zamień job_id na identyfikator zadania z powyższego zapytania.

Używanie cron do automatyzacji

Jeśli wolisz klasyczne linuxowe podejście do automatyzacji albo pg_cron z jakiegoś powodu nie jest dostępny, pomoże ci wszechmocny cron.

Tworzenie zadania przez cron

Najpierw upewnij się, że cron jest zainstalowany i działa:

sudo systemctl enable cron
sudo systemctl start cron

Teraz dodaj zadanie do robienia backupu. Otwórz edytor do ustawiania zadań cron:

crontab -e

Dodaj linię:

0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university

Ta magiczna linijka zrobi to:

  • O 2 w nocy każdego dnia (0 2 * * *) zrobi backup bazy university.
  • Wszystkie backupy będą zapisane do pliku /backups/university_backup.dump.

Po zapisaniu pliku crontab zaplanowane zadanie zacznie się wykonywać.

Logi z cron

Czasem warto wiedzieć, co poszło nie tak. Upewnij się, że wyjście komend jest zapisywane do pliku logów do analizy. Dodaj do komendy przekierowanie wyjścia:

0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university >> /var/log/backup.log 2>&1

Teraz wszystko, co się wydarzy podczas zadania, będzie zapisane do pliku /var/log/backup.log.

Porównanie pg_cron i cron

No dobra, mamy dwa mocne narzędzia. Jak wybrać odpowiednie?

  • pg_cron to świetny wybór, jeśli chcesz ustawiać harmonogram i zarządzać zadaniami bezpośrednio przez PostgreSQL. To wygodne, nie musisz wychodzić z bazy i łatwo skalować zadania.

  • cron jest bardziej uniwersalny. Możesz go używać nie tylko do PostgreSQL, ale też do automatyzacji innych rzeczy.

Cecha pg_cron cron
Łatwość integracji Wbudowany w PostgreSQL, ale wymaga rozszerzenia Działa dla wszystkich procesów
Instalacja Wymaga instalacji rozszerzenia Wbudowany w większość systemów Linux
Logi Przechowywane w PostgreSQL (tabela cron.job_run_details) Zapisywane do logów systemowych (zwykle /var/log/syslog)
Elastyczność Wykonuje tylko SQL w PostgreSQL Może odpalać dowolne komendy, skrypty i binarki

Sprawdzanie działania zadań

Żeby sprawdzić, czy backup działa, możesz odpalić komendę cron ręcznie:

pg_dump -U username -F c -f /backups/university_backup.dump university

Warto też sprawdzić, czy pliki backupów są w podanym katalogu, ich rozmiar i czas ostatniego utworzenia. Na przykład:

ls -lh /backups/

Regularnie sprawdzaj logi i upewnij się, że zadania działają poprawnie.

Prosta ochrona przed typowymi błędami

Błąd nr 1: "Zapomniałem ustawić uprawnienia!"

Jeśli użytkownik, pod którym działa cron, nie ma uprawnień do odpalenia pg_dump, zadania nie będą działać. Upewnij się, że użytkownik ma dostęp do bazy.

Błąd nr 2: "Plik poszedł nie tam!"

Zawsze podawaj pełną ścieżkę do plików i komend. cron nie zna twojego środowiska — pełna ścieżka to podstawa: pg_dump -> /usr/bin/pg_dump.

Błąd nr 3: "Gdzie są moje logi?"

Nie zapominaj przekierować wyjścia komendy do pliku logów. Bez tego nie dowiesz się, co poszło nie tak.

Na tym etapie jesteś gotowy na automatyczne backupy swojej bazy danych. Teraz, nawet jeśli serwer nagle pójdzie na urlop, twoje dane będą bezpieczne!

2
Zadanie
SQL SELF, poziom 44, lekcja 0
Niedostępne
Automatyczne tworzenie backupów za pomocą `pg_cron`
Automatyczne tworzenie backupów za pomocą `pg_cron`
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION