PostgreSQL

Aus xinux.net
Zur Navigation springen Zur Suche springen

Installation

root@zero:~# apt-get install postgresql

Bei der Installation über einen Paketmanager wird automatisch ein Datenbank-Cluster erzeugt.

Prüfen, ob der Server läuft:

root@zero:~# netstat -lntp | grep 5432
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      5359/postgres

Verzeichnisstruktur

Konfigurationsdateien:

/etc/postgresql/*/main/*

Datenbank(en):

/var/lib/postgresql/*/main/

Logdatei(en):

/var/log/postgresql/

Kommandoverzeichnis für mitgelieferte Kommandos, die nicht im Pfad liegen:

/usr/lib/postgresql/*/bin

Starten und Stoppen

root@zero:~# /etc/init.d/postgresql* start
root@zero:~# /etc/init.d/postgresql* stop

Administration

Zugriff auf das Datenbanksystem

Bei der Installation von PostgreSQL wird ein Console-Client mitinstalliert. Da direkt nach der Installation ausser dem Superuser-Account noch keine Benutzer angelegt sind, kann man zu diesem Zeitpunkt nur als der PostgreSQL Superuser postgres auf das System zugreifen. Die Datenbank 'template1' ist eine Systemdatenbank und existiert immer. Dazu muss man zunächst auf den Systembenutzer postgres wechseln:

root@zero:~# su - postgres

Einfache Konsolenkomandos

Aufruf der psql-konsole und Verinden mit der Datenbank template1

postgres@zero:~$ psql template1
psql (9.1.8)
Type "help" for help.

template1=# 

Listen der vorhandenen Datenbanken

template1=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | 
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

Verbinden mit der Datenbank postgres

template1-# \c postgres 
You are now connected to database "postgres" as user "postgres".

Hilfe bei SQL Komandos am Beispiel CREATE USER

tuxmendb=# \h CREATE USER
Command:     CREATE USER
Description: define a new database role
Syntax:
CREATE USER name [ [ WITH ] option [ ... ] ]
where option can be: 
     SUPERUSER | NOSUPERUSER
   | CREATEDB | NOCREATEDB
   | CREATEROLE | NOCREATEROLE
   ......... 

Anlegen einer Datenbank

postgres=# CREATE DATABASE tuxmendb;
CREATE DATABASE

Verbinden mit der Datenbank

postgres=# \c tuxmendb 
You are now connected to database "tuxmendb" as user "postgres".

Anlegen einer Tabelle

 tuxmendb=# CREATE TABLE tuxmen_tab_one (tux_field_one varchar(12), tux_field_two int, tux_field_three boolean);
CREATE TABLE
tuxmendb=# \d
             List of relations
 Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
 public | tuxmen_tab_one | table | postgres
(1 row)

User anlegen inklusive Passwort

tuxmendb=# CREATE USER tuxmen_adm PASSWORD 'geheim'; 
CREATE ROLE
tuxmendb=# CREATE USER tuxmen_user PASSWORD 'secret'; 
CREATE ROLE

Passwort ändern

tuxmendb=# ALTER USER tuxmen_user PASSWORD '1234';

User anzeigen

tuxmendb=# SELECT * FRom pg_user;
   usename   | usesysid | usecreatedb | usesuper | usecatupd | userepl |  passwd  | valuntil | useconfig 
-------------+----------+-------------+----------+-----------+---------+----------+----------+-----------
 postgres    |       10 | t           | t        | t         | t       | ******** |          | 
 tuxmen_adm  |    16388 | f           | f        | f         | f       | ******** |          | 
 tuxmen_user |    16389 | f           | f        | f         | f       | ******** |          | 
(3 rows)

Passwörter anzeigen

tuxmendb=# SELECT * FRom pg_shadow;
     usename   | usesysid | usecreatedb | usesuper | usecatupd | userepl |               passwd                | valuntil | useconfig 
-------------+----------+-------------+----------+-----------+---------+-------------------------------------+----------+-----------
 postgres    |       10 | t           | t        | t         | t       |                                     |          | 
 tuxmen_adm  |    16388 | f           | f        | f         | f       | md5426fceae0be03f2a5d1a355e2cd8fcfd |          | 
 tuxmen_user |    16389 | f           | f        | f         | f       | md5c1ae969863ea72aa7e24f0e202469344 |          | 
(3 rows)

Berechtigungen für User auf Tabelle setzen

tuxmendb=# GRANT ALL ON tuxmen_tab_one  TO tuxmen_adm;
GRANT
tuxmendb=# GRANT SELECT ON tuxmen_tab_one  TO tuxmen_user;
GRANT

Anzeigen der Berechtigungen

tuxmendb=# \z
                                    Access privileges
 Schema |      Name      | Type  |      Access privileges      | Column access privileges 
--------+----------------+-------+-----------------------------+--------------------------
 public | tuxmen_tab_one | table | postgres=arwdDxt/postgres  +| 
        |                |       | tuxmen_adm=arwdDxt/postgres+| 
        |                |       | tuxmen_user=r/postgres      |

Rechte auf Datenbank für einen User setzen

Auswahl von Kommandos in der Console:

Kommando Beschreibung
\? Zeigt eine Liste von console-spezifischen Kommandos an.
\h Zeigt eine Liste der SQL-Anweisungen an.
\h <SQL-Anweisung> Zeigt eine Hilfe zur angegebenen SQL-Anweisung an
\l Zeigt eine Liste der vorhandene Datenbanken an.
\c <Datenbankname> Verbindet mit der angegebenen Datenbank.
\d Gibt eine Liste von Datenbankobjekten aus.
\dt Gibt eine Liste der Tabellen aus.
\d <Tabellenname> Zeigt die Struktur der angegebenen Tabelle.
\z Zeigt eine Übersicht der Datenbankobjekte mit Zugriffsrechten an.
\z <Tabellenname> Zeigt die Berechtigungen auf eine Tabelle an.
\i <Dateiname> Führt die in der datei einthaltenen SQL-Anweisungen aus.
\q Verlassen der Console

Beim Absetzen einer SQL-Anweisung in der Console wird dieses mit einem Semikolon abgeschlossen.

Anlegen und Löschen von Datenbanken

1. In der psql Console:

template1=# CREATE DATABASE dummy_database;
template1=# DROP DATABASE dummy_database;

2. Über mitgelieferte Scripte:

postgres@zero:~$ createdb test
postgres@zero:~$ dropdb test

Anlegen und Löschen von Tabellen

dummy_database=#CREATE TABLE namen (id INTEGER, vorname VARCHAR(25),nachname VARCHAR(40));

Da Tabellendefinitionen recht komplex sein können, werden diese meist in einer Datei gespeichert, die dann an psql übergeben wird.

dummy_database=#DROP TABLE namen;

Primässchlüssel

Bei der Erstellung der Tabelle:

dummy_database=# CREATE TABLE namen (id INTEGER, vorname VARCHAR(25),nachname VARCHAR(40),PRIMARY KEY(id));

SERIAL Datentyp

Beim SERIAL Datentyp handelt es sich um einen Autoinkrement-Wert, d.h. ein Wert, der automatisch vom Datenbanksystem erhöht wird.

dummy_database=#CREATE TABLE namen (id SERIAL, vorname VARCHAR(25),nachname VARCHAR(40));

Anlegen und Löschen von Benutzern

1. In der psql Console:

dummy_database=# CREATE USER tina WITH PASSWORD 'geheim';
dummy_database=# DROP USER tina;

2. Über mitgelieferte Scripte:

postgres@zero:~$ createuser -P tina
postgres@zero:~$ dropuser tina

Zugriffsrechte auf Datenbanken / Tabellen

Innerhalb des Datenbanksystems

dummy_database=# GRANT ALL ON namen TO tina;

Das Schlüsselwort ALL steht für alle Rechte.

Schlüsselwort Bedeutung
SELECT Erlaubt SELECT Anweisungen auf dem Objekt.
INSERT Erlaubt INSERT Anweisungen auf dem Objekt.
UPDATE Erlaubt UPDATE Anweisungen auf dem Objekt.
DELETE Erlaubt DELETE Anweisungen auf dem Objekt.
REFERENCES Wird für die Erstellung eines Fremdschlüssels benötigt. Auf beiden betroffenen Tabellen muss dieses Recht gesetzt sein.
CONNECT Benutzer darf sich mit der Datenbank verbinden. Wird zusätzlich zu den in der Konfigurationsdatei pg_hba.conf vorhandenen Einstellungen ausgewertet.

Bei eventuell schon vorhandenen Rechten, gelten die hier angegebenen Rechte zusätzlich.

dummy_database=# \z namen
              Zugriffsrechte für Datenbank »dummy_database«
 Schema | Name  |   Typ   |                 Zugriffsrechte                  
--------+-------+---------+-------------------------------------------------
 public | namen | Tabelle | {postgres=arwdxt/postgres,tina=arwdxt/postgres}
(1 Zeile)
dummy_database=# REVOKE ALL ON namen FROM tina;

Über Konfigurationsdateien

/etc/postgresql/8.3/main/pg_ident.conf

In dieser Datei können Zuordnungen von Systembenutzern zu PostgreSQL-Benutzern definiert werden. Diese können dann mit einem Namen in der Datei pg_hba.conf verwendet werden. Die Authentifizierung über ident funktioniert nur, wenn auf dem Server ein ident-Server läuft.

/etc/postgresql/8.3/main/pg_hba.conf

In dieser Datei wird festgelegt, welche User sich von wo mit welcher Datenbank verbinden können.

Die Syntax lautet:

TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

TYPE bezeichnet dabei den Verbindungstyp (UNIX Sockets oder über TCP/IP).

DATABASE gibt die Datenbank an (Datenbankname oder Schlüsselwort 'all').

USER ist der Benutzer, der sich mit der Datenbank verbindet (Benutzername oder Schlüsselwort 'all').

CIDR-ADDRESS gibt den Host bzw. die Hosts an, von denen aus zugegriffen werden darf.

Beispiel:

192.168.254.27/32 - nur dieser Host
192.168.254.0/24 - kleines Netzwerk
10.6.0.0/16 - großes Netzwerk

METHOD kennzeichnet die Methode, die zum Anmelden benutzt wird.

trust Die Verbindung wird bedingungslos erlaubt.
reject Verbindung wird zurückgewiesen.
md5 Md5-verschlüsseltes Passwort wird zum Verbinden benötigt.
crypt Ein crypt()-verschlüsseltes Passwort wird zum Verbinden benötigt.
password Ein unverschlüsseltes Passwort wird zum Verbinden benötigt.
ident Die pg_ident.conf wird zum Verbinden benutzt.

Werden die Dateien pg_hba.conf und / oder pg_ident.conf geändert, muss PostgreSQL neu gestartet werden, damit die Änderungen wirksam werden.


Konfiguration

Hauptkonfigurationsdatei von PostgreSQL:

/etc/postgresql/8.3/main/postgresql.conf

Ausgewählte Parameter:

Name Beschreibung
data_directory PostgreSQL Datenverzeichnis
hba_file Name und Pfad zur Konfigurationsdatei für Zugriffsrechte
ident_file Name und Pfad zur ident Konfigurationsdatei
listen_addresses IP-Adresse, an der der Server auf Verbindungen lauscht.
port Der Port, an dem gelauscht wird.
max_connections maximale Anzahl der gleichzeitigen Verbindungen.
shared_buffers Hauptspeicher, den die Datenbank für Shared Memory Puffer benutzt. Empfohlener Wert: 5%-25% RAM (Achtung: eventuell muss der kernel Parameter kernel.shmmax angepasst werden)
work_mem Hauptspeicher, der für interne Sortieroperationen benutzt wird.

Bei vielen Optionen ist nach einer Änderung ein Neustart des Servers erforderlich.


Anpassen kernel.shmmax

sysctl kernel.shmmax = <WERT>  (bei Reboot wieder auf ursprünglichem Wert.)

oder:

Anpassen der Datei /etc/sysctl.conf:

kernle.shmmax = <WERT>

einfügen

Anlegen eines neuen Datenbank-Clusters

Anlegen eines Verzeichnisses für den neuen DB-Cluster und setzen der Rechte:

root@zero:~# mkdir /var/test_cluster
root@zero:~# chown postgres /var/test_cluster

Neuen Cluster mit allen benötigten Strukturen erzeugen:

postgres@zero:~$ /usr/lib/postgresql/8.3/bin/initdb -D /var/test_cluster/

Starten des neuen DB-Clusters

/usr/lib/postgresql/8.3/bin/postgres -D /var/test_cluster

Backup

komplette Datenbank:

postgres@zero:~$ pg_dump -f dummy_database.dmp dummy_database

Einzelne Tabelle:

postgres@zero:~$ pg_dump -t namen -f namen.dmp dummy_database

Nur Struktur einer Tabelle:

postgres@zero:~$ pg_dump -s -t namen -f namen.schema dummy_database

Nur Daten einer Tabelle:

postgres@zero:~$ pg_dump -a -t namen -f namen.data dummy_database

PostgreSQL Log Shipping

Prinzip

2 Rechner: 1 Primary, 1 Standby

auf dem Primary wird kontinuierlich geloggt, Logs werden vom Standby gelesen und Änderungen werden auf dem Standby durchgeführt.

allgemeine Vorbereitungen

ssh Schlüssel für Benutzer postgres erstellen und auf den Standby kopieren (Benutzer postgres hat Standardmäßig kein Passwort und hat als Homeverzeichnis /var/lib/postgresql - eventuell sollte man da ein anderes Verzeichnis nehmen?)

auf dem Standby wird pg_standby benötigt (enthalten im Paket postgresql-contrib)

root@test2:~# apt-get install postgresql-contrib-8.4

Installation PostgreSQL auf beiden Systemen

apt-get install postgresql

Konfiguration des Primary

Datei /etc/postgresql/8.4/main/postgresql.conf Archivierung aktivieren

archive_mode = on
archive_timeout = 60 # in Sekunden, nach spaetestens dieser Zeit wird ein neues Logfile Segment erstellt
archive_command = 'rsync -a %p postgres@test2:/var/postgresql/walfiles/%f' # muss im Erfolgsfall 0 zurueckgeben

%p - wird durch Pfad und Dateiname der WAL Datei ersetzt
%f - wird durch Dateiname der WAL Datei ersetzt

/etc/init.d/postgresql-8.4 restart

Etwas warten (je nach archive_timeout) und kontrollieren, ob WAL Files in das in archiv_command angegebene Verzeichnis kopiert werden (vorher anlegen!).

Vorbereiten des Standby Systems

Falls noch nicht geschehen:
Verzeichnis wie in archiv_command angegeben anlegen, in das die WAL Dateien vom Primary kopiert werden und Besitzer anpassen.

root@test2:~# mkdir -p /var/postgresql/walfiles/
root@test2:~# chown -R postgres.postgres /var/postgresql/
root@test2:~# /etc/init.d/postgresql-8.4 stop

root@test2:~# rm -r /var/lib/postgresql/8.4/main/*

root@test2:~# cd /var/lib/postgresql/8.4/main/
root@test2:/var/lib/postgresql/8.4/main# echo "restore_command = '/usr/lib/postgresql/8.4/bin/pg_standby -d -s 60 -t /tmp/pgsql.trigger.5432 \
/var/postgresql/walfiles %f %p %r 2>>/var/log/standby.log'" > /var/lib/postgresql/recovery.conf
root@test2:/var/lib/postgresql/8.4/main# ln -s /var/lib/postgresql/recovery.conf recovery.conf
root@test2:/var/lib/postgresql/8.4/main# chown postgres.postgres recovery.conf
root@test2:/var/lib/postgresql/8.4/main# touch /var/log/standby.log
root@test2:/var/lib/postgresql/8.4/main# chown postgres /var/log/standby.log

Erstellen Basis Backup auf dem Primary und Kopieren auf den Standby

postgres@test1:~$ psql -c "SELECT pg_start_backup('replication');"
postgres@test1:~$ rsync -avz --exclude 'pg_xlog/*' /var/lib/postgresql/8.4/main/* test2:/var/lib/postgresql/8.4/main/
postgres@test1:~$ psql -c "SELECT pg_stop_backup();"

Starten des Standby und Kontrolle

root@test2:~# /etc/init.d/postgresql-8.4 start

root@test2:~# tail -f -n 100 /var/log/postgresql/postgresql-8.4-main.log
root@test2:~# tail -f -n 100 /var/log/standby.log