Datenbanken verwalten

PostgreSQL ist ein RDBMS. Die Infrastruktur von Debian erleichtert es, auf einem Host verschiedene Versionen (im Beispiel 13 und 15) und mehrere Instanzen (Vorgabe ist main) parallel zu verwalten.

Glossar

Objekt Englisch Beispiel Beschreibung
Instanz cluster 15-main Bündel von Rollen und Datenbanken
Rolle role postgres Sammlung von Privilegien beim Zugriff auf Objekte
Benutzer user postgres Inhaber einer oder mehrerer Rollen
Datenbank database postgres Behälter für Schemas im Besitz eines Benutzers
Schema schema public Behälter für Tabellen, Sichten, Funktionen, Auslöser, …
Tabelle table pg_settingsMenge von Datensätzen mit definierten Spalten
Sicht view Querschnitt über Daten einer oder mehrerer Tabellen
Auslöser trigger Reaktion auf Änderungen
Funktion function Aufrufbare Funktionen
Erweiterungextension Externes Modul

Pakete installieren

Das Paket postgresql installiert die aktuelle Version und erzeugt eine Instanz mit dem Namen 15-main.

apt install --no-install-recommends postgresql

Alle vorhandenen Instanzen lassen sich entweder über Systemwerkzeuge oder die mitgelieferten Programme starten, stoppen und überwachen.

systemctl status postgresql
systemctl status postgresql@15-main
pg_ctlcluster 15 main status
pg_ctl: Server läuft (PID: 14022)
/usr/lib/postgresql/15/bin/postgres "-D" "/var/lib/postgresql/15/main" \
	"-c" "config_file=/etc/postgresql/15/main/postgresql.conf"
pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
15  main    5432 online postgres /var/lib/postgresql/15/main /var/log/postgresql/postgresql-15-main.log

Instanz konfigurieren

Die Startkonfiguration legt fest, ob die jeweilige Instanz beim Systemstart automatisch gestartet wird, oder ob der Systemadministrator dies manuell durchführt.

/etc/postgresql/15/main/start.conf
auto
auto Automatisch via systemd
manual Manuell mit pg_ctlcluster
disabled Start verweigern

In der Konfigurationsdatei werden die Pfade für Zugriffsrechte, Protokolle, Nutzdaten, Zertifikate sowie Netzwerkeinstellungen, Speicherverwaltung Land und Sprache festgelegt.

/etc/postgresql/15/main/postgresql.conf
data_directory = '/var/lib/postgresql/15/main hba_file = '/etc/postgresql/15/main/pg_hba.conf' ident_file = '/etc/postgresql/15/main/pg_ident.conf' external_pid_file = '/var/run/postgresql/15-main.pid' listen_addresses = '*' port = 5432 max_connections = 100 unix_socket_directories = '/var/run/postgresql' password_encryption = 'scram-sha-256' ssl = on ssl_cert_file = '/etc/ssl/durmstrang.crt' ssl_key_file = '/etc/ssl/durmstrang.key' ssl_ca_file = '/etc/ssl/ca.crt' ssl_crl_file = '/etc/ssl/ca.crl' shared_buffers = 128MB dynamic_shared_memory_type = posix max_wal_size = 1GB min_wal_size = 80MB log_line_prefix = '%m [%p] %q%u@%d ' log_timezone = 'Europe/Berlin' cluster_name = '15/main' track_counts = on autovacuum = on datestyle = 'iso, dmy' lc_messages = 'de_DE.UTF-8' lc_monetary = 'de_DE.UTF-8' lc_numeric = 'de_DE.UTF-8' lc_time = 'de_DE.UTF-8' default_text_search_config = 'pg_catalog.german'

Zugriff gewähren

Jede Instanz hat einen Administrator mit uneingeschränkten Rechten, der normalerweise postgres heißt. Die Hostbasierte Authentifizierung (HBA) verknüpft Datenbanken, Benutzer und Netzwerke mit einer Authentifizierungsmethode.

/etc/postgresql/15/main/pg_hba.conf
# Database User Address Method local all postgres peer local all all peer local replication all peer hostssl all all ::1/128 scram-sha-256 hostssl all all 127.0.0.1/32 scram-sha-256 hostssl all all 2001:1b18:a1::70/128 scram-sha-256 hostssl replication replicant 2001:1b18:a1::70/128 scram-sha-256
trust Ohne Passwort
peer Systembenutzer
ident Systembenutzer
password Klartext-Passwort
md5 Streuwert des Passworts
cert X.509 Client-Zertifikat
gss GSSAPI Kerberos
radius RADIUS
ldap LDAP
pam PAM

Instanz replizieren

Auf dem Primärserver legen wir einen speziell für die Replikation zuständigen Benutzer an.

su postgres -c 'createuser replicant --replication --pwprompt'

In der Konfiguration aktivieren wir die Archiverung des WAL.

/etc/postgresql/15/main/postgresql.conf
listen_addresses = '*' archive_mode = on archive_command = 'cp %p /var/lib/postgresql/15/main/archive/%f' wal_level = replica wal_keep_segments = 10 max_wal_senders = 5 hot_standby = off

Schließlich legen wir das Puffer-Verzeichnis für das WAL an und starten PostgreSQL mit der neuen Konfiguration.

mkdir -p -m 0700        /var/lib/postgresql/15/main/archive
chown postgres.postgres /var/lib/postgresql/15/main/archive
systemctl restart postgresql

Auf dem Bereitschafts-Server stoppen wir den Daemon und ziehen eine vollständige Kopie der Datenbanken vom Primärserver inklusive Datenbanksystemidentifikator.

systemctl stop postgresql
rm -rf /var/lib/postgresql/15/main
pg_basebackup \
	--user replicant \
	--secret \
	--host durmstrang.illusioni.de \
	--port 5432 \
	--checkpoint=fast \
	--wal-method=stream \
	--pgdata /var/lib/postgresql/15/main \
	--write-recovery-conf \
	--progress

Dieses Kommando erzeugt automatisch eine Bereitschafts-Konfiguration:

/var/lib/postgresql/15/main/postgresql.auto.conf
primary_conninfo = 'user=replicant password=Password channel_binding=prefer host=durmstrang.illusioni.de port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

In der Konfigurationsdatei aktivieren wir den Bereitschaftsmodus, so dass keine Schreibenden Zugriffe erlaubt sind.

/etc/postgresql/15/main/postgresql.conf
hot_standby = on

Schließlich starten wir den Daemon mit der neuen Konfiguration.

mkdir -p -m 0700           /var/lib/postgresql/15/main/archive
chown -R postgres.postgres /var/lib/postgresql/15/main
systemctl start postgresql

Datenbanken sichern

pg_basebackup
Datenverzeichnisse sichern
pg_dumpall
Alle Datenbanken als SQL-Skript sichern
pg_dump
Einzelne Datenbank, Schema oder Tabelle sichern
pg_restore
Datenbanken aus Sicherung wiederherstellen

Datenbanken verwalten

Benutzer anlegen

CREATE ROLE User PASSWORD 'Password';

Datenbank anlegen

CREATE DATABASE DbName OWNER User;

Speicherplatz freigeben

VACUUM ANALYZE;

Konfiguration auslesen

SELECT context, name, unit, setting, boot_val, reset_val FROM pg_settings ORDER BY context, name;

Aktuelle Verbindungen auflisten

SELECT * FROM pg_stat_activity;

Aktive Anfrage beenden

SELECT pg_cancel_backend(Pid);

Verbindung beenden

SELECT pg_terminate_backend(Pid);

Referenz

Diese Auflistung soll nur einen Überblick über die verfügbaren Kommandos und Optionen vermitteln und erhebt keinen Anspruch auf Vollständigkeit. Als authoritative Quelle gelten nur die Manpages und die offizielle Dokumentation.

Programm Option Argument Beschreibung
-? --help Hilfe ausgeben
-V --version Version ausgeben
-h --host localhost Rechnername
-p --port 5432 Kanalnummer
-U --username User Anmeldename
-w --no-password Anmeldepasswort aus ~/.pgpass lesen
-W --password Anmeldepasswort abfragen (default)
Datenbank
createuser User Neuen Benutzer anlegen
-c --connection-limit Count Anzahl der Verbindungen begrenzen
-d --createdb Benutzer darf Datenbanken anlegen
-D --no-createdb (default)
-E --encrypted (obsolet)
-e --echo CREATE ROLE-Anweisung ausgeben
-g --role User Rollen zuweisen
-i --inherit Privilegien erben (default)
-I --no-inherit
--interactive Benutzername abfragen
-l --login Benutzer darf sich anmelden (default)
-L --no-login
-P --pwprompt Passwort setzen (default)
-r --createrole Benutzer darf Rollen anlegen (CREATEROLE)
-R --no-createrole (default)
-S --no-superuser (default)
-s --superuser Benutzer darf alles
--replication Benutzer darf replizieren (REPLICATION)
--no-replication (default)
createdb DbName [Description]Neue Datenbank anlegen
-e --echo CREATE DATABASE-Kommandos ausgeben
-O --owner User Eigentümer festlegen
-T --template template1 Template
-D --tablespace public Default Tablespace festlegen
-E --encoding UTF-8 Zeichenkodierung festlegen
-l --locale de_DE Lokalisierung festlegen
Sicherung
pg_dumpall Alle Datenbanken als Skript sichern
-f --file File Skript in Datei schreiben
-a --data-only Nur INSERT-Anweisungen ausgeben
-E --encoding UTF-8 Textdaten transkodieren
-g --globals-only Nur globale Objekte ausgeben
-o --oids Objektnummern ausgeben
-O --no-owner Eigentumsrechte unterdrücken
-r --roles-only Nur CREATE ROLE-Anweisungen ausgeben
-s --schema-only Nur CREATE-Anweisungen ausgeben
-S --superuser postgres Name des Superusers
-t --tablespaces-only Nur CREATE TABLESPACE ausgeben
-x --no-privileges Kein GRANT- oder REVOKE ausgeben
pg_dump DbName Datenbank für pg_restore sichern
-f --file File Ausgabe in Datei schreiben
-j --jobs Count Jobs parallelisieren
-F --format [pcdt] Ausgabeformat festlegen
-Z --compress [0-9] Komprimierungsgrad für tar festlegen
-a --data-only Nur INSERT ausgeben
-b --blobs Binärobjekte ausgeben
-B --no-blobs Binärobjekte nicht ausgeben
-c --clean DROPAnweisungen ausgeben
-C --create CREATE DATABASE-Anweisung ausgeben
-E --encoding UTF-8 Textdaten transkodieren
-n --schema Name Nur dieses Schema ausgeben
-N --exclude-schema Name Dieses Schema nicht ausgeben
-o --oids Objektnummern ausgeben
-O --no-owner Eigentumsrechte unterdrücken
-s --schema-only Nur CREATE-Anweisungen ausgeben
-S --superuser Name Name des Superusers für Klartext-Format
-t --table Name Nur diese Tabelle ausgeben
-T --exclude-table Name Diese Tabelle nicht ausgeben
-x --no-privileges Kein GRANT- oder REVOKE ausgeben
pg_restore File Datenbanken aus pg_dump-Datei wiederherstellen
-f --file File Ausgabe in Datei schreiben
-j --jobs Count Jobs parallelisieren
-F --format [cdt] Eingabeformat festlegen
-l --list Inhaltsverzeichnis anzeigen
-a --data-only Nur INSERT-Anweisungen ausführen
-c --clean DROP-Anweisungen ausfühen
-C --create CREATE DATABASE ausführen
-e --exit-on-error Beim ersten Fehler beenden
-I --index Name Nur diesen Index wiederherstellen
-L --use-list File Ausgabe entsprechend Vorlage sortieren
-n --schema Name Nur dieses Schema wiederherstellen
-N ---exclude-schema Name Dieses Schema nicht wiederherstellen
-O --no-owner Eigentumsrechte ignorieren
-P --function Name(Args)Funktion wiederherstellen
-s --schema-only Nur CREATE-Anweisungen ausführen
-S --superuser Name Name des Superusers, um Trigger auszuschalten
-t --table Name Nur diese Tabelle wiederherstellen
-T --trigger Name Nur diesen Trigger wiederherstellen
-x --no-privileges Kein GRANT- oder REVOKE ausführen
-1 --single-transaction Nur eine Transaktion verwenden
Instanz
pg_lsclusters Instanzen und deren Staus auflisten
-h --no-header Kopfzeile unterdrücken
-j --json Daten im JSON-Format ausgeben
-s --start-conf Spalte für Start-Konfiguration ausgeben
pg_createcluster Version Name Neue Instanz erzeugen
/etc/postgresql-common/createcluster.conf
-u --user postgres Name des Superusers
-g --group postgres Primäre Gruppe
-d --datadir Dir Statt /var/lib/postgresql/%v/%c
-s --socketdir Dir Statt /var/run/postgresql/
-l --logfile File Statt /var/log/postgresql/postgresql-%v-%c.log
pg_ctlcluster Version Name Daemon starten und stoppen
start Daemon starten
stop Daemon schnell beenden
restart Daemon stoppen und starten
reload Konfiguration erneut einlesen
status Status und PID ausgeben
promote Bereitschafts- zum Primärserver machen
pg_basebackup -D --pgdata Dir Instanz in diesem Verzeichnis empfangen
(/var/lib/postgresql/%v/%c)
-F --format [pt] Ausgabeformat festlegen
-r --max-rate Kbps Transferrate limitieren
-R --write-recovery-conf Bereitschafts-Konfiguration erzeugen
-T --tablespace-mappingOld=New Tablespace verlagern
--waldir Dir Verzeichnis für das Write-Ahead-Log
-X --wal-method none|… WAL einbeziehen
-z --gzip Tar-Ausgabe komprimieren
-Z --compress 0-9 Komprimierungsgrad für tar festlegen
-c --checkpoint fast|spread Kontrollpunkte schnell oder verteilt setzen
-C --create-slot Slot für Replikation erzeugen
-l --label Name Etikett anheften
-n --no-clean Nach Fehlern nicht aufräumen
-N --no-sync Nicht auf Festplatte warten
-P --progress Fortschritt anzeigen
-S --slot Name Replikations-Slot festlegen
pg_upgradecluster OldVersion Name [NewDatadir]Instanz auf neue Version migrieren
-v NewVersion Zielversion, normalerweise die Neueste
--logfile File Protokoll In Datei schreiben
--locale Locale Lokalisierung ändern
-m --method dump|upgrade pg_dump/pg_restore oder pg_upgrade verwenden
-k --link Hardlinks seten statt Dateien zu kopieren
-j --jobs Jobs parallelisieren
--rename Name Neue Instanz umbenennen
--old-bindir Dir Verzeichnis für pg_upgrade
--[no-]start Neue Instanz sofort starten
pg_renamecluster Version OldName NewName Instanz umbenennen und Konfiguration anpassen
pg_dropcluster Version Name Instanz vollständig löschen
--stop Instanz vorher stoppen
p=plain SQL-Anweisungen
c=custom Binärformat
d=directory Dateien toc.dat und restore.sql
t=tar Tar-Archiv mit diesen Dateien
none
fetch
stream

Literatur

  1. PostgreSQL Documentation