PostgreSQL
|
Benutzer der Fedora Server Edition finden weitere Informationen unter Einrichten eines PostgreSQL-Datenbankservers. |
Installation
Die Installation und Initialisierung des PostgreSQL-Servers unterscheidet sich etwas von anderen Paketen und Linux-Distributionen. Dieses Dokument fasst die grundlegenden Installationsschritte für aktuelle Fedora-Linux-Versionen zusammen.
sudo dnf install postgresql-server postgresql-contrib
Der PostgreSQL-Server ist standardmäßig deaktiviert und läuft nicht. Um ihn so einzustellen, dass er beim Systemstart automatisch gestartet wird, führen Sie folgenden Befehl aus:
sudo systemctl enable postgresql
Die Datenbank muss nach der Installation mit Initialdaten befüllt werden. Die Datenbankinitialisierung kann mit dem folgenden Befehl erfolgen. Dadurch werden die Konfigurationsdateien postgresql.conf und pg_hba.conf erstellt.
sudo postgresql-setup --initdb --unit postgresql
Um den PostgreSQL-Server manuell zu starten, führen Sie folgenden Befehl aus:
sudo systemctl start postgresql
Anlegen von Benutzer und Datenbank
Nun müssen Sie einen Benutzer und eine Datenbank für diesen Benutzer erstellen. Dies muss von einem postgres-Benutzerkonto auf Ihrem System ausgeführt werden.
sudo -u postgres psql
Hier können Sie einen postgres-Benutzer und eine Datenbank erstellen. Wir gehen hier davon aus, dass Ihr Benutzerkonto den Namen lenny trägt. Hinweis: Sie können dies auch über die Shell mit createuser lenny und createdb --owner=lenny carl ausführen.
postgres=# CREATE USER lenny WITH PASSWORD 'leonard'; postgres=# CREATE DATABASE my_project OWNER lenny;
Es wäre ratsam, bei dieser Gelegenheit auch ein Passwort für den Benutzer postgres hinzuzufügen:
postgres=# \password postgres
Drücken Sie Strg + D oder \q, um die psql-Sitzung als Benutzer postgres weiterlaufen zu lassen. Jetzt können Sie von Ihrem Benutzerkonto (lenny) auf Ihre neue Datenbank zugreifen und sie verwenden.
psql mein_Projekt
Erstkonfiguration
Der PostgreSQL-Server verwendet zwei Hauptkonfigurationsdateien:
-
/var/lib/pgsql/data/postgresql.conf
-
/var/lib/pgsql/data/pg_hba.conf
Wenn Ihre Anwendung Identifizierungsfehler verursacht, müssen Sie wahrscheinlich die unter https://serverfault.com/questions/406606/postgres-error-message-fatal-ident-authentication-failed-for-user?newreg=a4fdc3e21349449985cc65b82399c5b4 beschriebene Lösung anwenden.
sudo gedit /var/lib/pgsql/data/pg_hba.conf
und ändern Sie host all all 127.0.0.1/32 ident in host all all 127.0.0.1/32 md5 und host all all ::1/128 ident in host all all ::1/128 md5. Starten Sie anschließend den postgresql-Dienst neu, damit die Änderungen wirksam werden.
sudo systemctl restart postgresql
Diese Änderungen sollten es den meisten Anwendungen ermöglichen, sich mit Benutzername/Passwort zu verbinden.
Aktualisierung
Wie Sie der Fehlermeldung in meinem Beispiel entnehmen können, handelt es sich nicht um eine Neuinstallation, sondern um eine Aktualisierung.
Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com postgresql-check-db-dir[2108]: An old version of the database format was found. Nov 14 11:45:56 mlich-lenovo.usersys.redhat.com postgresql-check-db-dir[2108]: Use "postgresql-setup upgrade" to upgrade to version 9.3.
Mit Version 9 können Sie das Aktualisierungswerkzeug verwenden. Es ist als postgresql-upgrade paketiert:
postgresql-setup upgrade Redirecting to /bin/systemctl stop postgresql.service Upgrading database: OK The configuration files was replaced by default configuration. The previous configuration and data are stored in folder /var/lib/pgsql/data-old. See /var/lib/pgsql/pgupgrade.log for details.
The data are located at
-
/var/lib/pgsql/data
-
/var/lib/pgsql/data-old
Die Aktualisierung selbst sichert Ihre bestehenden Daten und migriert Ihre Datenbank. Vergessen Sie nicht, Ihre Konfiguration zu migrieren (z.B. mit meld /var/lib/pgsql/data{,-old}/postgresql.conf).
Möglicherweise müssen Sie PostgreSQL vor der Aktualisierung in den Vertrauensmodus versetzen. Dies sollte bereits behoben sein.
Sie können die Aktualisierung auch durchführen, indem Sie Ihre Datenbank sichern und anschließend wieder laden. Weitere Informationen finden Sie in der offiziellen Dokumentation.
Haupt-Release wurde übersprungen
In Fedora 43 wurden die Postgres-Pakete von Version 16 auf 18 aktualisiert. Datenbankaktualisierungen können keine Hauptversion überspringen, daher funktioniert das oben beschriebene Verfahren nicht. Sofern Sie nicht bereits unter Fedora 42 auf Postgres 17 aktualisiert hatten, müssen Sie die Aktualisierung von 16 auf 18 unter Fedora 43 in zwei Schritten durchführen.
Zuerst müssen Sie PostgreSQL 18 deinstallieren und PostgreSQL 17 installieren. Mit rpm -qa |grep ^postgres können Sie überprüfen, welche Pakete installiert sind. Sichern Sie vor der Installation von PostgreSQL 17 Ihr Datenverzeichnis. Auch wenn eine Datensicherung Teil des Aktualisierungsprozesses ist, ist Vorsicht besser als Nachsicht. Nach der Installation der PostgreSQL-17-Pakete können Sie mit dem oben beschriebenen Aktualisierungsprozess die eigentliche Aktualisierung von Version 16 auf 17 durchführen. Anschließend müssen Sie PostgreSQL 17 deinstallieren und PostgreSQL 18 erneut installieren. Führen Sie den oben beschriebenen Aktualisierungsprozess ein letztes Mal aus. Fertig!
Im Verlauf dieses zweistufigen Verfahrens können einige Hindernisse auftreten, die hier erläutert werden:
Falls die Fehlermeldung old cluster does not use data checksums but the new one does erscheint, können Sie entweder die Prüfsummen erstellen oder die Aktualisierung mit deaktivierten Prüfsummen durchführen. Um die Prüfsummen zu erstellen, wechseln Sie in die Shell des Benutzers postgres und führen Sie folgenden Befehl aus: pg_checksums -e -D <Datenverzeichnis>. Wenn diese Fehlermeldung erscheint, haben Sie die Pakete jedoch bereits auf eine neuere Version aktualisiert, während die Datenbank noch die vorherige Version verwendet. Daher ist es möglicherweise einfacher, mit PGSETUP_INITDB_OPTIONS="--no-data-checksums" postgresql-upgrade <Datenverzeichnis> eine Aktualisierung durchzuführen und die Prüfsummen anschließend zu erstellen. Sofern Sie das PostgreSQL-Datenverzeichnis nicht geändert haben, ist <Datenverzeichnis> das Verzeichnis /var/lib/pgsql/data.
Vergessen Sie nicht, Ihre Konfigurationsdateien (*.conf) aus den alten und neuen Datenverzeichnissen anzupassen und zusammenzuführen sowie die Sortierung für alle Datenbanken zu aktualisieren.
Aktualisieren Sie die Sortierung (als postgres-Benutzer): ALTER DATABASE <Datenbankname> REFRESH COLLATION VERSION; \c <Datenbankname>; REINDEX DATABASE;
Firewall
PostgreSQL läuft auf Port 5432 (oder dem Port, den Sie in Ihrer postgresql.conf festgelegt haben). In firewalld können Sie ihn folgendermaßen öffnen:
# make it last after reboot firewall-cmd --permanent --add-port=5432/tcp # change runtime configuration firewall-cmd --add-port=5432/tcp
Im Fall von iptables:
iptables -A INPUT -p tcp --dport 5432 -m state --state NEW,ESTABLISHED -j ACCEPT
Bedenken Sie, dass Sie Ihren Datenbankserver wahrscheinlich nicht für die ganze Welt zugänglich machen möchten.
SELinux
Wenn SELinux im Erzwingungsmodus aktiviert ist, können Probleme auftreten, wenn Sie nicht-standardmäßige Konfigurationen vornehmen möchten. Wenn Sie beispielsweise den Speicherort Ihrer Datenbank ändern möchten, müssen Sie eine neue Kontextzuordnung für den neuen Speicherort hinzufügen:
semanage fcontext -a -t postgresql_db_t "/mein/neuer/Speicherort(/.*)?"
Falls der Standardport für Sie nicht funktioniert, müssen Sie möglicherweise den Porttyp von postgres dem gewünschten Port zuordnen:
semanage port -a -t postgresql_port_t -p tcp 5433
Wenn Sie eine Webanwendung installieren, die über TCP/IP mit PostgreSQL kommunizieren möchte, müssen Sie SELinux auf dem Webserver-Host anweisen, dies zuzulassen:
setsebool -P httpd_can_network_connect_db on
Konfiguration
Wie bereits erwähnt, verwendet der PostgreSQL-Server zwei Hauptkonfigurationsdateien.
-
/var/lib/pgsql/data/postgresql.conf
-
/var/lib/pgsql/data/pg_hba.conf
systemd
Einige Konfigurationsparameter werden dem Daemon über Befehlszeilenoptionen übergeben. Dieses Verhalten kann Einstellungen in postgresql.conf überschreiben. Wenn Sie beispielsweise die Portnummer des Servers auf 5433 ändern möchten, erstellen Sie eine Datei namens /etc/systemd/system/postgresql.service mit folgendem Inhalt:
.include /lib/systemd/system/postgresql.service [Service] Environment=PGPORT=5433
Hinweis: Eine Änderung von PGPORT oder PGDATA erfordert in der Regel auch eine Anpassung der SELinux-Konfiguration; siehe Abschnitt SELinux.
Bitte schauen Sie in die Systemd-Dokumentation 2 für weitere Details.
postgresql.conf
Wenn PostgreSQL Netzwerkverbindungen akzeptieren soll, sollten Sie Folgendes ändern:
listen_addresses = 'localhost'
in
listen_addresses = '*'
pg_hba.conf
Sobald Ihre Datenbank eingerichtet ist, müssen Sie den Zugriff auf Ihren Datenbankserver konfigurieren. Dies kann durch Bearbeiten der Datei /var/lib/pgsql/data/pg_hba.conf erfolgen. Die Datei enthält unter anderem folgende Regeln:
# TYPE DATABASE USER ADDRESS METHOD host all all 127.0.0.1/32 md5 host all all ::1/128 md5 local all postgres peer
Das erste Feld steht für den Verbindungstyp. Es kann folgende Werte annehmen:
-
local — Unix-Domain-Socket
-
host — unverschlüsselter oder SSL-verschlüsselter TCP/IP-Socket
-
hostssl — ein SSL-verschlüsselter TCP/IP-Socket
-
hostnossl — unverschlüsselter TCP/IP-Socket
Die letzte Spalte gibt an, welche Authentifizierungsmethode verwendet wird.
-
md5 – Der Client muss ein mit dem MD5-Algorithmus verarbeitetes Passwort bereitstellen
-
ident – Benutzernamen des verbundenen Clients vom Betriebssystem abrufen und mit der angegebenen Zuordnung vergleichen
-
trust – Jeder, der sich mit dem PostgreSQL-Server verbinden kann, kann sich wie jeder andere Benutzer verhalten, ohne ein Passwort anzugeben
-
peer — ermittelt den Benutzernamen vom Betriebssystem und prüft, ob er mit dem Benutzernamen in der Datenbank übereinstimmt
Bei der Authentifizierung des Clients sucht der Datenbankserver nach einem Datensatz mit übereinstimmendem Verbindungstyp, Clientadresse, angeforderter Datenbank und Benutzernamen. Sobald diese Daten gefunden wurden, wird die Authentifizierung durchgeführt. Schlägt die Authentifizierung fehl, werden keine weiteren Datensätze berücksichtigt. Findet sich kein passender Datensatz, wird dem Client der Zugriff verweigert.
Die Standardeinstellungen sind üblicherweise auf localhost beschränkt.
Wenn Sie Ihren Datenbankserver installieren und ihn zum ersten Mal in Betrieb nehmen, sollten Sie Firewall und SELinux deaktivieren und die postgres-Authentifizierung auf permissiv stellen. Beachten Sie, dass dies Ihren Server stark gefährdet. Führen Sie diese Schritte daher nur in einem vertrauenswürdigen Netzwerk durch – idealerweise ohne Netzwerkverbindung:
host all all 127.0.0.1/32 trust
Sobald Sie eine Verbindung herstellen können, schalten Sie die Sicherheitssysteme nacheinander ein und überprüfen Sie dabei, ob die Verbindung hergestellt werden kann.
Weitere Informationen finden Sie in der offiziellen Dokumentation unter pg_hba.conf-Datei.
Optimierung
Die Standardkonfiguration von PostgreSQL ist stark unterdimensioniert. Sie kann einfache Anwendungen ohne ständigen Datenbankzugriff bewältigen, aber für höhere Performance sollten Sie Ihre Instanz neu konfigurieren. Die gesamte Logik findet in der Datei /var/lib/pgsql/data/postgresql.conf\ statt. Auch die Protokollierung ist nicht besonders intuitiv.
Performance
Die Anzahl der Clients, die gleichzeitig mit PostgreSQL verbunden sein können:
max_connections = <Anzahl>
shared_buffers ist der Einstiegspunkt. Hiermit teilt man PostgreSQL mit, wie viel Speicher für das Caching reserviert wird. Ein guter Ausgangspunkt ist die Einstellung auf 25 % des gesamten Arbeitsspeichers. Sollte dies nicht zum gewünschten Ergebnis führen, versuchen Sie es mit einem Wert zwischen 15 % und 40 % des gesamten Arbeitsspeichers.
shared_buffers =<Speichereinheit>
Dieser Wert dient dem Abfrageplaner zur Ermittlung des verfügbaren Arbeitsspeichers im System. Anhand dieser Information entscheidet der Abfrageplaner, ob der Ausführungsplan in den Arbeitsspeicher passt. Üblicherweise wird dieser Wert auf 50 % des Gesamtspeichers gesetzt.
effective_cache_size = <Speichereinheit>
PostgreSQL plant bei Sortiervorgängen, ob die Abfrage auf der Festplatte oder im Arbeitsspeicher sortiert wird. Dieser Arbeitsspeicher steht für jede Sortierinstanz zur Verfügung. Bei mehreren Benutzern, die Abfragen an den Datenbankserver senden, kann der Speicherbedarf erheblich ansteigen. Daher ist er eng mit max_connections verknüpft.
work_mem = <Speichereinheit>
Für weitere Informationen zu diesem Thema empfehle ich Ihnen, die offizielle Dokumentation zur Optimierung von PostgreSQL zu lesen.
Protokollierung
Standardmäßig werden Protokolldateien wöchentlich rotiert, sodass sie möglicherweise nur wenige Informationen enthalten. Es könnten beispielsweise Protokollierungsstufe, Datum oder Uhrzeit fehlen. Bei einfachen Webanwendungen bevorzugen manche Anwender zudem eine höhere Ausführlichkeit der Protokollierung.
log_destination = 'stderr'
Das ist völlig in Ordnung. Wenn Sie möchten, dass syslog Ihre Protokolle verwaltet, ändern Sie 'stderr' in 'syslog' oder sogar in 'syslog,stderr'. Wenn Sie syslog verwenden, vergessen Sie nicht, syslog selbst zu konfigurieren; weitere Informationen finden Sie in der offiziellen Dokumentation.
logging_collector = on
Falls die Protokollierung auf stderr erfolgt, erfasst postgres alle Protokolle, wenn Sie die Option logging_collector aktivieren.
Dies ist die Standardoption:
log_filename = 'postgresql-%a.log'
Eine bevorzugte Methode wäre, die Protokolldateien nach dem Datum ihrer Erstellung zu benennen:
log_filename = 'postgresql-%G-%m.log
Rotation. Dies hängt stark von der jeweiligen Anwendung ab. Bei einer einfachen Anwendung mit wenigen Daten in der Datenbank können alle Protokolle dauerhaft auf der Festplatte gespeichert werden, ohne dass eine Rotation erforderlich ist.
log_truncate_on_rotation = off log_rotation_age = 31d
Anzahl der Protokolleinträge erhöhen:
client_min_messages = notice # default notice log_min_messages = info # default warning log_min_error_statement = notice # default error
Wenn Sie langsame Abfragen protokollieren möchten, können Sie diese Option gerne verwenden:
log_min_duration_statement = 1000 # in ms
Der Standard-Protokolleintrag enthält nicht viele Informationen:
FATAL: Ident authentication failed for user "test" DETAIL: Connection matched pg_hba.conf line 84: "host all all ::1/128 ident"
Lassen Sie es uns verbessern:
2013-12-30 17:51:36 CET testx@::1(50867):postgres [11213] FATAL: password authentication failed for user "testx" 2013-12-30 17:51:36 CET testx@::1(50867):postgres [11213] DETAIL: Connection matched pg_hba.conf line 84: "host all all ::1/128 md5 "
Sie müssen lediglich die Option log_line_prefix ändern.
# %t -- timestamp # %u -- user # %r -- client's host # %d -- database # %p -- PID log_line_prefix = '%t %u@%r:%d [%p] '
Wenn Sie nur eine einzige Datenbank mit einem einzigen Benutzer betreiben, ist es sinnvoller, das Präfix zu vereinfachen:
log_line_prefix = '%t [%p] '
Referenz
Haben Sie einen Tippfehler, eine fehlende oder veraltete Information entdeckt oder etwas anderes, das verbessert werden kann? Bearbeiten Sie dieses Dokument hier.
Want to help? Learn how to contribute to Fedora Docs ›