1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

Datenbanken verwalten

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

Pakete installieren

Das Paket postgresql installiert die aktuelle Version und erzeugt eine Instanz mit dem Namen 11-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@11-main
pg_ctlcluster 11 main status
pg_ctl: Server läuft (PID: 14022)
/usr/lib/postgresql/11/bin/postgres "-D" "/var/lib/postgresql/11/main" \
	"-c" "config_file=/etc/postgresql/11/main/postgresql.conf"
pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
11  main    5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-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/11/main/start.conf
auto
auto Automatisch via systemd
manual Manuell mit pg_ctlcluster
disabled Start verweigern

In der Hauptkonfiguration werden die Pfade für Konfigurationsdateien, Protokolle sowie Nutzdaten und konfiguriert Netzwerkeinstellungen, Speicherverwaltung sowie Land und Sprache festgelegt.

/etc/postgresql/11/main/postgresql.conf
data_directory = '/var/lib/postgresql/11/main hba_file = '/etc/postgresql/11/main/pg_hba.conf' ident_file = '/etc/postgresql/11/main/pg_ident.conf' port = 5432 max_connections = 100 unix_socket_directories = '/var/run/postgresql' ssl = on ssl_cert_file = '/etc/ssl/durmstrang.crt' ssl_key_file = '/etc/ssl/durmstrang.key' 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 = '11/main' stats_temp_directory = '/var/run/postgresql/11-main.pg_stat_tmp' 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' include_dir = 'conf.d' external_pid_file = '/var/run/postgresql/11-main.pid'

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/11/main/pg_hba.conf
# Database User Address Method local all postgres peer map=admin local all all peer local replication all peer hostssl all all ::1/128 md5 hostssl all all 127.0.0.1/32 md5 hostssl replication replicant 81.92.164.64/26 md5

Die Identitätstabelle bildet Systembenutzer auf PostgreSQL-Rollen ab. Wenn man als root angemeldet ist, kann man mit folgender Konfiguration direkt als Superuser agieren.

/etc/postgresql/11/main/pg_ident.conf
# Mapname System Postgres admin root postgres admin postgres postgres
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 Hauptserver legen wir einen speziell für die Replikation zuständigen Benutzer an.

su postgres -c "psql --user postgres postgres"

Und dann

CREATE ROLE replicant REPLICATION LOGIN PASSWORD 'Password';

In der Hauptkonfiguration aktivieren wir die Archiverung des WAL.

/etc/postgresql/11/main/conf.d/master.conf
listen = '*' archive_mode = on archive_command = 'cp %p /var/lib/postgresql/11/main/archive/%f' wal_level = replica wal_keep_segments = 10 max_wal_senders = 5

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/11/main/archive
chown postgres.postgres /var/lib/postgresql/11/main/archive
systemctl restart postgresql

Auf dem Slave stoppen wir den Daemon und ziehen eine vollständige Kopie des Masters inklusive dem Datenbanksystemidentifikator.

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

In der automatisch erzeugten Standby-Konfiguration ergänzen wir ein Kommando zum nachfahren gepufferter WALs.

/var/lib/postgresql/11/main/recovery.conf
standby_mode = on primary_conninfo = 'user=replicant password=Password host=durmstrang port=5432 sslmode=prefer sslcompression=0 krbsrvname=postgres target_session_attrs=any application_name=replica1' trigger_file = 'failover.now' restore_command = 'cp %p /var/lib/postgresql/11/main/archive/%f'

In der Hauptkonfiguration aktivieren wir den Bereitschaftsmodus, der dazu führt, dass PostgreSQL die Standby-Konfiguration berücksichtigt.

/etc/postgresql/11/main/conf.d/slave.conf
listen = '*'* hot_standby = on

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

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

Datenbanken sichern

@todo
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

apt install --no-install-recommends pgadmin3

Kommandos in psql [--host Host] --user User [Password]

Benutzer anlegen

CREATE ROLE User PASSWORD '123' ENCRYPTED NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
CREATE DATABASE DbName OWNER User;

Konfiguration auslesen

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

Liste aktueller Verbindungen

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 Hostname
-p --port 5432 Portnummer
-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 --superuser Benutzer darf alles
-S --no-superuser (default)
--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 Standby-Server zum Master 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 Standby-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

Glossar

Objekt Englisch Beispiel Beschreibung
Instanz cluster 11-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

Literatur

  1. PostgreSQL 11.7 Documentation