- Initialisierungsarbeiten
- Anlegen einer Datenbank für einen Benutzer
- Arbeiten mit PostgreSQL
- Datensicherung
- Zugriffskonfiguration
Initialisierungsarbeiten
Unter Debian wird der PostgreSQL-Server mit dem folgenden Befehl installiert:apt-get install postgresqlAutomatisch 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 - postgresNun kann der Kommandozeileninterpreter von PostgreSQL aufgerufen werden.
psqlDurch 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=# quitDer 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 passwordStatt 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 > dbsicherAls (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.sqlIn 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 dbnameNachdem 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 postgresoder 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 = 5432PostgreSQL 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 md5Im nächsten Schritt kann ein Anmelden per psql getestet werden.
psql -d dbname -U dbuser -h 192.168.109.142Durch 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:
- local/host: Unterscheidet, ob der Zugriff lokal oder über das Netzwerk geht.
- Datenbank: Hier kann eine einzelne Datenbank angegeben werden oder all für alle Datenbanken.
- Benuter: Hier können einzelne Benutzer angegeben werden oder all für alle Benutzer.
- IP-Adresse: (bei local fehlt diese Spalte) Es können einzelne Hosts oder Netze spezifiziert werden.
- Authentifizierung: Hier steht, wie sich Benutzer ausweisen.
- ident: Benutzeranmeldung des Betriebssystems
- peer:
- md5: MD5-verschlüsseltes Passwort
- trust: Blindes Vertrauen
- reject: Diese Verbindungen werden abgelehnt
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/phppgadminMan 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.confDarin 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