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_basebackup
pg_dumpall
pg_dump
pg_restore
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);
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 | DROP Anweisungen 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 |