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.
| 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_settings | Menge 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 | |
| Erweiterung | extension | Externes Modul |
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
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.confauto
| 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.confdata_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'
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 |
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.conflisten_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.confprimary_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.confhot_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
pg_basebackuppg_dumpallpg_dumppg_restoreBenutzer 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);
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-mapping | Old=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 |