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.
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
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.confauto
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.confdata_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'
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 |
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.conflisten = '*' 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.confstandby_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.conflisten = '*'* 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
pg_basebackup
pg_dumpall
pg_dump
pg_restore
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);
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 | 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 | 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-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 |
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_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 |