PostgreSQL
Willemers Informatik-Ecke
Dies ist kein Kurs für PostgreSQL, sondern eine Seite, auf der ich mir Informationen notiere, die ich immer wieder benötige. Vielleicht sind die Hinweise auch anderen nützlich.

Initialisierungsarbeiten

Unter Debian wird der PostgreSQL-Server mit dem folgenden Befehl installiert:
apt-get install postgresql
Automatisch wird ein Benutzer namens postgres angelegt, der für den Start des Server-Prozesses verwendet wird. Auch die Administrationstätigkeiten erfolgen über diesen Benutzer. Da dieser kein Passwort hat, erreicht man ihn über den root-Zugang des Rechners
su - (oder bei Ubuntu sudo -s)
su - postgres
Nun kann der Kommandozeileninterpreter von PostgreSQL aufgerufen werden.
psql
Durch die Tastenkombination Strg-D oder \q kann der Interpreter wieder verlassen werden.

Anlegen eines Benutzers mit eigener Datenbank

su - postgres
psql
psql (14.9 (Ubuntu 14.9-0ubuntu0.22.04.1))
postgres=# create user dbuser password 'geheim' login;
CREATE ROLE
postgres=# create database dbname;
CREATE DATABASE
postgres=# grant all on database dbname to dbuser;
GRANT
postgres=# quit
Der Benutzer kann sich nun selbst einloggen und die Tabellen in der Datenbank dbname anlegen.
postgres ~$ psql -h localhost -d dbname -U dbuser -W
Passwort für Benutzer dbuser: 
psql (9.1.14)
Wird der Hostname (-h localhost) weggelassen, erscheint eine Fehlermeldung.
$ psql -U dbuser dbname -W
Password: 
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  Peer authentication failed for user "dbuser"
Welche Benutzer sich einloggen können, wird in der Datei /etc/postgresql/14/main/pg_hba.conf definiert. Die folgende Zeile sorgt dafür, dass sich lokale Benutzer per Passwort anmelden können.
local   all             postgres                                peer
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     password
Statt password funktioniert auch md5. Man sollte nur im Hinterkopf behalten, dass md5 als nicht mehr sicher gilt.

Nach Änderungen der pg_hba.conf muss der PostgreSQL-Dienst neu gestartet werden.

# systemctl restart postgresql

Aus der Linux-Shell Benutzer und Datenbank anlegen

Von der Kommandozeile kann mit den Befehlen createuser und createdb gleich Benutzer und Datenbank angelegt werden.

postgres@host:~$ createuser benutzername -P
Enter password for new role:
Enter it again:
postgres@host:~$ createdb --owner=benutzername datenbankname
postgres@host:~$ 

Arbeiten mit PostgreSQL

Innerhalb des Interpreters können SQL-Kommandos abgesetzt werden. Der SQL-Standard braucht hier nicht noch einmal erläutert zu werden, da er an anderer Stelle bereits ausgeführt ist.

Beispiel: Anlegen dreier Tabellen

Als Beispiel für das Anlegen von Tabellen für Entities und Relations dient das Vermieten einer Ferienwohnung an Gäste.

Informationen über Backslash

\h für Hilfe über SQL-Anweisungen
\? für Hilfe über interne Anweisungen
\g oder Semikolon, um eine Anfrage auszuführen
\l zeigt die Datenbanken an.
\dt zeigt alle Tabellen der Datenbank an
\d Tabelle zeigt die Struktur der Tabelle an
\q um zu beenden

Die SQL-Befehle werden mit einem Semikolon abgeschlossen. Zwei Minuszeichen sind das Kommentarzeichen. Der Rest der Zeile wird vom Interpreter ignoriert.

Informationen anzeigen

Der Befehl \l zeigt alle Datenbanken des Systems an. Es werden auch die Besitzer und die Zeichenkodierung angezeigt.

Der Befehl \du liefert eine Liste aller am System verwendeten Rollen bzw. Benutzer.

Mit \d werden alle Tabellen der Datenbank angezeigt:

dbname=> \d
           List of relations
 Schema |    Name     | Type  | Owner  
--------+-------------+-------+--------
 public | kunde       | table | dbuser
 public | lager       | table | dbuser
 public | lieferanten | table | dbuser
 public | verkauf     | table | dbuser
 public | ware        | table | dbuser
(5 rows)
Nach \d kann der Name einer Tabelle angegeben werden, um die Struktur der Tabelle anzuzeigen.
dbname=> \d kunde
      Table "public.kunde"
  Column   |  Type   | Modifiers 
-----------+---------+-----------
 kundennr  | integer | not null
 name      | text    | 
 anschrift | text    | 
Indexes:
    "kunde_pkey" PRIMARY KEY, btree (kundennr)
Referenced by:
    TABLE "verkauf" CONSTRAINT "verkauf_kunde_fkey" FOREIGN KEY (kunde) REFERENCES kunde(kundennr)

Tabelle mit Daten füllen

Sie können eine Tabelle mit Daten aus einer Textdate füllen. Der Befehl dazu lautet:

COPY mytable FROM '/home/user/tabelleninhalt.txt';

Transaktionen

Transaktionen können mit BEGIN; eingeleitet werden. Dann erfolgen ein oder mehrere Datenbankbefehle. Mit dem Befehl COMMIT; werden die Befehle bestätigt. Dann werden alle Aktionen durchgeführt. Sollten einer der Befehle fehlschlagen führt ein ROLLBACK; dazu, dass keiner der Befehle ausgeführt wird und der Zustand wiederhergestellt ist, der zum Zeitpunkt des BEGIN; vorlag.

Datensicherung

PostgreSQL erlaubt es, den Inhalt einer Datenbank durch dessen Besitzer sichern zu lassen. Vor der Rücksicherung muss zunächst der Benutzer und auch die Datenbank durch den Administrator angelegt werden.

Daneben kann auch eine Vollsicherung erfolgen. Diese umfasst alle Datenbanken und Datenbankbenutzer.

Einzelne Datenbanken sichern

Mit dem Befehl pg_dump wird eine Datenbank gesichert. Dazu muss man zunächst zum Benutzer postgres wechseln. Als Parameter wird der Name der Datenbank erwartet. Die Ausgabe erfolgt auf dem Standardausgabekanal und muss umgeleitet werden.
$ sudo -s
# su - postres
$ pg_dump mydb > dbsicher
Als (Linux-)Benutzer postgres hat man alle Rechte auf alle Datenbanken. Im Normalfall wird man einen speziellen Datenbank-User für die Datenbank angelegt haben. Gehen wir davon aus, dass dbname die Datenbank ist und dbuser der Datenbank-User ist, der die Konfrolle über die Datenbank hat.
pg_dump -h localhost -U dbuser dbname > dbname.sql
In diesem Fall ist es nicht erforderlich, dass der Benutzer in root und dann in den Benutzer postgres wechselt. Jeder normale Linux-Nutzer kann diese Datensicherung veranlassen.

Rücksicherung

Um die Datenbank zurückzuholen, muss man sich zunächst wieder zum Benutzer postgres machen.
$ sudo -s
# su - postres
$
Im nächsten Schritt muss mit createuser zunächst der Datenbankbenutzer angelegt werden. Danach kann mit createdb die Datenbank mit diesem Benutzer als Besitzer angelegt werden. Beides könnte auch im SQL-Interpreter mit CREATE USER, CREATE DATABASE und GRANT gemacht werden.

postgres $ createuser dbuser -P
Enter password for new role: 
Enter it again: 
postgres $ createdb --owner=dbuser dbname
Nachdem die Datenbank existiert und dem Datenbankbenutzer gehört, kann dieser sie durch Umleiten der Datensicherung inhaltlich wiederherstellen.

postgres $ psql -h localhost -U dbuser dbname < dbname.sql

Komplettsicherung

Der Befehl pg_dumpall legt eine komplette Datensicherung aller Datenbanken der gesamten PostgreSQL-Installation an. Dieser erzeugt eine Textdatei, die die SQL-Befehle enthält, um aus daraus die Datenbanken und deren Daten rekonstruieren zu können.

pg_dumpall > vollsicherung.sql

Die Rücksicherung einer solchen Vollsicherung erfolgt auch per psql.

psql -f vollsicherung.sql postgres
oder mit dem Befehl
pg_restore --user benutzer --host hostname -c -d datenbank pgsicherung

Zugriffskonfiguration

Die Konfigurationsdateien von PostgreSQL befinden sich bei Debian im Verzeichnis /etc/postgresql/Versionsnummer/main.

postgresql.conf

Hier wird unter anderem die Netzwerkzugriff eingestellt. Der Parameter listen_addresses ermöglicht den Zugriff über das Netzwerk, wenn ein Stern eingetragen ist. Feinere Zugriffe regelt die Datei pg_hba.conf (siehe unten).
#listen_addresses = 'localhost'
listen_addresses = '*'
port = 5432
PostgreSQL arbeitet standardmäßig auf Port 5432. Ist dieser belegt, auch durch eine alte PostgreSQL-Version, verwendet PostgreSQL den nächsten Port, also beispielsweise 5433.

Nach einem Neustart der Datenbank kann mit netstat -an geprüft werden, ob der Port freigegeben wurde.

netstat -an
...
tcp        0      0 192.168.109.0:5432      0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN     
...
In der Datei /etc/postgresql/9.1/main/pg_hba.conf werden die Zugriffsrechte eingestellt. Neben dem bisher erlaubten localhost sollen nun alle Rechner im Netzwerk 192.168.109.0 ZUgriff erhalten.
local   all             postgres                                peer
local   all             all                                     md5
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.109.0/24        md5 
Im nächsten Schritt kann ein Anmelden per psql getestet werden.
psql -d dbname -U dbuser -h 192.168.109.142
Durch die Option -h wird eine TCP/IP-Verbindung auch auf dem lokalen Rechner hergestellt. Sollte dies funktionieren, wird auch ein Zugriff von außen klappen, sofern nicht eine Firewall dazwischen sitzt.

pg_hba.conf

Die Datei pg_hba.conf verwaltet, welche Clients auf die PostgreSQL-Datenbank zugreifen dürfen. Sie k&puml;nnen einschränken, dass nur lokale Benutzer auf bestimmten Datenbanken arbeiten dürfen, falls diese beispielsweise ausschließlich für den PHP-Zugriff gedacht ist. Sie k&puml;nnen bestimmte Benutzer auf bestimmte Client-Rechner beschränken. Die Standardkonfiguration erlaubt alle Zugriffe.

# Database administrative login by UNIX sockets
local   all         postgres                          ident
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only
local   all         all                               ident
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5

Die Spalten bedeuten im Einzelnen:

Administration per Browser

Das Paket phppgadmin installiert einen Webserver (apache) zur Verwaltung von PostgreSQL-Servern. Dieser ist über einen Browser auf dem lokalen Computer über die folgende URL erreichbar:
http://localhost/phppgadmin
Man muss sich als Datenbank-User mit dem entsprechenden Passwort einloggen. Ein Einloggen als root ist aus Sicherheitsgründen nicht erlaubt.

Soll der Zugriff auch von anderen Computern erlaubt sein, muss die Konfigurationsdatei von phppgadmin im Apache geändert werden.

# vi /etc/apache2/conf-available/phppgadmin.conf
Darin befindet sich eine Variable Require, die den Zugriff lokal beschränkt. Damit alle zugreifen können, wird ihr Wert von local auf all granted geändert.
# Only allow connections from localhost:
#Require local
Require all granted