Co sprawdza audyt w firmie?

Tabele audytu: strażnicy danych w bazach PostgreSQL

29/03/2023

Rating: 4.53 (3658 votes)

W świecie baz danych, gdzie dane są sercem operacji, kluczowe staje się nie tylko ich przechowywanie, ale i monitorowanie zmian. W tym kontekście, tabele audytu wyłaniają się jako niezastąpione narzędzie, szczególnie w środowisku PostgreSQL. Choć często kojarzone z śledzeniem zmian dla celów audytorskich, ich rola wykracza daleko poza to tradycyjne zastosowanie. W artykule tym zgłębimy, czym są tabele audytu, jak działają i dlaczego są tak ważne dla stabilności i bezpieczeństwa systemów bazodanowych.

Jaka jest efektywność energetyczna systemu HVAC?
Czym jest efektywność energetyczna HVAC? Efektywność energetyczna w systemach HVAC polega na maksymalizacji wydajności jednostek grzewczych, wentylacyjnych i klimatyzacyjnych . Jej celem jest optymalizacja operacji w celu zmniejszenia zużycia energii bez uszczerbku dla jakości powietrza w pomieszczeniach, temperatury, wilgotności lub poziomu ciśnienia.
Spis treści

Czym jest tabela audytu?

Tabela audytu, w najprostszym ujęciu, to rejestr zmian zachodzących w innej tabeli, zwanej tabelą audytowaną. Działa niczym dziennik zdarzeń, precyzyjnie zapisując każdą modyfikację danych. Wyobraź sobie, że każda zmiana w tabeli głównej jest skrupulatnie kopiowana do tabeli audytu, wraz z informacjami o tym, kto, kiedy i jak dokonał tej zmiany. To swego rodzaju „czarna skrzynka” dla Twoich danych, umożliwiająca cofnięcie się w czasie i prześledzenie historii zmian.

Tradycyjnie, tabele audytu były wykorzystywane głównie do celów zgodności z przepisami i audytów. Pozwalały organizacjom udokumentować, że posiadają kontrolę nad danymi i są w stanie śledzić wszelkie manipulacje. Jednak, jak pokazuje przykład firmy Heap, ich zastosowanie w zakresie utrzymania stabilności i zapobiegania awariom jest równie, jeśli nie bardziej, istotne.

Praktyczne zastosowanie tabel audytu: przykład Heap

Firma Heap, specjalizująca się w analityce produktów, przetwarza miliardy zdarzeń dziennie. Ich infrastruktura opiera się na rozproszonym klastrze PostgreSQL. Kluczowym elementem tego klastra jest węzeł koordynujący, przechowujący metadane o lokalizacji danych na poszczególnych węzłach roboczych. Te metadane są kluczowe dla prawidłowego kierowania zapisów danych użytkowników i zdarzeń do odpowiednich węzłów.

W Heap, każda tabela `users` i odpowiadająca jej tabela `events` są umieszczone na tym samym węźle. To współlokalizacja jest kluczowa dla wydajności zapytań, które często łączą dane użytkowników i zdarzeń. Naruszenie tej zasady mogłoby skutkować poważnymi problemami z opóźnieniem ingestii danych, czyli czasem potrzebnym na przetworzenie i udostępnienie danych analitycznych użytkownikom. Heap dąży do utrzymania tego opóźnienia na poziomie zaledwie kilku minut.

Prawie doszło do awarii

Podczas migracji schematu tabeli zdarzeń, zespół Heap omal nie spowodował poważnego wzrostu opóźnienia ingestii. Proces migracji zakładał utworzenie nowych shardów (fragmentów tabeli) z nowym schematem, zaktualizowanie metadanych koordynatora i usunięcie starych shardów. Niestety, błąd w kodzie spowodował nieprawidłowe generowanie identyfikatorów nowych shardów. W wyniku tego, metadane koordynatora zostały niepoprawnie zaktualizowane, pomijając informacje o shardach zdarzeń dla jednego z węzłów roboczych.

Konsekwencją tego błędu był gwałtowny wzrost opóźnienia ingestii. Dzięki jednak tabelom audytu, inżynierowie Heap szybko zidentyfikowali problem i cofnęli nieprawidłowe zmiany w metadanych. Użycie tabeli audytu pozwoliło na szybkie przywrócenie usuniętych wpisów i uniknięcie poważnej awarii. Bez tabel audytu, naprawa sytuacji byłaby znacznie trudniejsza i czasochłonna, prawdopodobnie wymagając analizy logów, co jest procesem skomplikowanym i podatnym na błędy.

Jak utworzyć tabelę audytu w PostgreSQL?

Utworzenie tabeli audytu w PostgreSQL jest stosunkowo proste i można je zrealizować w kilku krokach:

  1. Stwórz tabelę audytu: Tabela audytu powinna zawierać kolumny odpowiadające kolumnom tabeli audytowanej, a także dodatkowe kolumny przechowujące informacje o zmianach, takie jak czas zmiany, użytkownik dokonujący zmiany i typ operacji (INSERT, UPDATE, DELETE).
  2. Zdefiniuj wyzwalacz (trigger): Wyzwalacz to funkcja, która automatycznie uruchamia się po wykonaniu określonej operacji na tabeli audytowanej (np. INSERT, UPDATE, DELETE). Wyzwalacz będzie odpowiedzialny za zapisywanie informacji o zmianach do tabeli audytu.
  3. Napisz procedurę wyzwalacza: Procedura wyzwalacza to kod SQL, który jest wykonywany przez wyzwalacz. Procedura ta pobiera informacje o zmianie (stare i nowe wartości wiersza, użytkownik, czas) i zapisuje je do tabeli audytu.
  4. Powiąż wyzwalacz z tabelą audytowaną: Na koniec, należy powiązać zdefiniowany wyzwalacz z tabelą, którą chcemy audytować.

Poniżej przedstawiono przykład tworzenia tabeli audytu dla tabeli `pg_dist_shard` z przykładu Heap:

Najpierw, tworzymy tabelę audytu `pg_dist_shard_audit`:

CREATE TABLE pg_dist_shard_audit ( audit_id SERIAL PRIMARY KEY, operation TEXT NOT NULL, ts TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), shardid BIGINT, shardname TEXT, groupid INTEGER, nodeoid OID, replication_factor SMALLINT, shardtype TEXT ); 

Następnie, definiujemy procedurę wyzwalacza `pg_dist_shard_audit_trigger`:

CREATE OR REPLACE FUNCTION pg_dist_shard_audit_trigger() RETURNS TRIGGER AS $$ BEGIN IF (TG_OP = 'DELETE') THEN INSERT INTO pg_dist_shard_audit (operation, shardid, shardname, groupid, nodeoid, replication_factor, shardtype) VALUES (TG_OP, OLD.shardid, OLD.shardname, OLD.groupid, OLD.nodeoid, OLD.replication_factor, OLD.shardtype); RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO pg_dist_shard_audit (operation, shardid, shardname, groupid, nodeoid, replication_factor, shardtype) VALUES (TG_OP, NEW.shardid, NEW.shardname, NEW.groupid, NEW.nodeoid, NEW.replication_factor, NEW.shardtype); RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO pg_dist_shard_audit (operation, shardid, shardname, groupid, nodeoid, replication_factor, shardtype) VALUES (TG_OP, NEW.shardid, NEW.shardname, NEW.groupid, NEW.nodeoid, NEW.replication_factor, NEW.shardtype); RETURN NEW; END IF; RETURN NULL; -- result is ignored since this is an AFTER trigger END; $$ LANGUAGE plpgsql; 

W tym kodzie wykorzystywane są specjalne zmienne, które są automatycznie definiowane dla wyzwalaczy:

  • TG_OP: Typ operacji wyzwalacza (np. 'INSERT', 'UPDATE', 'DELETE').
  • NEW: Rekord zawierający nowy wiersz dla operacji INSERT i UPDATE.
  • OLD: Rekord zawierający stary wiersz dla operacji UPDATE i DELETE.

Na koniec, powiązujemy wyzwalacz z tabelą `pg_dist_shard`:

CREATE TRIGGER pg_dist_shard_audit_trigger AFTER INSERT OR UPDATE OR DELETE ON pg_dist_shard FOR EACH ROW EXECUTE PROCEDURE pg_dist_shard_audit_trigger(); 

Podsumowanie

Tabele audytu to potężne narzędzie, które wykracza poza tradycyjne zastosowania w audycie i zgodności z przepisami. Jak pokazał przykład Heap, mogą one być kluczowe dla stabilności systemów bazodanowych i szybkiego reagowania na nieoczekiwane problemy. Dzięki tabelom audytu, cofnięcie niepożądanych zmian staje się znacznie prostsze i szybsze, minimalizując ryzyko poważnych awarii i przestojów.

Jeśli cenisz sobie bezpieczeństwo danych i możliwość szybkiego rozwiązywania problemów, rozważ implementację tabel audytu w swoich systemach PostgreSQL. Szczególnie warto zastosować je dla tabel zawierających kluczowe metadane i konfiguracje, gdzie nawet drobna nieprawidłowa zmiana może mieć poważne konsekwencje. Mimo pewnego narzutu związanego z dodatkowymi zapisami, korzyści płynące z tabel audytu w postaci zwiększonej stabilności i bezpieczeństwa danych mogą okazać się nieocenione.

Jeśli chcesz poznać inne artykuły podobne do Tabele audytu: strażnicy danych w bazach PostgreSQL, możesz odwiedzić kategorię Rachunkowość.

Go up