PostgreSQL installieren mit den Community-Paketen

Wie installiert man sinnvoll PostgreSQL aus den Community-Paketen, und zwar so, dass Upgrades auf neue Versionen keine unlösbare Aufgabe werden?

In Pocket speichern vorlesen Druckansicht 32 Kommentare lesen
PostgreSQL installieren mit den Community-Paketen

(Bild: ronstik/Shutterstock.com)

Lesezeit: 10 Min.
Von
  • Karsten Lenz
Inhaltsverzeichnis

Häufig besteht das Problem, dass es in Firmen Regularien gibt, an welchem Ort sich zum Beispiel Datenverzeichnisse von Datenbanken befinden sollen. Ihnen kann man mit den Community-Paketen durchaus folgen, und zwar so, dass auch Upgrades problemlos diesen Auflagen folgen.

Dieser Artikel beschreibt die Installationen unter CentOS 7 und 8, Red Hat 7 und 8 sowie SLES 12 SP4 und SP5. Die Ordnerstruktur von PostgreSQL gestaltet sich wie folgt:

  • Binaries sind in /usr/pgsql-[Versionsnummer]/bin/ zu finden.
  • PostgreSQL Home findet man in /usr/lib/pgsql-[Versionsnummer]/.
  • Daten sind in /var/lib/pgsql-[Versionsnummer]/data/ abgelegt.

Die Daten selbst legen Firmen gerne auf einem anderen Volume ab, das stellt auch kein Problem dar, aber der Reihe nach.

Vor der Installation von PostgreSQL aus den Community-Paketen sollten Anwender PostgreSQL-Pakete deaktivieren, die die Linux-Distributionen bereits mitbringen. Bei CentOS 7 und Red Hat Enterprise Linux 7 geschieht das in /etc/yum.repos.d/CentOS-Base.repo. In dieser Datei gibt es die Abschnitte [base] und [updates], und in beiden fügt man exclude=postgresql* am Ende hinzu.

Bei CentOS 8 und RHEL 8 ist es etwas einfacher, dort genügt der Befehl:

dnf -y disable module postgresql

Nun sind die PostgreSQL-Repositories hinzufügen:

CentOS 7 und RHEL 7:

yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

CentOS 8 und RHEL 8:

dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

SLES 12 SP4 und SP5 für PostgreSQL 11:

zypper addrepo https://download.postgresql.org/pub/repos/zypp/repo/pgdg-sles-11.repo

SLES 12 SP4 und SP5 für PostgreSQL 12:

zypper addrepo https://download.postgresql.org/pub/repos/zypp/repo/pgdg-sles-12.repo

Im Gegensatz zu SLES 12 SP4/SP5 umfasst das unter CentOS oder Red Hat neu installierte Repository File alle unterstützten Versionen. Daher deaktiviert man alle weiteren, die nicht installiert werden sollen, in /etc/yum.repos.d/pgdg-redhat-all.repo.

Im Beispiel ist nur PostgreSQL aktiv:

#######################################################
# PGDG Red Hat Enterprise Linux / CentOS repositories #
#######################################################

# PGDG Red Hat Enterprise Linux / CentOS stable common repository for all PostgreSQL versions

[pgdg-common]
name=PostgreSQL common for RHEL/CentOS $releasever - $basearch
baseurl=https://download.postgresql.org/pub/repos/yum/common/redhat/rhel-$releasever-$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG

# PGDG Red Hat Enterprise Linux / CentOS stable repositories:

[pgdg12]
name=PostgreSQL 12 for RHEL/CentOS $releasever - $basearch
baseurl=https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-$releasever-$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG

[pgdg11]
name=PostgreSQL 11 for RHEL/CentOS $releasever - $basearch
baseurl=https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-$releasever-$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG

[pgdg10]
name=PostgreSQL 10 for RHEL/CentOS $releasever - $basearch
baseurl=https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-$releasever-$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG

Alle anderen Versionen sind deaktiviert. Das verhindert unbeabsichtigtes Installieren von Paketen, die für andere Versionen gedacht sind.

Die Installation der Pakete ist zunächst einfach:

CentOS 7 und RHEL 7:

yum install postgresql11 postgresql11-server postgresql11-contrib

CentOS 8 und RHEL 8:

dnf install postgresql11 postgresql11-server postgresql11-contrib

SLES 12 SP4 und SP5:

zypper install postgresql11 postgresql11-server postgresql11-contrib

Die Installation erfolgt unter /usr/pgsql-Versionsnummer/.

Damit ist die Installation der Pakete erledigt. Nun ist festzulegen, wo PostgreSQL die Daten ablegt. Dafür erstellt man eine override.conf für das nach der Installation vorhandene Service File. Das geschieht mit systemctl edit postgresql-11.service, was eine leere override.conf erzeugt.

Je nachdem welcher Editor installiert ist, öffnet sich jetzt vi oder nano, und fügt Folgendes direkt oben ab Zeile 1 ein und speichert danach.

[Service]
Environment=PGDATA=/pgdata/11/data

Hier im Beispiel ist das Daten-Volume /pgdata/11/data/, die Versionsnummer von PostgreSQL im Pfad vereinfacht spätere Major-Upgrades. Das Volume muss vor dem Initialisieren vorhanden und mit chown -R postgres:postgres /pgdata/ dem PostgreSQL-Benutzer zugeordnet worden sein.

Nun ist es an der Zeit, PostgreSQL zu initialisieren, also die Instanz zu erzeugen. Das geschieht mit folgendem Befehl:

/usr/pgsql-11/bin/postgresql-11-setup initdb
Initializing database ... OK

In /pgdata/11/data/ sollte es jetzt so aussehen:

ls -la
total 68
drwx------. 20 postgres postgres  4096 Apr 24 09:33 .
drwxr-xr-x.  3 postgres postgres    18 Apr 21 22:15 ..
drwx------.  7 postgres postgres    67 Apr 21 22:47 base
-rw-------.  1 postgres postgres    30 Apr 24 09:33 current_logfiles
drwx------.  2 postgres postgres  4096 Apr 24 09:34 global
drwx------.  2 postgres postgres   110 Apr 24 09:33 log
drwx------.  2 postgres postgres     6 Apr 21 22:44 pg_commit_ts
drwx------.  2 postgres postgres     6 Apr 21 22:44 pg_dynshmem
-rw-------.  1 postgres postgres  7806 Apr 21 22:48 pg_hba.conf
-rw-------.  1 postgres postgres  1636 Apr 21 22:44 pg_ident.conf
drwx------.  4 postgres postgres    68 Apr 24 09:38 pg_logical
drwx------.  4 postgres postgres    36 Apr 21 22:44 pg_multixact
drwx------.  2 postgres postgres    18 Apr 24 09:33 pg_notify
drwx------.  2 postgres postgres     6 Apr 21 22:44 pg_replslot
drwx------.  2 postgres postgres     6 Apr 21 22:44 pg_serial
drwx------.  2 postgres postgres     6 Apr 21 22:44 pg_snapshots
drwx------.  2 postgres postgres     6 Apr 24 09:33 pg_stat
drwx------.  2 postgres postgres   113 Apr 24 11:43 pg_stat_tmp
drwx------.  2 postgres postgres    18 Apr 21 22:44 pg_subtrans
drwx------.  2 postgres postgres     6 Apr 21 22:44 pg_tblspc
drwx------.  2 postgres postgres     6 Apr 21 22:44 pg_twophase
-rw-------.  1 postgres postgres     3 Apr 21 22:44 PG_VERSION
drwx------.  3 postgres postgres  4096 Apr 24 09:38 pg_wal
drwx------.  2 postgres postgres    18 Apr 21 22:44 pg_xact
-rw-------.  1 postgres postgres  1019 Apr 21 22:49 postgresql.auto.conf
-rw-------.  1 postgres postgres 24007 Apr 21 22:44 postgresql.conf
-rw-------.  1 postgres postgres    50 Apr 24 09:33 postmaster.opts
-rw-------.  1 postgres postgres    88 Apr 24 09:33 postmaster.pid

systemctl start postgresql-11.service startet PostgreSQL. Die Datenbank läuft als User postgres, ohne dass jemals der Wechsel hierhin in dem Volume vollzogen wurde, das man vorher in der override.conf festgelegt hat.

Die Konfiguration von PostgreSQL ist sicherlich einen eigenen Artikel wert. Für effective_cache_size sind 75 Prozent RAM und für shared_buffers 25 Prozent RAM ein guter Anhaltspunkt zum Starten mit einer passablen RAM-Konfiguration, wenn nur eine Instanz auf dem Server der virtuellen Maschine vorhanden ist.

Grundsätzlich ist das Arbeiten auf mehreren Instanzen mit PostgreSQL möglich. Das beschriebene Vorgehen trifft auf jede einzelne Instanz zu, wobei sich alle Instanzen die Ressourcen des Servers, egal ob physisch oder virtuell, dann teilen.

Die Konfiguration von pg_hba.conf und postgresql.conf erfolgt immer pro Instanz. Als Empfehlung gilt, Anpassungen der postgresql.conf über alter system set-Befehle in SQL vorzunehmen, so werden diese in der postgresql.auto.conf nachgeführt. Viele Parameter lassen sich zur Laufzeit verändern und mit einem Reload der Konfiguration übernehmen. Andere wiederum setzen zwingend einen Neustart der Instanz voraus.