3 Einführung in PostgreSQL

PostgreSQL, oft einfach “Postgres” genannt, ist ein leistungsstarkes, freies und objektrelationales Datenbanksystem (ORDBMS). Seit seiner ersten Veröffentlichung in den 1980er Jahren hat es sich zu einer der beliebtesten und vertrauenswürdigsten Open-Source-Datenbanklösungen weltweit entwickelt.

3.0.1 Geschichte von PostgreSQL

PostgreSQL stammt aus dem POSTGRES-Projekt der University of California in Berkeley. Dieses Projekt, das in den 1980er Jahren von Michael Stonebraker, einem Pionier der Datenbanktechnologie, ins Leben gerufen wurde, legte den Grundstein für viele der fortschrittlichen Funktionen, die PostgreSQL heute bietet.

3.0.2 Hauptmerkmale

  1. Erweiterbarkeit: Benutzer können eigene Datentypen, Funktionen, Operatoren und Aggregatfunktionen definieren.
  2. Unterstützung für SQL und JSON: Postgres unterstützt sowohl relationale (SQL) als auch nicht-relationale (JSON) Datenformate, was es zu einer flexiblen Lösung für unterschiedliche Anwendungsfälle macht.
  3. Konformität mit ACID: Das System garantiert die Einhaltung der ACID-Prinzipien (Atomicity, Consistency, Isolation, Durability), wodurch sichergestellt wird, dass Transaktionen zuverlässig verarbeitet werden.
  4. Erweiterte Abfrageoptimierung: Der Abfrageplaner von Postgres ist hoch entwickelt und ermöglicht komplexe Abfragen mit hervorragender Performance.
  5. Eingebaute Replikation: Postgres unterstützt Master-Slave- und Multi-Master-Replikationen zur Verbesserung der Leseleistung und Hochverfügbarkeit.

3.0.3 Vorteile von PostgreSQL

3.0.4 Verwendung von PostgreSQL

PostgreSQL wird in einer Vielzahl von Anwendungen und Branchen eingesetzt, von kleinen Start-ups bis hin zu großen Unternehmen und Organisationen. Dank seiner Skalierbarkeit und Zuverlässigkeit ist es die ideale Wahl für Webanwendungen, Analysetools, geografische Informationssysteme und vieles mehr.

PostgreSQL bietet eine robuste, skalierbare und flexible Datenbanklösung, die für eine Vielzahl von Anwendungen geeignet ist. Mit seiner langen Geschichte, aktiven Community und kontinuierlichen Weiterentwicklung bleibt PostgreSQL eine der führenden Datenbanktechnologien auf dem Markt.

Wenn Sie in Betracht ziehen, eine Datenbank für Ihr nächstes Projekt auszuwählen oder einfach mehr über Datenbanktechnologie erfahren möchten, ist PostgreSQL sicherlich einen näheren Blick wert.

3.1 PostgreSQL-System-Architektur

3.1.1 Postmaster

3.1.2 Dienstprogrammprozesse

3.1.3 Speichersegmente von PostgreSQL

3.1.4 Gemeinsamer Puffer (Shared Buffer)

3.1.5 WAL-Puffer (Wal Buffer)

3.1.6 CLOG und andere Puffer

3.1.7 Physische Dateien

3.2 Postgres Prozessarchitektur

PostgreSQL folgt einer Multi-Prozess-Architektur. In dieser Architektur gibt es einen Hauptprozess und mehrere Kindprozesse, die jeweils unterschiedliche Rollen übernehmen.

3.2.1 Hauptprozess: Postmaster

Der Postmaster ist der übergeordnete Prozess, der beim Starten des PostgreSQL-Servers erzeugt wird. Seine Hauptaufgaben sind: - Verwaltung von Kindprozessen. - Akzeptieren von Client-Verbindungen und Starten neuer Backend-Prozesse zur Bedienung dieser Verbindungen. - Überwachen und Neustarten von abgestürzten Unterprozessen.

3.2.2 Backend-Prozesse (Kindprozesse)

Für jede Client-Verbindung wird ein separater Backend-Prozess erstellt. Dieser Prozess führt SQL-Abfragen aus und interagiert mit der Datenbank auf Anfrage des Clients.

3.2.3 Autovacuum-Prozesse

Diese Kindprozesse kümmern sich um die regelmäßige Wartung der Datenbank, indem sie verwaiste Zeilen bereinigen und die Statistiken für den Query-Planner aktualisieren.

3.2.4 WAL Writer

Ein Kindprozess, der sich darum kümmert, Daten aus dem Write-Ahead-Logging (WAL) Buffer in die WAL-Dateien auf der Festplatte zu schreiben.

3.2.5 Checkpoint-Prozess

Dieser Prozess erstellt regelmäßig Checkpoints in der Datenbank, um die Wiederherstellung nach einem Crash zu beschleunigen und das WAL zu reduzieren.

3.2.6 Background Writer

Dieser Prozess schreibt “dirty” Datenblöcke, die sich noch im Speicher befinden, auf die Festplatte zurück, um den Shared Buffer zu entlasten und die Verfügbarkeit von freiem Speicherplatz im Shared Buffer sicherzustellen.

3.2.7 Stats Collector

Dieser Prozess sammelt Statistiken über die Datenbankaktivität und speichert sie für die Abfrageoptimierung und die Überwachung.

3.2.8 Kommunikation zwischen Prozessen

Die Kommunikation zwischen dem Hauptprozess und den Kindprozessen erfolgt hauptsächlich über Inter-Prozess-Kommunikation (IPC) Mechanismen wie Shared Memory und Semaphoren. Backend-Prozesse verwenden in der Regel Sockets für die Kommunikation mit Clients.

3.2.9 Zusammenfassung

PostgreSQLs Multi-Prozess-Architektur gewährleistet eine robuste Datenintegrität und hohe Verfügbarkeit. Trotz der Vielzahl von Prozessen und ihrer unterschiedlichen Aufgaben ist das System so gestaltet, dass es auch bei Fehlern weiterhin stabil läuft und sich selbst heilen kann.

ps -o pid,ppid,command -ax | awk -v pid=$(pgrep postgres | head -1) '$2 == pid { print }'
    893     726 postgres: 13/main: checkpointer 
    894     726 postgres: 13/main: background writer 
    895     726 postgres: 13/main: walwriter 
    896     726 postgres: 13/main: autovacuum launcher 
    897     726 postgres: 13/main: stats collector 
    898     726 postgres: 13/main: logical replication launcher 
   2537     726 postgres: 13/main: postgres postgres [local] idle

3.3 System Requirements

Bevor Sie eine neue Version von PostgreSQL installieren, sollten Sie jedoch immer die offizielle Dokumentation oder die Release-Notizen auf der offiziellen PostgreSQL-Website konsultieren. Die genauen Anforderungen könnten sich je nach Version und spezifischen Features, die in späteren Versionen hinzugefügt wurden, durchaus ändern.

3.4 PostgreSQL unter Windows installieren

  1. Download:
  2. Installationsprogramm ausführen:
  3. Komponenten auswählen:
  4. Installationsverzeichnis:
  5. Datenverzeichnis auswählen:
  6. Passwort festlegen:
  7. Port festlegen:
  8. Lokalisierung:
  9. Installation:
  10. Stack Builder (optional):
  1. Abschluss:
  1. Erste Schritte:

3.4.1 Installationsverzeichnis

Beim Installieren von PostgreSQL unter Windows gibt es einige Punkte, die speziell in Bezug auf das Installationsverzeichnis beachtet werden sollten:

  1. Vermeiden von Leerzeichen im Pfad: Es wird empfohlen, PostgreSQL in einem Verzeichnis ohne Leerzeichen zu installieren. Während neuere Versionen von PostgreSQL mit Verzeichnisnamen mit Leerzeichen besser umgehen können, können sie in älteren Versionen oder bei bestimmten Tools zu Problemen führen.

  2. Begrenzte Pfadlänge: Windows hat eine maximale Pfadlänge von 260 Zeichen für ältere Versionen. Es ist wichtig, dass das Installationsverzeichnis nicht zu tief verschachtelt ist, um möglichen Pfadüberschreitungen zu vermeiden.

  3. Zugriffsrechte: Stellen Sie sicher, dass Sie über ausreichende Zugriffsrechte für das gewählte Verzeichnis verfügen und dass PostgreSQL im Betrieb auf seine Daten zugreifen kann.

  4. Plattenspeicher: Überprüfen Sie, ob auf dem Laufwerk, auf dem Sie PostgreSQL installieren möchten, ausreichend Speicherplatz vorhanden ist. Berücksichtigen Sie dabei nicht nur den Platz für die Installation, sondern auch für die Daten, die im Laufe der Zeit hinzugefügt werden.

  5. Backup und Wiederherstellung: Denken Sie an einen Ort, der einfach zu sichern und wiederherzustellen ist. Eine saubere Verzeichnisstruktur kann dabei helfen.

  6. Antivirus-Software: Einige Antivirus-Programme können mit Datenbankprozessen interagieren und zu Performance-Problemen führen. Es könnte sinnvoll sein, Ausnahmen für PostgreSQL-Prozesse oder Verzeichnisse in Ihrer Antivirus-Software zu setzen.

  7. Umgebungsvariablen: Es kann nützlich sein, den Pfad des PostgreSQL-bin-Verzeichnisses zur Windows-Umgebungsvariable PATH hinzuzufügen, damit Sie PostgreSQL-Befehle wie psql einfach von jeder Befehlszeile aus ausführen können.

Denken Sie immer daran, nach der Installation eine Testdatenbank zu erstellen und einige Grundfunktionen zu testen, um sicherzustellen, dass alles ordnungsgemäß funktioniert.

3.4.2 Datenverzeichnis

Das Datenverzeichnis (oft als “Data Directory” oder “PGDATA” bezeichnet) ist für den Betrieb von PostgreSQL von zentraler Bedeutung. Hier werden alle Ihre Tabellen, Indizes, Transaktionslogs und andere wichtige Systemdateien gespeichert. Bei der Auswahl und Konfiguration des Datenverzeichnisses für PostgreSQL unter Windows sollten Sie folgende Punkte beachten:

  1. Separates Laufwerk: Wenn möglich, sollten Sie PostgreSQL auf einem anderen physischen Laufwerk als dem Betriebssystem installieren. Dies kann die Performance verbessern und sorgt auch dafür, dass das Füllen des Datenverzeichnisses nicht das gesamte System beeinträchtigt.

  2. Backup und Wiederherstellung: Ein klar definiertes Datenverzeichnis erleichtert das Backup und die Wiederherstellung. Sie sollten regelmäßige Backups Ihres Datenverzeichnisses planen.

  3. Zugriffsrechte: Stellen Sie sicher, dass das Datenverzeichnis über die erforderlichen Zugriffsrechte verfügt, sodass der PostgreSQL-Serverprozess darauf zugreifen und Daten lesen/schreiben kann.

  4. Plattenspeicher: Das Datenverzeichnis kann schnell wachsen, insbesondere in einer aktiven Datenbankumgebung. Stellen Sie sicher, dass genügend Speicherplatz vorhanden ist und überwachen Sie den verfügbaren Speicher regelmäßig.

  5. Redundanz: Wenn es um Datenintegrität geht, sollten Sie darüber nachdenken, ob Sie eine RAID-Konfiguration oder ähnliche Technologien verwenden möchten, um die Redundanz zu erhöhen und die Gefahr von Datenverlust zu minimieren.

  6. Antivirus-Software: Wie bereits erwähnt, können Antivirus-Programme die Performance beeinträchtigen. Setzen Sie Ausnahmen für das Datenverzeichnis, um mögliche Konflikte oder Performance-Probleme zu vermeiden.

  7. Pfadlänge und Namenskonventionen: Ähnlich wie beim Installationsverzeichnis sollten Sie auch hier auf eine begrenzte Pfadlänge und das Vermeiden von Leerzeichen im Pfad achten.

  8. Verschlüsselung: Wenn Sie Bedenken hinsichtlich der Datensicherheit haben, sollten Sie die Optionen für die Verschlüsselung des Datenverzeichnisses in Betracht ziehen. PostgreSQL unterstützt die Verschlüsselung auf Dateiebene, sodass Ihre Daten geschützt sind, selbst wenn jemand physischen Zugriff auf das Laufwerk hat.

Die sorgfältige Planung und Konfiguration des Datenverzeichnisses ist entscheidend für die Performance, Sicherheit und Integrität Ihrer PostgreSQL-Installation. Es lohnt sich, hier von Anfang an gründlich zu sein.

3.5 PostgreSQL-Architektur

3.5.1 Postmaster

3.5.2 Dienstprogrammprozesse

3.5.3 Speichersegmente von PostgreSQL

3.5.4 Gemeinsamer Puffer (Shared Buffer)

3.5.5 WAL-Puffer (Wal Buffer)

3.5.6 CLOG und andere Puffer

3.5.7 Physische Dateien

3.6 Systemuser

In Linux-Systemen erstellt die PostgreSQL-Installation in der Regel einen speziellen Benutzer namens postgres, unter dem der PostgreSQL-Serverdienst läuft. Dies wird aus Sicherheitsgründen gemacht, um zu verhindern, dass ein potenzieller Angreifer, der die PostgreSQL-Software ausnutzt, Vollzugriff auf das gesamte System erhält.

Unter Windows hat PostgreSQL nicht genau denselben Mechanismus, aber es hat ähnliche Sicherheitsüberlegungen. Bei der Installation von PostgreSQL auf einem Windows-System wird normalerweise ein Windows-Dienst erstellt, der PostgreSQL ausführt. Dieser Dienst kann unter einem speziellen Windows-Benutzerkonto laufen, anstatt unter einem Konto mit Administratorrechten, um ähnliche Sicherheitsvorteile zu bieten.

Wenn Sie PostgreSQL auf Windows installieren, haben Sie die Möglichkeit, die Anmeldedaten für den Windows-Dienst anzugeben. Es wird empfohlen, ein Konto mit eingeschränkten Rechten zu verwenden, genau wie unter Linux.

Zusammenfassend: Während der spezifische Mechanismus unterschiedlich ist, berücksichtigen sowohl Linux- als auch Windows-Installationen von PostgreSQL Sicherheitsüberlegungen durch den Einsatz von Benutzerkonten mit eingeschränkten Rechten.

3.6.1 Active Directory

Wenn Sie ein neues Benutzerkonto im Active Directory (AD) unter Windows erstellen möchten, können Sie dies über die Active Directory Users and Computers (ADUC) Management-Konsole tun:

  1. ADUC starten:
  2. Navigieren Sie zum gewünschten Organisations-Container:
  3. Benutzer erstellen:
  4. Kennwort festlegen:
  5. Fertigstellen:
  6. Zusätzliche Konfiguration (optional):

3.6.2 Alternativen zum AD

Active Directory (AD) von Microsoft ist eine weit verbreitete Verzeichnisdienst-Implementierung, die viele Unternehmen für Identitäts- und Zugriffsmanagement verwenden. Es gibt jedoch auch andere Lösungen, die ähnliche Funktionen bieten. Einige der bekanntesten Alternativen zu Active Directory sind:

  1. OpenLDAP:
  2. FreeIPA:
  3. Samba 4:
  4. JumpCloud Directory-as-a-Service:
  5. Red Hat Directory Server (früher 389 Directory Server oder Fedora Directory Server):
  6. Zentyal:
  7. Apple Open Directory:
  8. Azure Active Directory:

Es gibt viele andere Produkte und Lösungen auf dem Markt, sowohl Open-Source- als auch kommerzielle. Die beste Wahl hängt von den spezifischen Anforderungen, der Infrastruktur und den vorhandenen Technologien der jeweiligen Organisation ab.

3.7 Benutzer und Rollen

In PostgreSQL werden sowohl Benutzer als auch Gruppen als “Rollen” bezeichnet. Dieses Konzept ermöglicht es Ihnen, Berechtigungen auf flexible Weise zu verwalten und zu vergeben. In diesem Artikel werden wir uns ansehen, wie man Rollen erstellt, ihnen Berechtigungen zuweist und wie sie verwendet werden können, um den Datenbankzugriff zu steuern.

3.7.1 1. Erstellen von Rollen

1.1 Benutzerrolle erstellen

Ein neuer Benutzer mit dem Namen neuerbenutzer kann mit dem folgenden Befehl erstellt werden:

CREATE ROLE neuerbenutzer WITH LOGIN PASSWORD 'passwort';

1.2 Gruppenrolle erstellen

Gruppen in PostgreSQL werden auch als Rollen ohne Anmeldemöglichkeit behandelt:

CREATE ROLE beispielgruppe;

3.7.2 2. Zugriffsrechte

Berechtigungen können auf Datenbanken, Schemata, Tabellen und sogar einzelnen Spalten vergeben werden.

2.1 Datenbankberechtigungen

Einem Benutzer die Berechtigung zum Lesen und Schreiben in einer Datenbank beispieldb geben:

GRANT ALL PRIVILEGES ON DATABASE beispieldb TO neuerbenutzer;

2.2 Tabellenberechtigungen

Einem Benutzer die Berechtigung geben, Daten in einer Tabelle beispieltabelle zu lesen:

GRANT SELECT ON beispieltabelle TO neuerbenutzer;

3.7.3 3. Rollen zu Gruppen hinzufügen

Benutzer können Gruppen zugeordnet werden, um die Verwaltung von Berechtigungen zu vereinfachen.

GRANT beispielgruppe TO neuerbenutzer;

Mit dieser Zuweisung erbt neuerbenutzer alle Berechtigungen der Gruppe beispielgruppe.

3.7.4 4. Rollenattribute

Es gibt verschiedene Attribute, die einer Rolle zugewiesen werden können:

Beispiel:

CREATE ROLE admin WITH LOGIN PASSWORD 'passwort' SUPERUSER CREATEDB;

3.7.5 5. Löschen von Rollen

Eine Rolle kann mit dem DROP ROLE-Befehl gelöscht werden:

DROP ROLE neuerbenutzer;

3.7.6 6. Rollenauflistung

In PostgreSQL können Sie die aktuellen Rollen (Benutzer und Gruppen) mit dem Befehl \du auflisten, wenn Sie sich im psql-Client befinden. Dies gibt eine Tabelle der Rollen zurück, einschließlich der verschiedenen Attribute, die jeder Rolle zugeordnet sind, wie SUPERUSER und CREATEDB.

\du

Wenn Sie die Liste der Rollen in SQL möchten, können Sie die pg_roles-Tabelle abfragen:

SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin 
FROM pg_roles;

Mit dieser Abfrage erhalten Sie eine klare Übersicht über alle Rollen in Ihrem System und deren wichtigsten Attribute.

3.7.7 TLDR

Rollen in PostgreSQL bieten eine leistungsstarke und flexible Möglichkeit, den Zugriff auf Datenbankressourcen zu verwalten. Durch sorgfältiges Planen und Implementieren einer klaren Rollen- und Berechtigungsstruktur können Sie sicherstellen, dass Ihre Daten sicher sind und nur von denjenigen Benutzern und Anwendungen zugegriffen wird, die die entsprechenden Berechtigungen haben. Es ist wichtig, regelmäßig die Rollen und Berechtigungen zu überprüfen und sicherzustellen, dass sie den Anforderungen Ihrer Organisation entsprechen.

3.8 Datenbank Cluster

3.8.1 Erstellen

Bevor Sie mit PostgreSQL arbeiten können, müssen Sie einen Speicherbereich für die Datenbank auf der Festplatte initialisieren, der als “Database Cluster” bezeichnet wird. Ein solcher Cluster ist eine Sammlung von Datenbanken, die von einer einzelnen Instanz eines laufenden Datenbankservers verwaltet wird. Standardmäßig enthält ein Cluster nach der Initialisierung eine Datenbank namens “postgres” und zwei weitere Datenbanken namens “template1” und “template0”, die als Vorlagen für neu erstellte Datenbanken dienen.

In Bezug auf das Dateisystem ist ein Database Cluster ein einziges Verzeichnis, in dem alle Daten gespeichert werden, auch “Data Directory” genannt. Dieses Verzeichnis muss vor der Verwendung initialisiert werden, was mit dem Programm “initdb” erreicht wird. Während der Initialisierung werden die Zugriffsrechte so festgelegt, dass nur der PostgreSQL-Benutzer (und optional seine Gruppe) darauf zugreifen kann. Dennoch sollte man zusätzliche Sicherheitsmaßnahmen wie Passwörter für den Datenbank-Superuser in Erwägung ziehen.

Der Befehl zur manuellen Initialisierung des Clusters sieht etwa so aus: initdb -D /usr/local/pgsql/data, wobei der Pfad das gewünschte Data Directory angibt. “initdb” konfiguriert auch Standardwerte wie die Spracheinstellung und die Zeichensatzkodierung des Clusters. Es ist wichtig, diese Einstellungen sorgfältig zu wählen, da sie langfristige Auswirkungen auf die Leistung und Funktionalität haben können.

3.8.2 Verwendung von sekundären Dateisystemen

Viele Installationen erstellen ihre Datenbank-Cluster auf Dateisystemen (Volumes) außerhalb des Haupt-“Root”-Volumes des Rechners. Wenn Sie sich dafür entscheiden, sollten Sie nicht versuchen, das oberste Verzeichnis des sekundären Volumes (den Einhängepunkt) als Datenverzeichnis zu verwenden. Es ist empfehlenswert, ein Unterverzeichnis im Einhängepunkt zu erstellen, das dem PostgreSQL-Benutzer gehört, und darin das Datenverzeichnis anzulegen. Dies vermeidet Berechtigungsprobleme, insbesondere bei Vorgängen wie “pg_upgrade”, und stellt sicher, dass bei einer Offline-Schaltung des sekundären Volumes klare Fehlermeldungen auftreten.

3.9 Struktur des Arbeitsverzeichnisses eines PostgreSQL-Clusters

Ein PostgreSQL-Cluster bezieht sich in diesem Kontext nicht auf einen Cluster aus mehreren Servern, sondern auf eine Sammlung von Datenbanken, die von einer PostgreSQL-Serverinstanz verwaltet werden. Das Arbeitsverzeichnis eines solchen Clusters, oft als Datenverzeichnis ($PGDATA) bezeichnet, enthält eine Reihe von Dateien und Unterverzeichnissen, die für den Betrieb von PostgreSQL notwendig sind.

3.9.1 Hauptkonfigurationsdateien

3.9.2 Wichtige Unterverzeichnisse

3.9.3 Andere wichtige Dateien

3.9.4 TLDR

Das Arbeitsverzeichnis eines PostgreSQL-Clusters ist der zentrale Speicherort für Daten, Konfigurationsdateien und Steuerungsdateien, die zur Verwaltung und zum Betrieb der Datenbank erforderlich sind. Ein gutes Verständnis dieser Struktur ermöglicht es Administratoren, die Datenbank effizienter zu verwalten und Probleme effektiv zu diagnostizieren.

3.10 Server starten

PostgreSQL kann auch auf Windows-Systemen laufen, und der Startvorgang ist etwas anders als unter Linux/Unix-Systemen

PostgreSQL-Server unter Windows starten:

  1. Installation: Wenn Sie PostgreSQL auf Windows installieren, wird in der Regel auch ein Windows-Dienst namens “postgresql-x.y” erstellt, wobei x.y die Version von PostgreSQL darstellt.

  2. Dienststeuerung: Sie können den PostgreSQL-Server als Dienst über die Windows-Diensteverwaltung starten und stoppen. Sie können dies über die Systemsteuerung tun oder durch Eingabe von services.msc in das Ausführen-Fenster (WIN + R) oder die Befehlszeile.

  3. Manueller Start/Stop mit pg_ctl: Alternativ können Sie den PostgreSQL-Server auch manuell über die Befehlszeile mit dem pg_ctl-Werkzeug starten und stoppen, das mit PostgreSQL geliefert wird. Es wird ähnlich wie unter Linux verwendet, aber Sie müssen das Windows-Befehlszeilenfenster (CMD oder PowerShell) verwenden.

    Beispiel:

    pg_ctl start -D "C:\path\to\data\directory" -l logfile.log
  4. Automatischer Start: Wenn Sie PostgreSQL als Dienst installiert haben, können Sie es so einstellen, dass es beim Hochfahren von Windows automatisch gestartet wird. Dies kann über die Eigenschaften des Dienstes in services.msc eingestellt werden.

  5. PID-Datei: Wie bei Linux wird auch unter Windows eine postmaster.pid-Datei im Datenverzeichnis erstellt, wenn der Server läuft.

  6. Sicherheitsüberlegungen: Es wird empfohlen, PostgreSQL mit einem dedizierten Windows-Benutzerkonto auszuführen, um die Sicherheit zu erhöhen. Dies kann auch über die Diensteverwaltung eingestellt werden.

Das sind die Grundlagen, wie Sie PostgreSQL auf einem Windows-System starten und verwalten können. Für detailliertere Informationen sollten Sie die offizielle PostgreSQL-Dokumentation oder speziell für Windows geschriebene Ressourcen konsultieren.

3.10.1 Troubleshooting

PostgreSQL auf Windows zu betreiben erfordert einige Unterschiede im Umgang mit Fehlern und Verbindungsproblemen im Vergleich zu einem Linux-System. Hier sind einige der häufigsten Unterschiede und Hinweise für die Fehlerbehandlung:

3.10.2 Server-Start-Fehler unter Windows

  1. Port-Bindungsprobleme: Wenn PostgreSQL meldet, dass es nicht an einen bestimmten Port binden kann (z. B. der Standardport 5432), könnte ein anderer Dienst diesen Port bereits verwenden. Sie können das netstat-Befehlszeilen-Tool verwenden, um zu überprüfen, welche Anwendungen Ports verwenden.

  2. Shared Memory und Semaphore-Probleme: Auf Windows werden interne Mechanismen anstelle von System V-IPC-Mechanismen verwendet. Dennoch können Sie aufgrund von Systemressourcenbeschränkungen immer noch Fehler in Bezug auf Shared Memory oder Semaphores sehen. Diese Einstellungen sind jedoch schwerer zu ändern als unter Linux und erfordern möglicherweise Änderungen in der Windows-Registry oder Systemkonfigurationen.

  3. Fehlende Berechtigungen: Der PostgreSQL-Server muss mit den entsprechenden Berechtigungen ausgeführt werden, um auf bestimmte Ressourcen zugreifen zu können. Stellen Sie sicher, dass der PostgreSQL-Dienst mit einem Konto mit den erforderlichen Berechtigungen ausgeführt wird.

3.10.3 Client-Verbindungsprobleme unter Windows

  1. TCP/IP-Verbindungen: Wie unter Linux müssen Sie sicherstellen, dass der PostgreSQL-Server so konfiguriert ist, dass er TCP/IP-Verbindungen zulässt, wenn Sie über diesen Mechanismus eine Verbindung herstellen möchten.

  2. Unix-Domain-Sockets: Dieses Konzept existiert unter Windows nicht. Stattdessen verwendet PostgreSQL Named Pipes für lokale Verbindungen. Wenn Sie Probleme mit lokalen Verbindungen haben, sollten Sie überprüfen, ob Named Pipes korrekt konfiguriert sind.

  3. Firewall-Probleme: Die Windows-Firewall oder andere Sicherheitssoftware kann den Port blockieren, auf dem PostgreSQL läuft. Sie müssen sicherstellen, dass Port 5432 (oder welcher Port auch immer für PostgreSQL konfiguriert ist) durch die Firewall zugelassen wird.

  4. Pfad zum Socket oder Named Pipe: Wenn Sie Fehlermeldungen erhalten, die besagen, dass die Verbindung zu einem bestimmten Socket oder Named Pipe fehlgeschlagen ist, überprüfen Sie die PostgreSQL-Konfiguration und den Pfad, den Ihr Client verwendet, um sicherzustellen, dass sie übereinstimmen.

Generell gilt, dass die Fehlerprotokollierung und -nachverfolgung auf Windows oft über das Windows-Ereignisprotokoll erfolgt, auf das Sie mit dem Windows-Ereignisanzeiger zugreifen können. Dort finden Sie oft detailliertere Fehlermeldungen und Informationen.

Für spezifische Probleme und deren Behebung empfiehlt es sich, die offizielle PostgreSQL-Dokumentation zu konsultieren oder in spezialisierten Foren nach Lösungen zu suchen.

3.10.4 netstat

In Windows ist das netstat-Tool verfügbar und wird oft verwendet, um Netzwerkverbindungen, offene Ports und den Status von Netzwerk-Interfaces zu überprüfen.

Wenn Sie überprüfen möchten, ob ein Prozess (wie PostgreSQL) einen bestimmten Port (z. B. 5432) verwendet, können Sie den folgenden Befehl verwenden:

netstat -an | grep "5432"

Hier ist eine kurze Erläuterung des Befehls:

Wenn Sie eine Ausgabe sehen, bedeutet dies, dass irgendein Prozess den Port 5432 verwendet. Wenn Sie nichts sehen, ist der Port wahrscheinlich nicht in Gebrauch.

Wenn Sie wissen möchten, welcher Prozess diesen Port verwendet, können Sie netstat mit der Option -o verwenden, um die Prozess-ID anzuzeigen, und dann das Windows-Tool tasklist verwenden, um den Prozessnamen zu identifizieren:

netstat -ano | grep "5432"

Suchen Sie nach der Ausgabe nach der Prozess-ID (es sollte die letzte Spalte in der Ausgabe sein). Dann nutzen Sie:

tasklist | grep "ProzessID"

Ersetzen Sie “ProzessID” durch die tatsächliche ID aus der netstat-Ausgabe. Dies gibt Ihnen den Namen des Prozesses, der den Port verwendet

3.10.5 Named Pipes

Named Pipes sind eine IPC (Interprozesskommunikation)-Methode, die es zwei oder mehr Prozessen auf demselben Computer ermöglicht, Daten auszutauschen. In Windows werden Named Pipes häufig für Netzwerkdienste und -anwendungen verwendet.

Um zu überprüfen, ob Named Pipes in Windows korrekt für PostgreSQL konfiguriert sind, führen Sie die folgenden Schritte aus:

  1. Überprüfen der PostgreSQL-Konfigurationsdatei: PostgreSQL verwendet in erster Linie die postgresql.conf-Datei für die meisten seiner Konfigurationen.

  2. Überprüfen Sie die pg_hba.conf Datei: PostgreSQL verwendet die pg_hba.conf-Datei, um den Verbindungszugriff zu steuern.

  3. Verwenden Sie netstat oder den Ressourcenmonitor: Überprüfen Sie, ob PostgreSQL tatsächlich auf dem erwarteten Port (standardmäßig 5432) lauscht. Das können Sie mit netstat -an | find "5432" oder über den Ressourcenmonitor von Windows tun.

  4. Verwenden von SQL-Tools: Versuchen Sie, eine Verbindung mit einem SQL-Client oder Tool wie psql herzustellen, um zu sehen, ob Sie erfolgreich eine Verbindung zum Server herstellen können.

  5. Überprüfen von Named Pipes mit Windows-Tools:

Bitte beachten Sie, dass PostgreSQL standardmäßig TCP/IP für die Kommunikation verwendet und nicht Named Pipes. Named Pipes werden häufiger mit Microsoft SQL Server assoziiert. Es wäre daher ungewöhnlich (aber nicht unmöglich), PostgreSQL mit Named Pipes zu sehen. Wenn Sie Named Pipes für PostgreSQL verwenden möchten, müssen Sie sicherstellen, dass sowohl die PostgreSQL-Installation als auch Ihre Anwendungen dieses Kommunikationsmittel unterstützen.

3.11 Resourcenverwaltung in Windows

In Windows sind die Mechanismen zur Ressourcenverwaltung und zur Interprozesskommunikation (IPC) anders als in Unix-basierten Systemen. Windows verwendet nicht die gleichen System V IPC-Mechanismen wie Unix-basierte Systeme. Stattdessen hat es eigene Mechanismen und APIs für IPC und Ressourcenverwaltung.

Für PostgreSQL unter Windows:

  1. Shared Memory: PostgreSQL verwendet die Windows-eigenen Mechanismen für den gemeinsamen Speicher. Es gibt keine direkte Äquivalenz zu den SHM*-Einstellungen von System V in Windows. Windows verwaltet automatisch die Größe und Anzahl der gemeinsam genutzten Speichersegmente, sodass Administratoren in der Regel keine manuellen Anpassungen vornehmen müssen.

  2. Semaphores: Wie beim gemeinsamen Speicher gibt es in Windows keine direkten Entsprechungen zu den SEM*-Einstellungen von System V in Unix-Systemen. Stattdessen verwendet PostgreSQL die Windows-APIs für Semaphore-Objekte. Diese sind ebenfalls automatisiert und erfordern normalerweise keine manuelle Intervention.

  3. Ressourcen-Limits: Windows verfügt über verschiedene Mechanismen zur Steuerung und Überwachung von Systemressourcen, darunter die Gruppenrichtlinienverwaltung und die Windows-Registrierung. Diese können verwendet werden, um Aspekte der Systemleistung und Ressourcenverwendung zu steuern, sind jedoch nicht direkt mit den System V IPC-Parametern in Unix-basierten Systemen vergleichbar.

  4. Optimierung für PostgreSQL: Es gibt einige PostgreSQL-spezifische Einstellungen in der postgresql.conf-Datei, die angepasst werden können, um die Leistung auf einem Windows-System zu optimieren, einschließlich Einstellungen für Arbeitsspeicher, Verbindungen und Schreib-Cache.

Wenn Sie spezifische Probleme mit PostgreSQL unter Windows haben, sollten Sie die Fehlerprotokolle und die Windows-Ereignisanzeige überprüfen, um Informationen zu erhalten, die Ihnen bei der Diagnose und Behebung des Problems helfen können.

Kurz gesagt, während Unix-basierte Systeme detaillierte Konfigurationsmöglichkeiten für IPC-Ressourcen bieten, handhabt Windows diese Dinge in der Regel automatisch und transparent. Es gibt weniger “Knöpfe” zum Drehen in Bezug auf IPC-Ressourcen in Windows, aber es ist wichtig, sich mit den PostgreSQL-spezifischen Einstellungen und Windows-Systemwerkzeugen vertraut zu machen, um die bestmögliche Leistung zu erzielen.

3.12 Server stoppen

Das korrekte Stoppen eines PostgreSQL-Servers in Windows kann auf verschiedene Weisen durchgeführt werden:

  1. Verwenden des pg_ctl-Dienstprogramms: Das pg_ctl-Dienstprogramm ist ein Befehlszeilentool, das mit PostgreSQL geliefert wird und zum Starten, Stoppen und Neustarten des PostgreSQL-Servers verwendet werden kann.

    Um den Server zu stoppen:

    pg_ctl stop -D [Datenverzeichnis]

    Dabei steht [Datenverzeichnis] für den Pfad zu Ihrem PostgreSQL-Datenverzeichnis.

  2. Windows-Dienste: Wenn PostgreSQL als Windows-Dienst installiert wurde, können Sie den Dienst über die Windows-Dienstverwaltung oder die Befehlszeile stoppen.

  3. pgAdmin: Wenn Sie pgAdmin (das offizielle PostgreSQL-Verwaltungstool) verwenden, können Sie den Server auch hierüber stoppen. In der Regel können Sie dies tun, indem Sie mit der rechten Maustaste auf den Server in der Serverliste klicken und “Server beenden” oder ein ähnliches Menüelement auswählen.

Unabhängig von der Methode, die Sie zum Stoppen des Servers verwenden, ist es wichtig sicherzustellen, dass alle aktiven Verbindungen zum Datenbankserver beendet wurden und dass keine Datenbanktransaktionen im Gange sind, um Datenverlust oder Datenkorruption zu vermeiden.

3.13 Verhindern von Server-Spoofing

Während der Server läuft, ist es nicht möglich, dass ein schädlicher Prozess den Platz des normalen Datenbankservers einnimmt. Wenn der Server jedoch heruntergefahren ist, kann ein lokaler Benutzer den normalen Server spoofen, indem er seinen eigenen Server startet. Der Spoof-Server könnte Passwörter und von Clients gesendete Abfragen lesen, könnte jedoch keine Daten zurückgeben, da das PGDATA-Verzeichnis aufgrund von Verzeichnisberechtigungen weiterhin sicher wäre. Spoofing ist möglich, da jeder Benutzer einen Datenbankserver starten kann; ein Client kann einen ungültigen Server nicht identifizieren, es sei denn, er ist speziell konfiguriert.

Eine Möglichkeit, das Spoofing lokaler Verbindungen zu verhindern, besteht darin, ein Windows-Named-Pipe-Verzeichnis zu verwenden, das nur Schreibberechtigung für einen vertrauenswürdigen lokalen Benutzer hat. Dies verhindert, dass ein böswilliger Benutzer in diesem Verzeichnis seine eigene Pipe-Datei erstellt.

Eine weitere Option für lokale Verbindungen besteht darin, dass Clients requirepeer verwenden, um den erforderlichen Besitzer des mit dem Socket verbundenen Serverprozesses anzugeben.

Um Spoofing bei TCP-Verbindungen zu verhindern, sollten Sie entweder SSL-Zertifikate verwenden und sicherstellen, dass Clients das Zertifikat des Servers überprüfen, oder GSSAPI-Verschlüsselung verwenden (oder beides, wenn sie über separate Verbindungen erfolgen).

Um Spoofing mit SSL zu verhindern, muss der Server so konfiguriert sein, dass nur hostssl-Verbindungen (Abschnitt 21.1) akzeptiert werden und über SSL-Schlüssel- und Zertifikatsdateien verfügen (Abschnitt 19.9). Der TCP-Client muss mit sslmode=verify-ca oder verify-full verbinden und die entsprechende Root-Zertifikatsdatei installiert haben (Abschnitt 34.19.1).

Um Spoofing mit GSSAPI zu verhindern, muss der Server so konfiguriert sein, dass nur hostgssenc-Verbindungen (Abschnitt 21.1) akzeptiert werden und diese mit GSS-Authentifizierung verwenden. Der TCP-Client muss mit gssencmode=require verbinden.

3.14 Backup

Für PostgreSQL gibt es mehrere Backup-Methoden, die je nach Anwendungsfall und Anforderungen an die Datenwiederherstellung unterschiedliche Vorteile bieten. Im Allgemeinen können diese Methoden in zwei Kategorien unterteilt werden: physische Backups und logische Backups.

3.14.1 1. Physische Backups

3.14.1.1 a. Dateisystem-Level Backup

3.14.1.2 b. Continuous Archiving (mit Write-Ahead-Logs - WALs)

3.14.2 2. Logische Backups

3.14.2.1 a. pg_dump

3.14.2.2 b. pg_dumpall

3.14.3 Ergänzende Tipps

Zusammenfassend bieten die Backup-Methoden von PostgreSQL flexible Möglichkeiten, Ihre Daten zu schützen und sich gegen Datenverlust oder Systemausfälle abzusichern. Es ist wichtig, eine Methode zu wählen, die Ihren Anforderungen entspricht, und regelmäßig Backups und Wiederherstellungstests durchzuführen.

3.15 WAL

“WAL” steht in verschiedenen Kontexten für unterschiedliche Begriffe, aber in der Welt der Datenbanken bezeichnet “WAL” das “Write-Ahead Logging”. Dies ist ein Protokoll, das sicherstellt, dass Änderungen an Daten zuerst in ein Log geschrieben werden, bevor sie tatsächlich in die Datenbank geschrieben werden.

Das Hauptziel von WAL ist es, die Datenintegrität und -beständigkeit sicherzustellen. Stellen Sie sich vor, Sie führen eine Transaktion in einer Datenbank aus und mitten in dieser Transaktion tritt ein Systemausfall auf. Wenn Sie kein WAL hätten, könnte der Status der Datenbank in einem unbestimmten Zustand sein, wodurch Daten verloren gehen oder beschädigt werden könnten. Mit WAL jedoch werden alle Änderungen zuerst in ein Log geschrieben. Nach einem Ausfall kann die Datenbank diesen Log verwenden, um die Datenbank wieder in einen konsistenten Zustand zu bringen.

Ein weiterer Vorteil von WAL ist, dass im Falle eines Systemausfalls nicht die gesamte Transaktionshistorie durchlaufen werden muss, sondern nur das Log, was den Recovery-Prozess beschleunigt.

Viele moderne Datenbanksysteme, einschließlich PostgreSQL, verwenden WAL, um Datenintegrität und -beständigkeit zu gewährleisten.

In PostgreSQL ermöglicht das Write-Ahead Logging (WAL) nicht nur die Wiederherstellung nach einem Systemausfall, sondern spielt auch eine zentrale Rolle bei der Replikation von Daten zwischen Servern. Hier ist, wie WAL bei der Replikation in PostgreSQL hilft:

  1. Streaming Replikation: Bei der Streaming Replikation sendet der Hauptserver (Master) WAL-Records in Echtzeit an den sekundären Server (Standby/Slave). Der Standby-Server wendet diese Logs dann an seine Datenbank an, um den gleichen Zustand wie der Master beizubehalten.

  2. Dateibasierte Replikation mit WAL Shipping: Hierbei werden WAL-Dateien in regelmäßigen Abständen vom Master zum Standby-Server übertragen. Der Standby wendet dann diese Dateien auf seine Datenbank an. Dies geschieht nicht in Echtzeit wie bei der Streaming Replikation, ist aber einfacher einzurichten und kann für einige Anwendungen ausreichend sein.

  3. WAL Archivierung: Wenn WAL-Dateien auf dem Master archiviert werden, können sie auf einem Standby-Server abgerufen und angewendet werden. Dies ist nützlich, um eine Datenbank an einem entfernten Standort oder in einer Cloud-Umgebung wiederherzustellen oder zu replizieren.

  4. Logische Replikation: PostgreSQL bietet auch eine logische Replikation an, die bestimmte Tabellen oder Datenbanken und nicht die gesamte Datenbank replizieren kann. Hierbei werden Änderungen in einem verständlichen Format, nicht im binären WAL-Format, repliziert. Obwohl dies nicht direkt das traditionelle WAL-System verwendet, ist es dennoch eine Form von Änderungsdatenprotokollierung, die auf WAL basiert.

Die Nutzung von WAL für Replikationszwecke hat mehrere Vorteile:

Insgesamt ermöglicht WAL in PostgreSQL eine robuste und flexible Replikationslösung, die sowohl für Hochverfügbarkeit als auch für Skalierbarkeit und Backup-Zwecke eingesetzt werden kann.

3.15.1 Dateien

In PostgreSQL werden die WAL-Dateien (Write-Ahead Logs) im Unterverzeichnis pg_wal (in Versionen vor PostgreSQL 10 hieß dieses Verzeichnis pg_xlog) innerhalb des Hauptdatenverzeichnisses der Datenbank (auch als “Datencluster” bezeichnet) gespeichert.

Um herauszufinden, wo sich das Hauptdatenverzeichnis Ihrer PostgreSQL-Installation befindet, können Sie die folgende SQL-Abfrage in Ihrer PostgreSQL-Datenbank ausführen:

SHOW data_directory;

Diese Abfrage gibt den Pfad zum Hauptdatenverzeichnis zurück. Innerhalb dieses Verzeichnisses sollten Sie dann das pg_wal (oder pg_xlog in älteren Versionen) Verzeichnis finden.

Einige wichtige Hinweise:

Wenn Sie spezifische Anweisungen oder Hilfe für Ihre spezielle PostgreSQL-Installation oder -Konfiguration benötigen, lassen Sie es mich wissen!

3.16 PITR

PITR steht für “Point-In-Time Recovery” und ist ein Feature in vielen modernen Datenbanksystemen, einschließlich PostgreSQL. Es ermöglicht es Administratoren, Daten auf einen bestimmten Zeitpunkt in der Vergangenheit wiederherzustellen. Dies ist besonders nützlich, um menschliche Fehler (z.B. versehentlich gelöschte Daten) zu korrigieren oder eine Datenbank nach einem Datenkorruptionsvorfall wiederherzustellen.

Die Grundidee hinter PITR in PostgreSQL ist die Kombination von Basis-Backups und Write-Ahead Logging (WAL). Hier ist, wie es funktioniert:

  1. Basis-Backup: Zunächst erstellen Sie ein Basis-Backup Ihrer Datenbank. Dies kann als Ausgangspunkt für jede spätere Wiederherstellung dienen.

  2. WAL-Archivierung: Nachdem Sie Ihr Basis-Backup erstellt haben, archivieren Sie kontinuierlich alle WAL-Dateien, die PostgreSQL erzeugt. Diese Dateien enthalten alle Änderungen, die in der Datenbank vorgenommen wurden.

  3. Wiederherstellung: Wenn Sie eine Wiederherstellung durchführen möchten, verwenden Sie Ihr Basis-Backup als Ausgangspunkt und wenden dann die archivierten WAL-Dateien in der Reihenfolge ihrer Erstellung an. Sie können dies bis zu einem bestimmten Zeitpunkt tun, daher der Name “Point-In-Time Recovery”. Dies bedeutet, dass Sie die Datenbank auf jeden Zeitpunkt zwischen der Erstellung des Basis-Backups und dem letzten archivierten WAL-Eintrag wiederherstellen können.

Um PITR in PostgreSQL zu nutzen, müssen Sie einige Einstellungen in Ihrer PostgreSQL-Konfiguration vornehmen:

  1. Sie müssen sicherstellen, dass die wal_level-Einstellung auf replica oder höher eingestellt ist.
  2. Sie müssen einen Prozess oder ein Skript einrichten, um die WAL-Dateien zu archivieren. Dies kann durch Einstellen der archive_mode auf on und Bereitstellen eines Befehls in archive_command geschehen, um die Dateien zu archivieren.
  3. Bei der Wiederherstellung geben Sie die Zeit an, zu der Sie die Datenbank wiederherstellen möchten, und PostgreSQL wird die WAL-Dateien bis zu diesem Zeitpunkt anwenden.

Es ist wichtig zu beachten, dass PITR sowohl technische als auch betriebliche Überlegungen erfordert. Es ist wichtig, sicherzustellen, dass Ihre WAL-Archivierung korrekt funktioniert und dass Sie regelmäßig Basis-Backups erstellen. Außerdem sollten Sie PITR in einer Testumgebung ausprobieren, bevor Sie es in einer Produktionsumgebung einsetzen, um sicherzustellen, dass Sie mit dem Prozess vertraut sind und er wie erwartet funktioniert.

3.16.1 Anwendung

Hier ist eine vereinfachte Anleitung für das Einrichten von Point-In-Time Recovery (PITR) in PostgreSQL auf einem Windows-System:

3.16.2 1. Basis-Backup erstellen

Zunächst sollten Sie einen Ordner für das Backup erstellen, z.B. C:\postgres_backups.

Nun erstellen Sie ein Basis-Backup mit pg_basebackup. Öffnen Sie die Windows-Eingabeaufforderung (CMD) und führen Sie folgenden Befehl aus:

pg_basebackup -D C:\postgres_backups\base_backup -F p -U your_username -h localhost -p 5432 -P -v

3.16.3 2. WAL-Archivierung aktivieren

Bearbeiten Sie die postgresql.conf, die sich normalerweise im Datenverzeichnis von PostgreSQL befindet, z.B. C:\Program Files\PostgreSQL\<Version>\data\.

Vergewissern Sie sich, dass das Verzeichnis C:\postgres_backups\wal_archives existiert oder erstellen Sie es.

Starten Sie danach den PostgreSQL-Dienst neu, damit die Änderungen wirksam werden.

3.16.4 3. Datenbank wiederherstellen

Um die Datenbank zu einem bestimmten Zeitpunkt wiederherzustellen:

  1. Stoppen Sie den PostgreSQL-Dienst.

  2. Löschen (oder verschieben) Sie den Inhalt des aktuellen Datenverzeichnisses.

  3. Kopieren Sie das Basis-Backup zurück in das Datenverzeichnis:

    xcopy /E /I C:\postgres_backups\base_backup C:\Program Files\PostgreSQL\<Version>\data\
  4. Fügen Sie in der postgresql.conf die folgenden Zeilen hinzu:

    restore_command = 'copy C:\\postgres_backups\\wal_archives\\%f %p'
    recovery_target_time = 'YYYY-MM-DD HH:MM:SS'

    Ersetzen Sie 'YYYY-MM-DD HH:MM:SS' durch den gewünschten Wiederherstellungszeitpunkt.

  5. Starten Sie den PostgreSQL-Dienst.

PostgreSQL wird jetzt die WAL-Dateien anwenden und den Wiederherstellungsprozess beginnen. Nachdem der Prozess abgeschlossen ist, wird PostgreSQL die Datenbank bis zum angegebenen Zeitpunkt wiederhergestellt haben.

Bitte beachten Sie, dass dies eine vereinfachte Anleitung ist. In einer Produktionsumgebung sollten Sie die richtige Fehlerbehandlung, Überwachung und weitere Sicherheitsmaßnahmen in Betracht ziehen. Es wird auch empfohlen, PITR in einer sicheren Testumgebung auszuprobieren, bevor es in der Produktionsumgebung angewendet wird.

3.17 Postgres WAL Archivierung

Das Write-Ahead Logging (WAL) ist ein entscheidender Mechanismus innerhalb von PostgreSQL-Datenbanken, der die Integrität der Daten sicherstellt und als Grundlage für viele erweiterte Datenbankfunktionen dient, darunter die Replikation und Point-In-Time-Recovery (PITR). In diesem Artikel werden wir die Konzepte und Vorteile der WAL-Archivierung in Postgres untersuchen.

3.17.1 Was ist WAL?

Write-Ahead Logging ist eine Technik, die verwendet wird, um alle Änderungen, die an der Datenbank vorgenommen werden, zu protokollieren, bevor diese Änderungen tatsächlich in die Datenbankdateien geschrieben werden. Durch das Speichern dieser Logs können Sie die Datenbank im Falle eines Absturzes wiederherstellen, da Sie eine Protokolldatei mit allen durchgeführten Operationen haben.

3.17.2 Warum ist die Archivierung von WAL wichtig?

Die Archivierung des WAL ist aus mehreren Gründen wichtig:

  1. Datensicherung: Sie ermöglicht PITR, was wiederum eine feingranulare Wiederherstellung der Datenbank erlaubt.
  2. Hochverfügbarkeit: WAL-Dateien können verwendet werden, um eine Standby-Datenbank aufzubauen.
  3. Performance: Durch das Archivieren von WAL-Dateien können Sie diese aus dem Hauptverzeichnis der Datenbank entfernen, was die Leistung verbessern kann.

3.17.3 Wie man WAL in Postgres archiviert

Das Archivieren von WAL in Postgres wird über die Konfigurationsparameter archive_mode und archive_command gesteuert.

  1. Konfigurationsparameter Setzen: In der postgresql.conf Datei müssen Sie die folgenden Parameter setzen:

    archive_mode = on
    archive_command = 'cp %p /pfad/zum/archiv/%f'
  2. Datenbank Neustarten: Nachdem die Änderungen vorgenommen wurden, muss die Datenbank neu gestartet werden.

  3. Testen: Überprüfen Sie, ob die WAL-Dateien tatsächlich archiviert werden, indem Sie das Archivverzeichnis überwachen.

3.17.4 Best Practices

  1. Speicherplatz Überwachen: Achten Sie darauf, dass genügend Speicherplatz für die archivierten WAL-Dateien vorhanden ist.
  2. Automatisierung: Verwenden Sie Tools wie pg_basebackup und Skripte, um den Prozess zu automatisieren.
  3. Monitoring: Verwenden Sie Tools wie pg_stat_archiver, um den Status der Archivierung zu überwachen.
  4. Verschlüsselung und Sicherheit: Sichern Sie das Archivverzeichnis ab, und denken Sie an eine mögliche Verschlüsselung der Dateien.

Die Archivierung von WAL in PostgreSQL ist eine robuste Methode zur Sicherstellung der Datenintegrität und zur Ermöglichung erweiterter Datenbankfunktionen wie PITR und Hochverfügbarkeit. Durch eine sorgfältige Konfiguration und Überwachung können Datenbankadministratoren die Vorteile dieses Mechanismus voll ausschöpfen.

3.18 Datenbankwiederherstellung mit WAL-Archivierung

Wenn die PostgreSQL-Datenbank abstürzt, wird die WAL-Archivierung besonders wertvoll. Mit Hilfe von WAL-Dateien können Sie die Datenbank bis zu einem bestimmten Zeitpunkt wiederherstellen und so Datenverlust vermeiden. Hier ist, wie Sie es tun: ### Vorbereitung:

  1. Sichern Sie alles: Bevor Sie mit der Wiederherstellung beginnen, sichern Sie alle Daten und Konfigurationen. Auch wenn Sie planen, sie wiederherzustellen, ist es eine gute Praxis, Backups von allem zu haben.

  2. Stellen Sie sicher, dass der PostgreSQL-Server nicht läuft: Sie können dies mit dem Befehl wie pg_ctl stop oder dem spezifischen Stop-Befehl Ihres Systems erreichen.

3.18.1 Schritt-für-Schritt-Wiederherstellung

  1. Basis-Backup wiederherstellen: Verwenden Sie das neueste Basis-Backup, das Sie haben. Zum Beispiel, wenn Sie pg_basebackup verwendet haben, sollten Sie einen vollständigen Dump Ihrer Datenbank haben.

    cp -R /pfad/zum/backup/* /pfad/zum/datenbankverzeichnis/
  2. WAL-Dateien anwenden:

  3. Starten Sie den PostgreSQL-Server: Starten Sie den PostgreSQL-Server normal. Der Server wird dann im Wiederherstellungsmodus gestartet und beginnt, die WAL-Dateien in der Reihenfolge ihrer Erstellung anzuwenden.

    pg_ctl start
  4. Wiederherstellungsüberwachung: Sie können den Fortschritt der Wiederherstellung in der PostgreSQL-Logdatei überwachen.

  5. Wiederherstellungsabschluss: Sobald die Wiederherstellung abgeschlossen ist, wird PostgreSQL die recovery.conf-Datei in recovery.done umbenennen und normal starten.

  6. Überprüfung: Stellen Sie sicher, dass alle Daten wie erwartet wiederhergestellt wurden. Überprüfen Sie die Integrität und Vollständigkeit der Datenbank.

Die Wiederherstellung einer abgestürzten PostgreSQL-Datenbank mit Hilfe der WAL-Archivierung kann zwar kompliziert erscheinen, aber mit einer sorgfältigen Vorbereitung und klaren Schritten können Sie Datenverluste vermeiden und den normalen Betrieb schnell wieder aufnehmen. Es ist auch ratsam, regelmäßige Tests der Wiederherstellungsprozesse durchzuführen, um sicherzustellen, dass im Falle eines echten Ausfalls alles wie erwartet funktioniert.

3.19 Wichtige Konfigurationsdateien von PostgreSQL

PostgreSQL bietet eine Reihe von Konfigurationsdateien, die es Administratoren ermöglichen, das Verhalten, die Sicherheit und die Leistung des Servers zu steuern. In diesem Artikel werden die wichtigsten Konfigurationsdateien von PostgreSQL und ihre Verwendungszwecke vorgestellt.

3.19.1 1. postgresql.conf

3.19.2 2. pg_hba.conf

3.19.3 3. pg_ident.conf

3.19.4 4. recovery.conf

3.19.5 5. postgresql.auto.conf

Während postgresql.conf die Hauptkonfigurationsdatei ist, sind die anderen Dateien genauso wichtig, um ein umfassendes Verständnis des Systemverhaltens und der Sicherheit zu gewährleisten. Wenn Sie Anpassungen vornehmen, wird dringend empfohlen, Änderungen zuerst in einer Testumgebung zu überprüfen, um sicherzustellen, dass sie wie beabsichtigt funktionieren. Es ist auch wichtig, die offizielle PostgreSQL-Dokumentation zu konsultieren, um Einzelheiten und Best Practices für jede Konfigurationsdatei zu erfahren.

3.20 Die wichtigsten Einstellungen in der postgresql.conf

Die postgresql.conf-Datei ist die Hauptkonfigurationsdatei für den PostgreSQL-Datenbankserver. Sie enthält eine Vielzahl von Einstellungen, die den Betrieb, die Leistung und das Verhalten des Servers beeinflussen. In diesem Artikel werden wir uns einige der wichtigsten und am häufigsten modifizierten Einstellungen ansehen.

3.20.1 1. Verbindungs- und Authentifizierungseinstellungen

3.20.2 2. Speichereinstellungen

3.20.3 3. Schreib- und Logging-Einstellungen

3.20.4 4. Laufzeit-Optimierung

Die postgresql.conf-Datei bietet eine Vielzahl von Einstellungsmöglichkeiten. Die obigen Parameter sind nur einige der wichtigsten und am häufigsten modifizierten. Bei der Anpassung von Konfigurationsoptionen ist es immer ratsam, Änderungen in einer Testumgebung zu testen, um sicherzustellen, dass sie das gewünschte Ergebnis erzielen, bevor sie in der Produktion implementiert werden. Es kann auch hilfreich sein, die offizielle PostgreSQL-Dokumentation für eine umfassende Übersicht und Empfehlungen zu jedem Parameter zu konsultieren.

3.21 pg_hba.conf

3.21.1 Einleitung

In der Welt von PostgreSQL bezieht sich die Datei pg_hba.conf auf die “Host-basierte Zugriffskontrolldatei”. Diese Datei ist entscheidend, wenn es darum geht, zu bestimmen, welche Clients sich mit Ihrer Datenbank verbinden dürfen und wie sie sich authentifizieren müssen. Dieser Artikel bietet einen detaillierten Überblick über pg_hba.conf und die darin enthaltenen Konfigurationsoptionen.

3.21.2 Grundlagen

Das “hba” in pg_hba.conf steht für “host-based authentication”. Diese Datei ermöglicht es Administratoren, feingranulare Regeln für den Zugriff auf die Datenbank festzulegen, basierend auf Faktoren wie dem Ort des Clients und der verwendeten Authentifizierungsmethode.

3.21.3 Struktur der pg_hba.conf-Datei

Ein typischer Eintrag in pg_hba.conf hat das folgende Format:

TYPE DATABASE USER ADDRESS METHOD [OPTIONS]

3.21.4 Wichtige Authentifizierungsmethoden

3.21.5 Tipps zur Konfiguration

3.21.6 Änderungen anwenden

Nachdem Änderungen an der pg_hba.conf-Datei vorgenommen wurden, muss der PostgreSQL-Server neu geladen (nicht neu gestartet) werden, damit die Änderungen wirksam werden. Dies kann oft mit einem Befehl wie pg_ctl reload oder über das Systemdienst-Management durchgeführt werden.

Die pg_hba.conf-Datei ist ein kraftvolles Werkzeug im Arsenal eines PostgreSQL-Administrators. Mit ihr können feingranulare, sicherheitsrelevante Einstellungen vorgenommen werden, die bestimmen, wer auf Ihre Datenbanken zugreifen kann und wie. Ein sorgfältiges Verständnis und eine durchdachte Konfiguration dieser Datei sind entscheidend für die Sicherheit und Integrität eines jeden PostgreSQL-Systems.

3.21.7 Beispiel

Ein sicheres Setup für eine pg_hba.conf-Datei in einem produktiven System könnte wie folgt aussehen. Beachten Sie, dass dieses Beispiel an Ihre speziellen Anforderungen und Ihr Netzwerk angepasst werden sollte:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# Lokale Verbindungen:
local   all             postgres                                peer
local   all             all                                     md5

# IPv4-Verbindungen:
# Erlaube Verbindungen nur von einem bestimmten Subnetz
host    all             all             192.168.1.0/24          md5

# IPv6-Verbindungen (falls verwendet):
# Erlaube Verbindungen nur von einem bestimmten Subnetz
host    all             all             fe80::/64               md5

# Erlaube SSL-Verbindungen von überall für einen bestimmten Benutzer (z.B. ein Web-Server)
hostssl mydb            webuser         0.0.0.0/0               md5 clientcert=1

# Erlaube Verbindungen nur von einem bestimmten externen Host
host    mydb            externalapp     203.0.113.4/32          md5

Erklärungen:

  1. Die Zeile local all postgres peer verwendet die Peer-Authentifizierung für lokale Verbindungen vom Benutzer “postgres”. Dies bedeutet, dass Verbindungen nur akzeptiert werden, wenn der UNIX-Systembenutzer, der die Verbindung initiiert, dem PostgreSQL-Benutzer entspricht.

  2. Die Zeile local all all md5 erfordert, dass alle lokalen Verbindungen ein Passwort verwenden, das mit MD5 verschlüsselt ist.

  3. Mit den IPv4/IPv6-Einstellungen beschränken wir den Zugriff auf bestimmte Netzwerke oder Adressen.

  4. Für den “webuser” erlauben wir SSL-verschlüsselte Verbindungen von überall, aber nur, wenn der Client auch ein gültiges Zertifikat vorweisen kann (clientcert=1).

  5. Für den “externalapp”-Benutzer erlauben wir Verbindungen nur von der IP 203.0.113.4.

Bitte beachten Sie, dass dieses Beispiel als Ausgangspunkt dient und angepasst werden sollte, um spezifische Sicherheitsanforderungen und Netzwerkstrukturen zu berücksichtigen. Es ist immer ratsam, regelmäßige Sicherheitsbewertungen durchzuführen und die PostgreSQL-Dokumentation zu konsultieren, um sicherzustellen, dass Ihre Konfiguration sicher ist.

3.21.8 Deprecated md5

PostgreSQL unterstützt für die Passwortauthentifizierung in der pg_hba.conf das MD5-Hashverfahren. Jedoch hat MD5 bekanntermaßen Schwächen, und viele Organisationen möchten sicherere Hashverfahren verwenden.

Ab PostgreSQL 10 wurde das SCRAM-Verfahren (Salted Challenge Response Authentication Mechanism) eingeführt, welches SHA-256 verwendet. SCRAM ist sicherer als MD5 und sollte für neue Installationen bevorzugt werden.

Um SCRAM-SHA-256 in PostgreSQL zu verwenden, müssen Sie:

  1. Passwort verschlüsseln: Stellen Sie sicher, dass in Ihrer postgresql.conf die Direktive password_encryption auf scram-sha-256 gesetzt ist.

    password_encryption = scram-sha-256

    Dies sorgt dafür, dass neu gesetzte Passwörter mit SCRAM-SHA-256 verschlüsselt werden. Bestehende Passwörter, die bereits als MD5-Hashes gespeichert sind, müssen zurückgesetzt werden, um sie als SCRAM-Hashes zu speichern.

  2. pg_hba.conf konfigurieren: In Ihrer pg_hba.conf ersetzen Sie md5 durch scram-sha-256.

    Zum Beispiel:

    # Lokale Verbindungen:
    local   all             all                                     scram-sha-256
    
    # IPv4-Verbindungen:
    host    all             all             192.168.1.0/24          scram-sha-256

Es ist wichtig zu beachten, dass SCRAM-Clientauthentifizierung nur mit Passwörtern funktioniert, die im SCRAM-Format gespeichert sind. Wenn Sie versuchen, sich mit einem Benutzer anzumelden, dessen Passwort noch als MD5 gespeichert ist, nachdem Sie SCRAM in pg_hba.conf aktiviert haben, schlägt die Authentifizierung fehl. Sie müssen das Passwort dieses Benutzers zurücksetzen, nachdem Sie password_encryption auf scram-sha-256 gesetzt haben.

3.22 pg_ident.conf

In PostgreSQL dient die Datei pg_ident.conf zur Verwaltung von Benutzeridentitätszuordnungen. Mit Hilfe dieser Zuordnungen können Sie festlegen, wie Betriebssystembenutzer oder Benutzergruppen PostgreSQL-Benutzern zugeordnet werden. Dies ist besonders nützlich, wenn Sie Authentifizierungsmethoden wie ident oder peer verwenden, die auf dem Betriebssystem- oder Netzwerkbereich basieren.

3.22.1 Struktur von pg_ident.conf

Die Datei pg_ident.conf besteht aus mehreren Zeilen mit jeweils drei Werten:

  1. Map-Name: Ein Name, der zur Referenzierung dieser speziellen Zuordnung in der Datei pg_hba.conf verwendet wird.
  2. System-Benutzername: Der Name des Betriebssystembenutzers oder eine Gruppe von Benutzern. Es sind auch Wildcards (*) erlaubt.
  3. Datenbankbenutzer: Der PostgreSQL-Benutzer, dem der Systembenutzer oder die Gruppe von Benutzern zugeordnet werden soll.

Das Format jeder Zeile sieht so aus:

mapname       system-username       database-username

3.22.2 Beispiel

Angenommen, Sie möchten, dass der Betriebssystembenutzer “alice” sich als PostgreSQL-Benutzer “dbadmin” und der Betriebssystembenutzer “bob” sich als “dbuser” authentifiziert. Ihre pg_ident.conf könnte dann so aussehen:

myidentmap    alice    dbadmin
myidentmap    bob      dbuser

3.22.3 Nutzung mit pg_hba.conf

Damit die Identitätszuordnung funktioniert, müssen Sie sie auch in der Datei pg_hba.conf referenzieren. Zum Beispiel:

# TYPE  DATABASE  USER     ADDRESS        METHOD   OPTIONS
host   all       all      127.0.0.1/32   ident    map=myidentmap

In diesem Beispiel würde jeder Verbindungsversuch von der Adresse 127.0.0.1 die ident-Authentifizierung verwenden und die Benutzerzuordnungen aus der Map “myidentmap” in pg_ident.conf beachten.

3.22.4 Wichtige Anmerkungen

TLDR

Die pg_ident.conf-Datei in PostgreSQL bietet eine leistungsstarke Möglichkeit, Betriebssystembenutzer PostgreSQL-Benutzern zuzuordnen. Dies ist besonders nützlich in Umgebungen, in denen Sie die Authentifizierung auf Systemebene beibehalten möchten, bietet jedoch eine zusätzliche Sicherheitsebene durch die Definition spezifischer Zuordnungen zwischen System- und Datenbankbenutzern. Es ist jedoch wichtig, sicherzustellen, dass alle Konfigurationsdateien korrekt eingestellt sind und die Sicherheitsanforderungen Ihrer spezifischen Umgebung erfüllt werden.

3.23 Utility Befehle

PostgreSQL bietet eine Reihe von Utility-Befehlen, die mit pg_ beginnen, um verschiedene Aspekte des Systems zu verwalten. Hier sind einige der wichtigsten mit ihren Funktionen, Optionen und Beispielen:

  1. pg_ctl - Steuert das Starten, Stoppen oder den Status des PostgreSQL-Servers.

  2. pg_dump - Erzeugt einen Datenbank-Backup-Dump.

  3. pg_restore - Stellt die Datenbank aus einem durch pg_dump erstellten Backup wieder her.

  4. pg_basebackup - Erstellt ein Basis-Backup der Datenbank, ideal für das Setzen von Replika.

  5. pg_config - Zeigt Konfigurationsinformationen über PostgreSQL-Installation.

  6. pg_isready - Überprüft den Verbindungsstatus einer PostgreSQL-Instanz.

Dies sind einige der am häufigsten verwendeten pg_ Befehle. Die genaue Liste und detailliertere Optionen für jeden Befehl finden Sie in der PostgreSQL-Dokumentation oder indem Sie den Befehl mit der Option --help ausführen. Es ist ratsam, diese Befehle in einer Testumgebung zu üben, bevor sie in einer Produktionsumgebung angewendet werden.

3.24 PostgreSQL Systemkataloge

In jeder PostgreSQL-Datenbank existiert eine Reihe spezialisierter Tabellen und Ansichten, bekannt als Systemkataloge. Diese Kataloge bilden das Rückgrat der Metadaten in PostgreSQL und enthalten Informationen über alle Datenbankobjekte, darunter Tabellen, Indizes, Schemata, Funktionen und vieles mehr. Für Datenbankadministratoren und fortgeschrittene Benutzer bieten diese Kataloge eine unschätzbare Quelle von Informationen, um das System zu verstehen und zu verwalten.

3.24.1 Was sind Systemkataloge?

Systemkataloge sind eine Menge von Tabellen, die die Metadaten einer PostgreSQL-Datenbank speichern. Das bedeutet, sie speichern nicht die Daten selbst, sondern Informationen über die Datenbankstrukturen.

Zum Beispiel, wenn Sie eine Tabelle erstellen, wird ein Eintrag in den entsprechenden Systemkatalogen gemacht, der Details über die Tabelle, ihre Spalten, Datentypen, Einschränkungen und viele andere Aspekte enthält.

3.24.2 Wichtige Systemkataloge

Einige der zentralen Systemkataloge sind:

… und viele andere.

3.24.3 Arbeiten mit Systemkatalogen

Obwohl Sie diese Tabellen wie normale Tabellen abfragen können, sollten Sie bei der Arbeit mit Systemkatalogen vorsichtig sein. Das direkte Ändern von Einträgen in diesen Tabellen kann die Integrität Ihrer Datenbank gefährden.

Hier ein einfaches Beispiel, wie man die Namen und Typen aller Tabellen in einem Schema abfragen kann:

SELECT relname, relkind 
FROM pg_class 
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace 
WHERE nspname = 'public';

In diesem Beispiel gibt relkind den Typ des Objekts an (z.B. ‘r’ für Tabellen, ‘i’ für Indizes).

3.24.4 Sicherheitsaspekte

Der Zugriff auf die Systemkataloge wird normalerweise eingeschränkt, um die Sicherheit und Integrität der Datenbank zu gewährleisten. Allerdings haben Datenbankadministratoren und bestimmte privilegierte Rollen vollen Zugriff auf diese Kataloge. Es ist wichtig zu verstehen, dass, obwohl das Durchsuchen dieser Kataloge sicher ist, das Ändern von Daten direkt in Systemkatalogen potenziell schädlich und in den meisten Fällen nicht empfohlen wird.

3.24.5 TLDR

Die Systemkataloge in PostgreSQL bieten einen tiefen Einblick in das Innere Ihrer Datenbank. Sie enthalten wertvolle Informationen, die Ihnen helfen können, Ihre Datenbank besser zu verstehen, zu optimieren und zu verwalten. Es ist jedoch wichtig, mit ihnen mit Sorgfalt und Verständnis zu arbeiten, um die Integrität und Sicherheit Ihrer Datenbank zu gewährleisten.

3.24.6 Dokumentation

Hier finden Sie eine Übersicht über die Systemkataloge und die dazugehörigen Ansichten. Es gibt Links zu spezifischen Katalogen und Ansichten mit weiteren Details:

https://www.postgresql.org/docs/current/catalogs-overview.html](https://www.postgresql.org/docs/current/catalogs-overview.html)

3.24.7 Beispiele

Hier sind einige praktische Abfragen:

  1. Systemeinstellungen überprüfen

    SELECT name, setting FROM pg_settings;

    Diese Abfrage zeigt Einstellungen und Konfigurationen der PostgreSQL-Instanz.

  2. Liste aller Datenbanken

    SELECT datname FROM pg_database;

    Hier sehen Sie alle Datenbanken in Ihrer PostgreSQL-Instanz.

  3. Liste aller Tabellen in einer Datenbank

    SELECT tablename FROM pg_tables WHERE schemaname = 'public';

    Damit erhalten Sie eine Liste aller Tabellen im “public”-Schema.

  4. Liste aller Indizes in einer Datenbank

    SELECT indexname FROM pg_indexes WHERE schemaname = 'public';

    Mit dieser Abfrage sehen Sie alle Indizes im “public”-Schema.

  5. Größe der Datenbank anzeigen

    SELECT pg_size_pretty(pg_database_size('meineDatenbank'));

    Diese Funktion gibt Ihnen die Größe der angegebenen Datenbank in einem für Menschen lesbaren Format zurück.

  6. Größe aller Tabellen anzeigen

    SELECT relname, pg_size_pretty(pg_total_relation_size(C.oid))
    FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
    WHERE nspname = 'public' AND relkind='r' ORDER BY pg_total_relation_size(C.oid) DESC;

    Hier erhalten Sie die Größen aller Tabellen im “public”-Schema.

  7. Anzeigen von laufenden Queries

    SELECT pid, query, state FROM pg_stat_activity WHERE state <> 'idle';

    Diese Abfrage zeigt alle laufenden (nicht im Leerlauf befindlichen) Abfragen in der Datenbank.

  8. Liste aller Schemata

    SELECT nspname FROM pg_namespace;

    Damit sehen Sie alle Schemata in Ihrer PostgreSQL-Instanz.

  9. Liste aller Benutzer und Rollen

    SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin FROM pg_roles;

    Hier erhalten Sie eine Übersicht über alle Benutzer und Rollen sowie ihre Berechtigungen.

  10. Liste aller Trigger

    SELECT trigger_name, event_object_table, action_statement, action_timing, trigger_schema 
    FROM information_schema.triggers WHERE trigger_schema = 'public';

    Mit dieser Abfrage sehen Sie alle Trigger im “public”-Schema.

Diese Abfragen sind nützliche Werkzeuge für jeden, der PostgreSQL administriert oder entwickelt. Es ist jedoch wichtig zu beachten, dass einige dieser Abfragen in großen Produktionsdatenbanken langsam sein können, also verwenden Sie sie mit Bedacht. Es kann auch hilfreich sein, die PostgreSQL-Dokumentation zu konsultieren, um weitere Details über Systemkataloge und Ansichten zu erfahren.

3.25 Logfiles in PostgreSQL

PostgreSQL, ein leistungsstarkes Open-Source-Relationales Datenbanksystem, bietet umfangreiche Logging-Fähigkeiten, die für das Überwachen, Debuggen und Optimieren von Datenbankoperationen unerlässlich sind. In diesem Artikel werden wir uns die wichtigsten Aspekte der Logfiles in PostgreSQL ansehen.

3.25.1 1. Warum sind Logfiles wichtig?

Logfiles in PostgreSQL bieten eine chronologische Aufzeichnung von Ereignissen und Aktivitäten im System. Sie sind unerlässlich für:

3.25.2 2. Wo finden Sie die Logfiles?

Die Speicherorte der Logfiles werden durch zwei Hauptkonfigurationsparameter bestimmt: log_directory und log_filename. Diese können über die postgresql.conf Datei oder dynamisch über den SQL-Befehl SHOW abgerufen werden:

SHOW log_directory;
SHOW log_filename;

3.25.3 3. Konfiguration von Logfiles

Es gibt viele Konfigurationsoptionen in PostgreSQL, die beeinflussen, wie und was geloggt wird:

3.25.4 4. Log Rotation

Das ständige Schreiben von Logs kann dazu führen, dass der Speicherplatz ausgeht. Daher bietet PostgreSQL eine automatische Log-Rotation:

3.25.5 5. Logfile-Analyse

Es gibt Tools von Drittanbietern, wie pgBadger, die detaillierte Analysen und Berichte basierend auf den PostgreSQL-Logdateien erstellen können. Diese Tools können helfen, Performance-Probleme zu identifizieren oder Einblicke in das Nutzerverhalten zu gewinnen.

Logfiles in PostgreSQL sind ein mächtiges Werkzeug für jeden Datenbankadministrator und -entwickler. Die richtige Konfiguration und Überwachung dieser Logs kann dazu beitragen, die Gesundheit, Performance und Sicherheit einer PostgreSQL-Instanz sicherzustellen. Es ist wichtig, regelmäßig die Logs zu überprüfen und bei Bedarf entsprechende Maßnahmen zu ergreifen.

3.26 PostgreSQL-Replikation

Replikation ist ein Konzept, das in Datenbanksystemen verwendet wird, um Datenkopien über mehrere Standorte oder Knoten zu verteilen. PostgreSQL bietet verschiedene Replikationsmethoden an, um Datenverfügbarkeit, Ausfallsicherheit und Skalierbarkeit zu gewährleisten. In diesem Artikel werfen wir einen Blick auf die Replikationsmechanismen von PostgreSQL und wie sie in verschiedenen Szenarien eingesetzt werden können.

3.26.1 Was ist Replikation?

Replikation bezieht sich auf den Prozess, Daten von einem primären Server (oft als Master bezeichnet) auf einen oder mehrere sekundäre Server (Slaves oder Standbys) zu kopieren. Dies kann aus verschiedenen Gründen erfolgen:

  1. Hochverfügbarkeit: Durch Replikation können Datenbankausfälle minimiert werden, da im Falle eines Ausfalls des Hauptknotens einer der sekundären Knoten dessen Rolle übernehmen kann.
  2. Lastverteilung: Leseanfragen können auf sekundäre Knoten verteilt werden, wodurch die Last vom Hauptknoten genommen wird.
  3. Datensicherung: Replikation kann als zusätzliche Sicherheitsebene dienen, da Daten an mehreren Orten gespeichert werden.
  4. Geographische Verteilung: Daten können näher an die Endnutzer repliziert werden, um die Latenz zu reduzieren.

3.26.2 Replikationstypen in PostgreSQL

PostgreSQL bietet verschiedene Replikationslösungen:

  1. Physische Replikation: Hierbei werden die Änderungen in den Write-Ahead-Logs (WAL) von der Hauptinstanz zur sekundären Instanz übertragen. Dies erzeugt eine identische Kopie der Datenbank. Diese Art der Replikation ist ideal für Hochverfügbarkeitslösungen.

  2. Logische Replikation: Dies ermöglicht es, bestimmte Tabellen, Datenbanken oder sogar einzelne Transaktionen zu replizieren. Dabei werden die Datenänderungen in einem formatierten Stil übertragen, und nicht wie beim WAL. Dies ist nützlich, wenn nur bestimmte Daten repliziert werden müssen oder wenn Daten zwischen verschiedenen PostgreSQL-Versionen repliziert werden sollen.

3.26.3 Konfiguration und Betrieb

3.26.4 Herausforderungen und Überlegungen

TLDR

Die Replikation in PostgreSQL bietet viele Vorteile in Bezug auf Verfügbarkeit, Skalierbarkeit und Sicherheit. Obwohl es eine Lernkurve gibt, um die Replikation korrekt einzurichten und zu verwalten, sind die Vorteile, die sie bietet, oft den zusätzlichen Aufwand wert. Es ist wichtig, die spezifischen Anforderungen und Ziele des Systems zu berücksichtigen, um die am besten geeignete Replikationsstrategie auszuwählen.

3.26.5 1. Physische Replikation

Physische Replikation, oft auch als binäre Replikation bezeichnet, involviert das Kopieren von Daten auf Byte-Ebene von einem primären Server zu einem oder mehreren sekundären Servern.

Eigenschaften:

Anwendungsfälle:

3.26.6 2. Logische Replikation

Im Gegensatz zur physischen Replikation, bei der Byte-für-Byte-Kopien von Daten vorgenommen werden, basiert die logische Replikation auf replizierbaren Änderungen auf höherer Ebene, wie z.B. SQL-Statements.

Eigenschaften:

Anwendungsfälle:

3.26.7 TLDR

Während sowohl physische als auch logische Replikation ihre eigenen Stärken und Anwendungsfälle haben, können sie auch komplementär eingesetzt werden, je nach den spezifischen Anforderungen des Systems. Physische Replikation ist ideal für Szenarien, die eine vollständige Redundanz und Hochverfügbarkeit erfordern, während logische Replikation Flexibilität in Bezug auf das, was und wie es repliziert wird, bietet. Es ist wichtig, die richtige Replikationsmethode basierend auf den Anforderungen des Geschäftsszenarios zu wählen.

3.27 Einrichtung der Streaming-Replikation in PostgreSQL

Ziel: Einrichtung einer Streaming-Replikation für eine PostgreSQL-Datenbank auf Windows- oder Linux-Systemen.

3.27.1 Auf dem Master-Server

  1. Konfigurationsüberprüfung: Öffnen Sie postgresql.conf und stellen Sie sicher, dass folgende Parameter entsprechend gesetzt sind:

  2. Replikationsbenutzer erstellen:

    CREATE USER repuser WITH REPLICATION ENCRYPTED PASSWORD 'abc';
  3. Zugriffsrechte konfigurieren: Bearbeiten Sie pg_hba.conf und fügen Sie die IP-Adressen des Master- und Standby-Servers mit der Authentifizierungsmethode md5 hinzu.

  4. Konfigurationsänderungen anwenden: Laden Sie die Konfiguration neu oder starten Sie den PostgreSQL-Server neu.

3.27.2 Auf dem Standby-Server

  1. Datenbank stoppen: Beenden Sie die PostgreSQL-Datenbank.

  2. Datenverzeichnis bereinigen: Löschen Sie alle Dateien im Datenverzeichnis.

  3. Datenbank-Backup durchführen: Verwenden Sie pg_basebackup, um eine Kopie des Master-Servers zu erstellen:

    pg_basebackup -h <master-ip> -U repuser -p 5432 -D $PGDATA -Fp -Xs -P -R -C -S pgstandby

    Erklärung der Optionen:

  4. Standby-Server starten: Starten Sie die PostgreSQL-Datenbank auf dem Standby-Server.

3.27.3 Replikation lösen

Eine Replikation in PostgreSQL, die mit pg_basebackup eingerichtet wurde, kann durch verschiedene Methoden gelöst werden, je nachdem, was genau gewünscht ist. Die Option -R von pg_basebackup erstellt beispielsweise eine recovery.conf-Datei (in PostgreSQL-Versionen vor 12) oder entsprechende Einträge in der postgresql.auto.conf (ab PostgreSQL 12), um den Standby-Modus für das Datenbank-Cluster zu aktivieren.

Wenn Sie die Replikation zwischen dem Master (primären Server) und dem Standby (sekundären Server) trennen möchten, führen Sie die folgenden Schritte aus:

  1. Standby aus dem Replikationsmodus entfernen:

  2. Standby neu starten: Nachdem die entsprechenden Konfigurationsänderungen vorgenommen wurden, starten Sie den PostgreSQL-Server des Standby neu.

  3. Replikations-Slot entfernen: Wenn Sie einen Replikations-Slot (wie im obigen Befehl mit -S pgstandby angegeben) verwendet haben, sollten Sie diesen Slot auf dem primären Server entfernen, um zu verhindern, dass unnötig viele WAL-Dateien aufbewahrt werden. Dies kann mit dem folgenden SQL-Befehl gemacht werden:

    SELECT pg_drop_replication_slot('pgstandby');
  4. Firewall und pg_hba.conf anpassen: Wenn Sie keine Verbindung zwischen dem Master und dem ehemaligen Standby wünschen, sollten Sie sicherstellen, dass die Firewall-Regeln und die pg_hba.conf-Datei entsprechend angepasst sind, um unerwünschte Verbindungen zu verhindern.

Es ist wichtig zu beachten, dass die Trennung der Replikation irreversible Änderungen mit sich bringen kann. Daher ist es ratsam, vor solchen Änderungen Backups zu erstellen und die Schritte zuerst in einer Testumgebung durchzuführen.

3.28 Anleitung zur Einrichtung der logischen Replikation in PostgreSQL

Ziel: Einrichtung einer logischen Replikation in einer PostgreSQL-Datenbank.

3.28.1 Auf dem Master/Publication-Server

  1. Konfigurationsdatei bearbeiten: Öffnen Sie die postgresql.conf-Datei und modifizieren Sie die folgenden Parameter:

  2. Zugriffsregeln festlegen: Bearbeiten Sie die pg_hba.conf-Datei und fügen Sie die IP-Adresse des Publication/Subscription-Servers hinzu.

  3. Replikationsbenutzer erstellen:

    CREATE USER repuser WITH SUPERUSER ENCRYPTED PASSWORD 'string';
  4. Datenbank-Service neu starten: Starten Sie den PostgreSQL-Service neu.

  5. Replikationsdatenbank erstellen:

    CREATE DATABASE repdb WITH OWNER repuser;
  6. Verbindung herstellen und Tabelle erstellen: Verbinden Sie sich mit der repdb-Datenbank als repuser und erstellen Sie eine Tabelle reptab1 mit einem Primärschlüssel.

  7. Publication erstellen: Für eine bestimmte Tabelle:

    CREATE PUBLICATION mypub FOR TABLE reptab1;

    Oder für alle Tabellen:

    CREATE PUBLICATION mypub FOR ALL TABLES;
  8. Replikationsstatus überprüfen: Verwenden Sie pg_stat_replication, um den Status der Replikation zu überprüfen.

3.28.2 Auf dem Standby/Subscription-Server

  1. Datenbank und Tabellenstruktur erstellen: Erstellen Sie eine Datenbank namens repdb oder reptarget und erstellen Sie alle Tabellenstrukturen, die repliziert werden sollen.

  2. Verbindung zur Datenbank herstellen: Verbinden Sie sich mit der repdb- oder reptarget-Datenbank.

  3. Subscription erstellen:

    CREATE SUBSCRIPTION mysub CONNECTION 'host=<master-ip-address> dbname=repdb user=repuser password=abc' PUBLICATION mypub;
  4. Subscription-Status überprüfen: Verwenden Sie pg_stat_subscription, um den Status der Subscription zu überprüfen.

3.29 Locks

Um Sperren (locks) in PostgreSQL zu identifizieren, können Sie die Systemansicht pg_locks zusammen mit anderen systemeigenen Ansichten und Tabellen verwenden. Hier ist eine häufig verwendete Abfrage, um aktuelle Sperren in PostgreSQL zu finden, zusammen mit nützlichen Informationen zu den betroffenen Transaktionen und Vorgängen:

SELECT
    pg_stat_activity.pid,
    pg_class.relname,
    pg_locks.transactionid,
    pg_locks.granted,
    pg_locks.locktype,
    pg_locks.mode,
    pg_stat_activity.query,
    pg_stat_activity.query_start,
    age(now(), pg_stat_activity.query_start) AS "age"
FROM pg_stat_activity
JOIN pg_locks ON pg_locks.pid = pg_stat_activity.pid
LEFT JOIN pg_class ON pg_locks.relation = pg_class.oid
WHERE pg_stat_activity.query <> '<IDLE>' 
      AND pg_stat_activity.pid <> pg_backend_pid()
ORDER BY "age" DESC;

Ein paar Erklärungen zu den ausgewählten Spalten:

Diese Abfrage liefert eine Liste aller aktiven Vorgänge und ihrer jeweiligen Sperren (falls vorhanden). Es ist hilfreich, um festzustellen, welche Vorgänge möglicherweise blockiert sind oder andere Vorgänge blockieren.

3.30 Certificate Authentication verwenden

Die Verwendung von Certificate Authentication in PostgreSQL ermöglicht es, dass Clients sich mit SSL-Zertifikaten anstatt Passwörtern gegenüber dem PostgreSQL-Server authentifizieren. Hier sind die Schritte, um dies einzurichten:

3.30.1 1. Erstellen von SSL-Zertifikaten

Sie benötigen ein Serverzertifikat und für jeden Client, der sich authentifizieren möchte, ein Clientzertifikat:

1.1. Erstellen Sie einen privaten Schlüssel und ein Serverzertifikat:

openssl req -new -text -out server.req
openssl rsa -in privkey.pem -out server.key
rm privkey.pem
openssl req -x509 -in server.req -text -key server.key -out server.crt
chmod og-rwx server.key

1.2. Erstellen Sie einen privaten Schlüssel und ein Clientzertifikat:

openssl req -new -text -out client.req
openssl rsa -in privkey.pem -out client.key
rm privkey.pem
openssl req -x509 -in client.req -text -key client.key -out client.crt
chmod og-rwx client.key

3.30.2 2. Konfigurieren Sie den PostgreSQL-Server

2.1. Setzen Sie SSL auf ‘on’ in postgresql.conf:

ssl = on

2.2. Kopieren Sie das Serverzertifikat und den privaten Schlüssel in das Datenverzeichnis von PostgreSQL:

cp server.crt /path/to/your/postgresql/data/directory/
cp server.key /path/to/your/postgresql/data/directory/

3.30.3 3. Konfigurieren Sie die Authentifizierung in pg_hba.conf

Fügen Sie eine Zeile hinzu, die die Certificate Authentication für Ihre Benutzer und Netzwerkbereiche verwendet:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
hostssl mydatabase      myuser          192.168.1.0/24          cert

3.30.4 4. Konfigurieren Sie den Client

4.1. Kopieren Sie das Clientzertifikat und den privaten Schlüssel an einen geeigneten Ort auf dem Client, z. B.:

~/.postgresql/postgresql.crt
~/.postgresql/postgresql.key

Stellen Sie sicher, dass die Datei postgresql.key nicht für andere Benutzer lesbar ist, da sie den privaten Schlüssel enthält.

3.30.5 5. Verbindungstest

Jetzt sollten Sie in der Lage sein, sich von einem Client aus mit dem PostgreSQL-Server zu verbinden und die Certificate Authentication zu verwenden.

3.30.6 Hinweis

3.31 Cert Authentication in Windows verwenden

In einer Windows-Umgebung unterscheiden sich die Schritte für die Erstellung und Verwaltung von SSL-Zertifikaten und die Konfiguration von PostgreSQL nicht dramatisch, aber es gibt einige spezifische Anpassungen. Hier ist eine angepasste Anleitung:

3.31.1 1. Erstellen von SSL-Zertifikaten

Verwenden Sie weiterhin openssl, welches auch für Windows verfügbar ist:

1.1. Erstellen Sie einen privaten Schlüssel und ein Serverzertifikat:

openssl req -new -text -out server.req
openssl rsa -in privkey.pem -out server.key
del privkey.pem
openssl req -x509 -in server.req -text -key server.key -out server.crt

1.2. Erstellen Sie einen privaten Schlüssel und ein Clientzertifikat:

openssl req -new -text -out client.req
openssl rsa -in privkey.pem -out client.key
del privkey.pem
openssl req -x509 -in client.req -text -key client.key -out client.crt

3.31.2 2. Konfigurieren Sie den PostgreSQL-Server

2.1. Setzen Sie SSL auf ‘on’ in postgresql.conf:

ssl = on

2.2. Kopieren Sie das Serverzertifikat und den privaten Schlüssel in das Datenverzeichnis von PostgreSQL: Verwenden Sie den Datei-Explorer oder den copy Befehl im Command Prompt.

3.31.3 3. Konfigurieren Sie die Authentifizierung in pg_hba.conf

Fügen Sie eine Zeile hinzu, die die Certificate Authentication für Ihre Benutzer und Netzwerkbereiche verwendet:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
hostssl mydatabase      myuser          192.168.1.0/24          cert

3.31.4 4. Konfigurieren Sie den Client

4.1. Kopieren Sie das Clientzertifikat und den privaten Schlüssel an einen geeigneten Ort auf dem Client: Verwenden Sie hier einen Pfad wie z.B.:

%APPDATA%\postgresql\postgresql.crt
%APPDATA%\postgresql\postgresql.key

Stellen Sie sicher, dass die Datei postgresql.key nicht für andere Benutzer lesbar ist, da sie den privaten Schlüssel enthält.

3.31.5 5. Verbindungstest

Jetzt sollten Sie in der Lage sein, sich von einem Client aus mit dem PostgreSQL-Server zu verbinden und die Certificate Authentication zu verwenden.

3.31.6 Hinweise

Das ist der Überblick über die Einrichtung von Certificate Authentication in PostgreSQL unter Windows. Es kann je nach Ihrer spezifischen Umgebung und Anforderungen weitere Feinabstimmungen oder Anpassungen erforderlich sein.

3.32 Wartungsaufgaben für PostgreSQL-Administratoren

Die Verwaltung und Wartung einer PostgreSQL-Datenbank ist eine wesentliche Aufgabe, um eine hohe Leistung, Zuverlässigkeit und Datenintegrität sicherzustellen. Hier sind einige Schlüsselaktivitäten, die PostgreSQL-Administratoren regelmäßig durchführen sollten:

3.32.1 1. Regelmäßige Backups

3.32.2 2. Überwachung

3.32.3 3. VACUUM

3.32.4 4. Index-Wartung

3.32.5 5. Aktualisierung

3.32.6 6. Zugriffskontrolle

3.32.7 7. Partitionierung

3.32.8 8. Log-Management

3.32.9 9. Hardware- und Speicheroptimierung

3.32.10 10. Replikationsüberwachung

3.32.11 TLDR;

Das Management einer PostgreSQL-Datenbank erfordert Proaktivität und ein tiefes Verständnis der internen Mechanismen von PostgreSQL. Durch regelmäßige Wartung und Überwachung können Administratoren jedoch sicherstellen, dass ihre Datenbanken leistungsstark, sicher und zuverlässig bleiben.

3.33 VACUUM

Das VACUUM-Kommando in PostgreSQL ist ein entscheidendes Werkzeug für Datenbankadministratoren. Es hilft dabei, Speicherplatz zurückzugewinnen, den sogenannten “toten” Tupeln, die durch gelöschte oder aktualisierte Daten entstehen. In diesem Artikel werden wir uns mit der Funktionsweise von VACUUM, seiner Bedeutung und konkreten Anweisungen beschäftigen, wie man es effektiv einsetzt.

3.33.1 1. Warum ist VACUUM wichtig?

PostgreSQL verwendet das MVCC (Multi-Version Concurrency Control) Modell. Wenn ein Tupel (ein Datensatz) aktualisiert oder gelöscht wird, bleibt die alte Version des Tupels erhalten, bis sie durch VACUUM entfernt wird. Ohne regelmäßige VACUUM-Operationen kann die Datenbank mit diesen toten Tupeln überladen werden, was zu verminderten Abfrageleistungen und übermäßigem Speicherplatzverbrauch führt.

3.33.2 2. Arten von VACUUM

2.1 Standard VACUUM

Dieser Vorgang entfernt tote Tupel und gibt Speicherplatz in der Datenbank zurück, ohne die Festplatte freizugeben.

VACUUM [Tabelle];

2.2 VACUUM FULL

Dieser Vorgang ist intensiver und gibt nicht nur den Speicherplatz innerhalb der Datenbank frei, sondern gibt auch den Speicherplatz auf der Festplatte zurück. Beachten Sie, dass VACUUM FULL mehr Zeit in Anspruch nimmt und während seiner Ausführung exklusive Sperren auf den Tabellen setzt.

VACUUM FULL [Tabelle];

2.3 VACUUM ANALYZE

Dies kombiniert den VACUUM-Vorgang mit dem ANALYZE-Befehl, der die Statistiken der Datenbank aktualisiert. Dies kann helfen, den Abfrageplaner zu optimieren.

VACUUM ANALYZE [Tabelle];

3.33.3 3. Automatisches VACUUM

PostgreSQL führt automatisch VACUUM-Operationen aus, dank des autovacuum-Daemons. Die Standardeinstellungen funktionieren für die meisten Anwendungen gut, können aber für spezifische Anforderungen angepasst werden.

Um den Status des Autovacuum-Prozesses zu überprüfen, können Sie die pg_stat_all_tables-Tabelle abfragen:

SELECT schemaname, relname, last_autovacuum, last_autoanalyze 
FROM pg_stat_all_tables
WHERE last_autovacuum IS NOT NULL OR last_autoanalyze IS NOT NULL;

3.33.4 4. Wann sollte man VACUUM manuell ausführen?

Obwohl Autovacuum für viele Anwendungsfälle ausreicht, gibt es Situationen, in denen ein manueller VACUUM sinnvoll sein kann:

3.33.5 5. VACUUM-Tuning

Es gibt einige Konfigurationsparameter, die den VACUUM-Prozess beeinflussen:

Diese Einstellungen können in der postgresql.conf-Datei oder über den ALTER SYSTEM-Befehl angepasst werden.

3.33.6 TLDR

Der VACUUM-Prozess ist ein wesentlicher Bestandteil der PostgreSQL-Wartung, um die Leistung und den effizienten Speicherplatzverbrauch sicherzustellen. Während das Autovacuum-System in den meisten Fällen hervorragende Arbeit leistet, ist es für Datenbankadministratoren wichtig, die Grundlagen und Nuancen des VACUUM-Prozesses zu verstehen und wann und wie manuell eingegriffen werden sollte.

3.34 PostgreSQL Index-Wartung

Indizes sind entscheidend für die Leistungsfähigkeit von Datenbankabfragen in PostgreSQL. Doch wie jedes andere Systemelement erfordern sie Wartung, um effizient zu bleiben. In diesem Artikel werden wir die Grundlagen der Index-Wartung in PostgreSQL diskutieren und konkrete Beispiele und Anweisungen zur Pflege von Indizes liefern.

3.34.1 1. Bedeutung der Index-Wartung

Indizes beschleunigen Abfragen, indem sie den Datenbankzugriff optimieren. Ohne regelmäßige Wartung können jedoch „Tote Tupel“ in den Indexstrukturen ansammeln, die die Performance beeinträchtigen.

3.34.2 2. Ermitteln des Zustands von Indizes

2.1 Größe von Indizes ermitteln

Um zu wissen, welche Indizes den meisten Speicherplatz belegen, können Sie folgenden Befehl verwenden:

SELECT tablename, indexname, pg_size_pretty(pg_relation_size(indexrelid::regclass)) 
FROM pg_indexes 
ORDER BY pg_relation_size(indexrelid::regclass) DESC;

2.2 Index-Nutzung

Ein Index, der nicht verwendet wird, ist nicht nur nutzlos, sondern auch verschwenderisch. Um zu überprüfen, wie oft Indizes verwendet werden, können Sie folgende Abfrage verwenden:

SELECT relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
ORDER BY idx_scan DESC;

3.34.3 3. Index-Wiederaufbau: REINDEX

Durch ständiges Löschen, Einfügen und Aktualisieren von Daten können Indizes fragmentiert werden. Der Befehl REINDEX erstellt den Index neu und kann helfen, Speicherplatz zurückzugewinnen und die Performance zu verbessern.

REINDEX INDEX indexname;

Für alle Indizes einer Tabelle:

REINDEX TABLE tablename;

3.34.4 4. Index-Löschung

Wenn ein Index nicht verwendet wird oder überflüssig ist, können Sie ihn entfernen:

DROP INDEX indexname;

3.34.5 5. Verwendung von VACUUM für Index-Wartung

Das bereits besprochene VACUUM entfernt nicht nur tote Tupel aus Tabellen, sondern auch aus Indizes. Ein regelmäßiges VACUUM (oder der Autovacuum-Prozess) hilft, Indizes in gutem Zustand zu halten.

VACUUM tablename;

3.34.6 6. Partielle Indizes

Teilindizes sind Indizes, die nur einen Teil der Tabelle abdecken. Wenn Sie wissen, dass Sie nur einen Teil Ihrer Daten häufig abfragen, können Sie einen partiellen Index erstellen, um die Wartung und den Speicherplatz zu reduzieren:

CREATE INDEX indexname ON tablename (columnname)
WHERE condition;

3.34.7 7. Überwachung von Index-Locks

Manchmal können Abfragen durch Index-Locks blockiert werden. Um solche Locks zu identifizieren, verwenden Sie:

SELECT pid, relation::regclass, mode, granted 
FROM pg_locks 
WHERE relation IN (SELECT indexrelid FROM pg_index);

3.34.8 8. Ungenutzter Index -Locks

Wenn Sie ungenutzte Indizes in einer PostgreSQL-Datenbank finden möchten, können Sie die Systemstatistikansichten verwenden. Insbesondere pg_stat_user_indexes bietet Informationen über die Index-Nutzung.

Hier ist eine einfache Abfrage, um ungenutzte Indizes zu finden:

SELECT schemaname, 
       relname AS table_name, 
       indexrelname AS index_name, 
       pg_relation_size(indexrelid::regclass) AS index_size
FROM pg_stat_user_indexes 
WHERE idx_scan = 0 
      AND indisunique IS FALSE
ORDER BY pg_relation_size(indexrelid::regclass) DESC;

Ein paar Punkte zur Beachtung:

  1. Die Abfrage filtert eindeutige Indizes heraus (indisunique IS FALSE), da diese notwendig sein könnten, um Datenintegrität zu gewährleisten, selbst wenn sie nicht für Abfragen verwendet werden.
  2. Indizes, die neu erstellt wurden oder in einer Datenbank, die kürzlich hochgefahren wurde, könnten fälschlicherweise als unbenutzt erscheinen, da sie noch nicht genug Zeit hatten, um verwendet zu werden. Daher ist es wichtig, die Ergebnisse dieser Abfrage im Kontext der gesamten Datenbankaktivität zu interpretieren.

Bevor Sie einen ungenutzten Index löschen, sollten Sie sicherstellen, dass er wirklich nicht benötigt wird und nicht in Zukunft benötigt wird, z.B. durch saisonale Abfrageaktivität. Es ist auch eine gute Praxis, System- und Anwendungslogs sowie Abfragepläne zu überprüfen, bevor Sie Änderungen an Ihrer Datenbank vornehmen.

3.34.9 9. Weiterführende Überlegungen

3.34.10 TLDR

Die regelmäßige Wartung von Indizes in PostgreSQL ist genauso wichtig wie die Wartung der Daten selbst. Durch das Verständnis und die regelmäßige Anwendung der hier vorgestellten Prinzipien können Sie sicherstellen, dass Ihre Datenbankabfragen so effizient wie möglich sind und dass Sie den besten Nutzen aus Ihren Indizes ziehen. Indizes sollten als lebende Strukturen betrachtet werden, die Pflege und Aufmerksamkeit benötigen, um optimal zu funktionieren.

3.35 Upgrade

Das Upgrade von PostgreSQL auf einem Windows-System unterscheidet sich in einigen Schritten von einem UNIX-ähnlichen System. Das Vorgehen, die zugrundeliegenden Prinzipien und die Tools bleiben jedoch weitgehend identisch. Hier ist eine angepasste Version des Kapitel 19.6 (Version 15), die für Windows-Benutzer relevanter ist: ### 19.6. Upgrading a PostgreSQL Cluster on Windows

Upgrade beschreibt den Vorgang, wie Sie Ihre Datenbankdaten von einer PostgreSQL-Version auf eine neuere Version aktualisieren können.

Die Versionierung von PostgreSQL besteht aus einer Haupt- (Major) und einer Unter- (Minor) Version. Bei Versionen vor 10.0 gibt es drei Ziffern, wobei die ersten beiden Ziffern die Hauptversion und die letzte die Unter-Version darstellen, z.B. 9.5.3. Unter-Versionen ändern nie das interne Speicherformat und sind mit anderen Unter-Versionen derselben Hauptversion kompatibel. Das Aktualisieren zwischen kompatiblen Versionen erfolgt einfach durch den Austausch der ausführbaren Dateien und den Neustart des Servers.

Bei Hauptversionen kann sich das interne Speicherformat ändern, was Upgrades erschwert. Ein gängiger Weg ist das Dumpen und Wiederherstellen der Datenbank, obwohl dies langsam sein kann. Es gibt schnellere Methoden wie “pg_upgrade” und auch Replikationsmethoden. Bei vorgefertigten PostgreSQL-Versionen können Skripte für Hauptversion-Upgrades vorhanden sein.

Neue Hauptversionen führen oft zu sichtbaren Änderungen für den Benutzer, weshalb Programmänderungen erforderlich sein könnten. Es wird empfohlen, alle Versionshinweise für die beteiligten Hauptversionen zu lesen. Vorsichtige Nutzer sollten ihre Anwendungen mit der neuen Version testen, bevor sie vollständig umsteigen. Bei einem Upgrade sollten verschiedene Änderungskategorien berücksichtigt werden:

Eines der Upgrade-Verfahren besteht darin, Daten von einer Hauptversion von PostgreSQL zu sichern und in einer anderen wiederherzustellen. Hierfür müssen Sie ein logisches Backup-Tool wie pg_dumpall verwenden; Dateisystem-Backups funktionieren nicht.

Um eine Sicherungskopie Ihrer Datenbankinstallation zu erstellen, geben Sie ein:

pg_dumpall > outputfile

Den alten Server herunterfahren:

pg_ctl stop

Wenn Sie von einer Sicherung wiederherstellen, benennen Sie das alte Installationsverzeichnis um oder löschen Sie es:

rename C:\path\to\pgsql C:\path\to\pgsql.old

Installieren Sie die neue Version von PostgreSQL gemäß der Windows-Installationsanleitung.

Erstellen Sie gegebenenfalls einen neuen Datenbank-Cluster:

C:\path\to\new\pgsql\bin\initdb -D C:\path\to\new\pgsql\data

Stellen Sie Ihre vorherige pg_hba.conf und alle postgresql.conf-Änderungen wieder her.

Starten Sie den Datenbankserver:

C:\path\to\new\pgsql\bin\pg_ctl start -D C:\path\to\new\pgsql\data

Stellen Sie schließlich Ihre Daten aus dem Backup wieder her mit:

C:\path\to\new\pgsql\bin\psql -d postgres -f outputfile

19.6.2. Upgrading Data via pg_upgrade

Das Modul pg_upgrade ermöglicht das In-Place-Migrieren einer Installation von einer Hauptversion von PostgreSQL zu einer anderen auf Windows. Es erfordert Schritte ähnlich wie bei pg_dumpall oben, z. B. Starten/Stoppen des Servers, Ausführen von initdb. Die Dokumentation zu pg_upgrade skizziert die notwendigen Schritte.

19.6.3. Upgrading Data via Replication

Es ist auch möglich, logische Replikationsmethoden zu verwenden, um einen Standby-Server mit der aktualisierten Version von PostgreSQL zu erstellen. Dies ist möglich, weil die logische Replikation die Replikation zwischen verschiedenen Hauptversionen von PostgreSQL unterstützt. Der Standby-Server kann auf demselben Computer oder einem anderen Computer sein. Sobald er mit dem Hauptserver (der die ältere Version von PostgreSQL ausführt) synchronisiert ist, können Sie die Rollen tauschen und den Standby-Server zum Hauptserver machen und die ältere Datenbankinstanz herunterfahren. Ein solcher Rollentausch führt nur zu wenigen Sekunden Ausfallzeit für ein Upgrade. Dieses Vorgehen bietet eine effiziente Möglichkeit, die Systemverfügbarkeit während eines Upgrades hoch zu halten und minimiert das Risiko von Datenverlusten, da der Standby-Server als Backup dient, bis er zum Hauptserver wird.

3.35.1 Hinweis

Es ist wichtig zu beachten, dass beim Upgrade von PostgreSQL auf einem Windows-System bestimmte Pfadangaben und Befehle an das Windows-Umfeld angepasst werden müssen. Achten Sie darauf, dass Sie immer eine vollständige Sicherung Ihrer Daten haben, bevor Sie mit dem Upgrade beginnen, und testen Sie das Upgrade in einer nicht-produktiven Umgebung, bevor Sie es in einer Produktionsumgebung durchführen.

3.36 Partitionieren großer Tabellen

Das Partitionieren von Tabellen in PostgreSQL ermöglicht die Unterteilung großer Tabellen in kleinere, handhabbare Stücke, wobei jede Partition als eigenständige Tabelle fungiert. Dies erleichtert das Management großer Datenmengen und kann die Abfrageleistung erheblich verbessern.

3.36.1 1. Warum partitionieren?

3.36.2 2. Partitionierungsstrategien

Es gibt mehrere Ansätze:

3.36.3 3. Konkrete Implementierung

3.1. Erstellung einer partitionierten Tabelle

Zuerst erstellen Sie die “Master”-Tabelle, von der aus die Partitionen erstellt werden.

CREATE TABLE orders (
    order_id int not null,
    order_date date not null,
    product_id int not null
) PARTITION BY RANGE (order_date);

3.2. Erstellung von Partitionen

Für eine Range-Partitionierung:

CREATE TABLE orders_2023_q1 PARTITION OF orders FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');
CREATE TABLE orders_2023_q2 PARTITION OF orders FOR VALUES FROM ('2023-04-01') TO ('2023-07-01');

3.3. Eintragen von Daten

Wenn Sie Daten in die Haupttabelle orders einfügen, werden diese automatisch in die richtige Partition eingefügt:

INSERT INTO orders (order_id, order_date, product_id) VALUES (1, '2023-02-15', 1001);

3.36.4 4. Abfragen von partitionierten Tabellen

Sie können die Haupttabelle abfragen, als ob sie eine einzelne Tabelle wäre. PostgreSQL leitet die Abfrage automatisch an die richtige Partition weiter:

SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-03-31';

3.36.5 5. Wartung und Management

5.1. Hinzufügen neuer Partitionen

Wenn Sie eine neue Partition für das dritte Quartal 2023 hinzufügen möchten:

CREATE TABLE orders_2023_q3 PARTITION OF orders FOR VALUES FROM ('2023-07-01') TO ('2023-10-01');

5.2. Entfernen alter Partitionen

Das Entfernen einer Partition ist so einfach wie das Löschen einer Tabelle:

DROP TABLE orders_2022_q1;

3.36.6 6. Aufteilen auf Tablespaces

Sie können verschiedene Partitionen unterschiedlichen Tablespaces zuweisen. Das Zuweisen von Partitionen zu verschiedenen Tablespaces kann insbesondere dann nützlich sein, wenn Sie bestimmte Partitionen auf verschiedenen physischen Speichermedien oder Laufwerken platzieren möchten, um die I/O-Performance zu optimieren.

Beispiel:

Nehmen wir an, Sie haben zwei Tablespaces namens tbs_fast und tbs_slow, und Sie möchten zwei Partitionen Ihrer orders Tabelle unterschiedlichen Tablespaces zuweisen.

  1. Erstellen Sie zuerst die Tablespaces (wenn sie noch nicht existieren):
CREATE TABLESPACE tbs_fast LOCATION '/path/to/fast/storage';
CREATE TABLESPACE tbs_slow LOCATION '/path/to/slow/storage';
  1. Erstellen Sie die Haupttabelle:
CREATE TABLE orders (
    order_id int not null,
    order_date date not null,
    product_id int not null
) PARTITION BY RANGE (order_date);
  1. Erstellen Sie die Partitionen und weisen Sie sie den jeweiligen Tablespaces zu:
CREATE TABLE orders_2023_q1 PARTITION OF orders 
FOR VALUES FROM ('2023-01-01') TO ('2023-04-01')
TABLESPACE tbs_fast;

CREATE TABLE orders_2023_q2 PARTITION OF orders 
FOR VALUES FROM ('2023-04-01') TO ('2023-07-01')
TABLESPACE tbs_slow;

In diesem Beispiel wird die Partition orders_2023_q1 im Tablespace tbs_fast und die Partition orders_2023_q2 im Tablespace tbs_slow gespeichert.

Durch das Zuweisen von Partitionen zu spezifischen Tablespaces können Sie den physischen Speicherort Ihrer Daten gezielt steuern und so potenziell die Performance und das Management Ihrer Daten optimieren.

3.36.7 7. Tipps und Überlegungen

3.36.8 TLDR

Das Partitionieren von Tabellen in PostgreSQL kann bei großen Datenmengen erhebliche Vorteile bringen. Mit den richtigen Strategien und Überlegungen können Sie sicherstellen, dass Ihre Daten effizient organisiert, leicht zugänglich und einfach zu verwalten sind.

3.37 Monitoring

Einführung in pg_stat_statements und pg_stat: Überwachung in PostgreSQL

Das Überwachen der Aktivitäten und Leistung einer PostgreSQL-Datenbank ist entscheidend, um die Gesundheit und Effizienz des Systems zu gewährleisten. PostgreSQL bietet eingebaute statistische Ansichten, die Administratoren und Entwicklern helfen, die Leistung zu analysieren und Optimierungsmöglichkeiten zu identifizieren. Zwei dieser Ansichten sind pg_stat_statements und die Familie von pg_stat-Ansichten.

3.37.1 1. pg_stat_statements

Diese Ansicht ist entscheidend für das Verständnis, welche SQL-Anweisungen am meisten Ressourcen verbrauchen.

1.1 Aktivierung

Standardmäßig ist pg_stat_statements nicht aktiviert. So aktivieren Sie es:

shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION pg_stat_statements;

1.2 Nutzung

Nach der Aktivierung können Sie einfach die Ansicht abfragen:

SELECT * FROM pg_stat_statements;

Die Ansicht bietet viele nützliche Spalten wie total_time, calls, rows, query usw., die Informationen über die Ausführungszeit, Anzahl der Aufrufe, zurückgegebene Zeilen und den tatsächlichen SQL-Text bieten.

1.3 Beispiel

Um die Top 5 langsamsten Abfragen basierend auf der durchschnittlichen Ausführungszeit zu erhalten:

SELECT query, (total_time / calls) as avg_time 
FROM pg_stat_statements 
ORDER BY avg_time DESC 
LIMIT 5;

3.37.2 2. pg_stat-Familie

Die pg_stat-Familie von Ansichten bietet eine breite Palette von statistischen Daten über verschiedene Aspekte der Datenbank, z. B. Tabellen, Indizes, Sequenzen und Funktionen.

2.1 pg_stat_user_tables

Diese Ansicht gibt statistische Daten über Tabellen im Benutzerschema zurück:

SELECT relname, seq_scan, idx_scan, n_live_tup, n_dead_tup 
FROM pg_stat_user_tables 
WHERE n_dead_tup > 1000;

Dies zeigt Tabellen mit mehr als 1000 “toten” Zeilen, was ein Hinweis darauf sein könnte, dass ein VACUUM benötigt wird.

2.2 pg_stat_user_indexes

Diese Ansicht zeigt die Nutzung und Effizienz von Indizes:

SELECT relname, indexrelname, idx_scan, idx_tup_read, idx_tup_fetch 
FROM pg_stat_user_indexes 
WHERE idx_scan = 0;

Dies zeigt Indizes, die nie gescannt wurden, was darauf hindeuten könnte, dass sie nicht nützlich sind und entfernt werden könnten.

pg_stat_activity: Ein tiefes Eintauchen in laufende Aktivitäten

Eines der leistungsstärksten Tools in der PostgreSQL-Überwachungspalette ist pg_stat_activity. Diese Ansicht gibt Echtzeitinformationen über die aktuellen Aktivitäten in Ihrer Datenbank, was sie zu einem unverzichtbaren Werkzeug für die Diagnose von Leistungsproblemen, das Verfolgen von Abfrageaktivitäten und das Identifizieren von Blockierungen macht.

3.37.3 3. Einführung in pg_stat_activity

Die pg_stat_activity-Ansicht bietet eine Momentaufnahme der laufenden Aktivitäten aller Prozesse in einer PostgreSQL-Instanz. Sie enthält Daten wie die ID des Prozesses, den aktuellen Status (z.B. laufend, wartend), die laufende SQL-Anweisung, den Benutzer, die Verbindungsinformationen und vieles mehr.

3.37.4 4. Häufige Anwendungsfälle

4.1 Überprüfen aktiver Abfragen

Um alle aktuell laufenden Abfragen anzuzeigen:

SELECT pid, usename, query_start, state, query 
FROM pg_stat_activity 
WHERE state = 'active';

4.2 Finden von blockierten Abfragen

Um blockierte Abfragen und die Prozesse zu identifizieren, die diese Blockierungen verursachen:

SELECT a.pid AS waiting_pid,
       a.query AS waiting_query,
       b.pid AS blocking_pid,
       b.query AS blocking_query
FROM pg_stat_activity a
JOIN pg_stat_activity b ON a.waiting = b.pid
WHERE a.wait_event IS NOT NULL;

4.3 Überwachen von Verbindungszuständen

Um eine Zusammenfassung der Verbindungszustände (z.B. aktive, idle, idle in transaction) zu erhalten:

SELECT state, COUNT(*) 
FROM pg_stat_activity 
GROUP BY state;

3.37.5 5. Szenarien und Lösungen

3.1 Zu viele idle-Verbindungen

Wenn Sie feststellen, dass es viele idle-Verbindungen gibt, kann dies auf nicht geschlossene Verbindungen von Anwendungsseiten hinweisen. Das kann wertvolle Ressourcen verbrauchen und sollte behoben werden, indem Sie die Verbindungspools korrekt konfigurieren oder nicht benötigte Verbindungen schließen.

5.2 Lange laufende Transaktionen

Transaktionen, die zu lange “idle in transaction” sind, können andere Operationen blockieren und sollten vermieden werden:

SELECT pid, now() - xact_start AS duration, query 
FROM pg_stat_activity 
WHERE state = 'idle in transaction'
ORDER BY duration DESC;

3.37.6 5. Achtung bei der Abfrage von pg_stat_activity

Es ist wichtig zu beachten, dass das übermäßige und häufige Abfragen von pg_stat_activity selbst zu einer Belastung für den Server werden kann, besonders wenn es in sehr kurzen Intervallen erfolgt. Daher ist es ratsam, diese Abfragen in einem angemessenen und nicht-disruptiven Intervall durchzuführen.

3.37.7 TLDR

Die pg_stat-Familie und pg_stat_statements sind nur ein Teil der Überwachungstools, die PostgreSQL bereitstellt. Sie sind jedoch äußerst wertvoll und sollten regelmäßig von Administratoren und Entwicklern konsultiert werden, um die Leistung der Datenbank zu überwachen und zu optimieren. Indem Sie diese Ansichten richtig nutzen, können Sie Engpässe identifizieren, nicht benötigte Indizes erkennen und die allgemeine Gesundheit Ihrer PostgreSQL-Instanz überwachen.

pg_stat_activity ist ein äußerst nützliches Überwachungswerkzeug, das einen detaillierten Einblick in das gibt, was in Ihrer PostgreSQL-Instanz in Echtzeit vor sich geht. Indem Sie diese Ansicht effektiv nutzen, können Sie viele häufige Probleme diagnostizieren und beheben, die die Datenbankleistung beeinträchtigen könnten. Es sollte jedoch mit Sorgfalt verwendet werden, um sicherzustellen, dass die Überwachungsaktivitäten selbst keine zusätzliche Belastung für den Server darstellen.

3.38 Metric Exporter

Für PostgreSQL gibt es einen Exporter, der Metriken für das Monitoring mit Prometheus bereitstellt: den „PostgreSQL Exporter“. Dieser Exporter erlaubt es, detaillierte Metriken aus PostgreSQL zu sammeln und in einem Format bereitzustellen, das von Prometheus gelesen werden kann. Mit diesen Metriken können Sie den Zustand, die Performance und die Nutzung Ihrer PostgreSQL-Instanzen überwachen.

Hier sind die grundlegenden Schritte, um den PostgreSQL Exporter einzurichten:

  1. Download und Installation: Zunächst müssen Sie den neuesten Release von GitHub.com/wrouesnel/postgres_exporter herunterladen und installieren.

  2. Konfiguration: Der PostgreSQL Exporter benötigt die Verbindungsdetails für Ihre PostgreSQL-Instanz. Diese können als Umgebungsvariable oder direkt als Parameter beim Starten des Exporters angegeben werden.

    Beispielsweise können Sie die Umgebungsvariable DATA_SOURCE_NAME setzen:

    export DATA_SOURCE_NAME="postgresql://username:password@localhost:5432/mydb?sslmode=disable"

    Oder Sie können die Datenquelle direkt beim Starten angeben:

    ./postgres_exporter --web.listen-address=":9187" --web.telemetry-path="/metrics" --extend.query-path="/path/to/custom/queries.yml"
  3. Prometheus Konfiguration: Nachdem der Exporter läuft, müssen Sie Prometheus so konfigurieren, dass er die Metriken abholt. Fügen Sie den folgenden Job zu Ihrer prometheus.yml Datei hinzu:

    scrape_configs:
      - job_name: 'postgresql'
        static_configs:
        - targets: ['localhost:9187']
  4. Grafana Dashboards (optional): Wenn Sie Grafana verwenden, um Ihre Prometheus-Daten zu visualisieren, gibt es vordefinierte Dashboards für PostgreSQL, die Sie importieren können. Diese bieten eine schnelle und detaillierte Ansicht der wichtigsten Metriken Ihrer PostgreSQL-Instanzen.

  5. Weitere Anpassungen: Der PostgreSQL Exporter ist sehr konfigurierbar und ermöglicht das Hinzufügen von benutzerdefinierten Abfragen, um spezifische Metriken zu sammeln, die für Ihre Anwendung oder Ihr System relevant sind.

3.39 Monitoring der Disk Usage in PostgreSQL

Das Monitoring des Speicherverbrauchs ist entscheidend für die Leistung und das reibungslose Funktionieren von PostgreSQL-Datenbanksystemen. Ein unerwartet voller Speicherplatz kann nicht nur die Datenbankleistung beeinträchtigen, sondern auch dazu führen, dass das System unerwartet ausfällt. In diesem Artikel werden wir untersuchen, wie Sie den Speicherverbrauch in PostgreSQL überwachen und wie Sie sich auf potenzielle Probleme vorbereiten können.

3.39.1 1. Grundlegendes zum Speicherverbrauch

Die Größe einer PostgreSQL-Datenbank kann durch viele Faktoren beeinflusst werden, darunter:

3.39.2 2. Ermittlung der Größe der Datenbank

Mit folgendem Befehl können Sie die Größe jeder Datenbank in Ihrer PostgreSQL-Instanz abfragen:

SELECT datname, pg_size_pretty(pg_database_size(datname)) 
FROM pg_database;

3.39.3 3. Ermittlung der Größe von Tabellen und Indizes

Um einen detaillierteren Überblick über den Speicherverbrauch zu bekommen, können Sie die Größe jeder Tabelle und jedes Index in Ihrer Datenbank abfragen:

SELECT 
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS total,
    pg_size_pretty(pg_relation_size(schemaname || '.' || tablename)) AS data,
    pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename) - pg_relation_size(schemaname || '.' || tablename)) AS external
FROM pg_tables
ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC;

3.39.4 4. Überwachung des Speicherverbrauchs von WAL-Dateien

Die WAL-Dateien (Write-Ahead Logging) können erheblichen Speicherplatz beanspruchen, besonders wenn archive_mode aktiviert ist:

SELECT pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), '0/0'));

3.39.5 5. Automatisiertes Monitoring

Es gibt viele Monitoring-Tools und -Lösungen, die Ihnen helfen können, den Speicherverbrauch in PostgreSQL zu überwachen:

3.39.6 6. Handlungsempfehlungen

Wenn Sie feststellen, dass Ihr Speicherplatz knapp wird: