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?
- Karsten Lenz
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.