%%
%%

\chapter{PostgreSQL Installation und Konfiguration}
\label{PostgreSqlChapter}
\index[general]{PostgreSQL!Installation und Konfiguration }
\index[general]{PostgreSQL Installation und Konfiguration }
\index[general]{Update}

Wenn Sie sich dazu entschlie{\ss}en PostgreSQL zu verwenden,
sollten Sie sich \"{u}ber den Aufwand, den ein Datenbank-Update
mit sich bringt, im Klaren sein. Grunds\"{a}tzlich werden Sie bei
jeder neuen Hauptversion von PostgreSQL Ihre alte Datenbank
exportieren m\"{u}ssen, um sie dann in die neue Version einzupflegen.
Das wird dadurch erforderlich, dass sich regelm\"{a}{\ss}ig 
einige internen "`Datenformate"' \"{a}ndern und von den
PostgreSQL-Entwicklern keine Tools zu Verf\"{u}gung gestellt
werden, um den Update-Vorgang zu automatisieren. Falls Sie den
Daten-Ex- und -Import vergessen sollten, kann es sein das Sie
auf die Datenbank nicht mehr zugreifen k\"{o}nnen, da die neue
PostgreSQL-Version nicht mit den alten Datenbank-Dateien
zusammenarbeitet.

Sollten Sie PostgreSQL aus dem Quelltext selbst
kompilieren, m\"{u}ssen Sie dem configure-Kommando die
Option {\bf \verb:--:enable-thread-safety} \"{u}bergeben.

\section{PostgreSQL Installation}
\index[general]{PostgreSQL!Installation }
Wenn Sie bei der Konfiguration des Bacula-Quelltextes {\bf ./configure
\verb:--:with-postgresql=PostgreSQL-Verzeichnis} angeben, m\"{u}ssen Sie
PostgreSQL mindestens in Version 7.4 installiert haben. \"{A}ltere
PostgreSQL-Versionen funktionieren mit Bacula nicht. Falls PostgreSQL
in einem Standard-Verzeichnis installiert ist, brauchen Sie das
"`PostgreSQL-Verzeichnis"' nicht angeben. Wenn es aber zum Beispiel in
Ihrem Home-Verzeichnis installiert ist, m\"{u}ssen Sie den kompletten
Pfad angeben.

Die Konfiguration und Installation von PostgreSQL ist zwar nicht sehr
schwer, kann aber beim ersten Mal etwas verwirrend sein. Wenn Sie es vorziehen,
k\"{o}nnen Sie PostgreSQL auch \"{u}ber die Paket-Verwaltung Ihres Betriebssystems
installieren. Vorkompilierte Pakete finden Sie auf www.postgresql.org
unter \elink{Downloads}{http://www.postgresql.org/download/}

Wenn Sie PostgreSQL lieber aus dem Quelltext selbst kompilieren m\"{o}chten,
empfehlen wir Ihnen den Anweisungen in der \elink{PostgreSQL
Dokumentation}{http://www.postgresql.org/docs/} zu folgen.

Benutzer von FreeBSD finden in diesem \elink{FreeBSD Diary
Artikel}{http://www.freebsddiary.org/postgresql.php} weitere n\"{u}tzliche
Informationen. Selbstverst\"{a}ndlich enth\"{a}lt der Artikel auch f\"{u}r
Nicht-FreeBSD-Benutzer wissenswertes bez\"{u}glich der Installation und
Konfiguration von PostgreSQL

Falls Sie die Bacula "`Batch-Insert"'-Funktion benutzen wollen, die
standardm\"{a}{\ss}ig aktiviert ist und f\"{u}r eine schnelle Verarbeitung
der Attribute der gesicherten Datein sorgt, m\"{u}ssen Sie unbedingt darauf
achten, dass PostgreSQL mit der Option {\bf \verb:--:enable-thread-safety}
kompiliert wurde. Bei den meisten gro{\ss}en Linux-Distributionen ist das
der Fall. Aber falls Sie nicht sichert sind k\"{o}nnen Sie mit folgendem
Kommando feststellen, ob Ihr PostgreSQL gegen die pthreads-Bibliothek
gelinked ist:

\footnotesize
\begin{alltt}
  nm /usr/lib/libpq.a | grep pthread_mutex_lock
\end{alltt}
\normalsize

Die Kommandos m\"{u}ssen in etwa eine Zeile wie diese zur\"{u}ckgeben:

\footnotesize
\begin{alltt}
         U pthread_mutex_lock
\end{alltt}
\normalsize

wenn das der Fall ist, ist alles in Ordnung. Wenn keine Zeilen zur\"{u}ckgegeben
werden, wird Bacula beim kompilieren die "`Batch-Insert"`-Funktion deaktivieren.
Wenn Sie sie trotzdem benutzen wollen, m\"{u}ssen Sie PostgreSQL mit der Option
\verb:--:enable-thread-safety neu kompilieren.

Nach der PostgreSQL-Installation fahren Sie bitte mit der Installation von Bacula
fort. Sp\"{a}ter wenn Sie diese abgeschlossen haben, lesen Sie hier weiter, um
die Konfiguration von PostgreSQL zu beenden. Bitte beachten Sie, dass einige
Schritte im weiteren Verlauf der PostgreSQL-Konfiguration Scripte ben\"{o}tigen,
die erst bei der Installation von Bacula erstellt werden. Auch wenn Sie f\"{u}r
die Installation von PostgreSQL vorkompilierte Pakete verwendet haben (zum
Beispiel rpm oder deb) m\"{u}ssen Sie sp\"{a}ter hier weitermachen, um die
Konfiguration von PostgreSQL zu vervollst\"{a}ndigen.

Bitte beachten Sie, dass Sie das Installationsverzeichnis von PostgreSQL,
das Sie mit der Option {\bf \verb:--:with-postgresql=PostgreSQL-Verzeichnis}
dem configure-Script \"{u}bergeben haben, auch bei der Konfiguration des
Bacula-Quelltextes mit {\bf \verb:--:with-postgresql=PostgreSQL-Verzeichnis}
angeben m\"{u}ssen. Die einzige Ausnahme ist, dass Sie kein spezielles
Verzeichnis angegeben haben und PostgreSQL somit in den Standard-Verzeichnissen
installiert ist. In diesem Fall findet das configure-Script von Bacula
die PostgreSQL Header und Bibliotheken auch ohne explizite Angabe des Verzeichnisses.

\label{PostgreSQL Konfiguration}
\section{Konfiguration PostgreSQL}
\index[general]{PostgreSQL!Konfiguration PostgreSQL}

An diesem Punkt sollten Sie PostgreSQL und Bacula
kompiliert und installiert haben. Falls nicht,
schlie{\ss}en Sie bitte diese beiden Schritte erst ab,
bevor Sie hier weitermachen.

Bei der Installation von Bacula werden mehrere Scripte in das
Installations-Verzeichnis kopiert, mit denen Sie verschiedene
\"{A}nderungen an der Datenbank durchf\"{u}hren k\"{o}nnen.
Diese Scripte haben Namen im Format *\_bacula\_*
(z.B. create\_bacula\_database)und dienen dazu die Datenbank
zu initialisieren, zu aktualisieren oder zu l\"{o}schen.
Diese Scripte sind auch im Bacula-Quelltext-Verzeichnis, nach
der Ausf\"{u}hrung des "`./configure"'-Scripts, unter
\lt{}bacula-src\gt{}/src/cats zu finden. Wenn Sie sich, zum
Beispiel, das Script create\_bacula\_database n\"{a}her ansehen
werden Sie merken, dass dieses Script einfach nur
create\_postgresql\_database ausf\"{u}hrt. Alle Scripte die *\_bacula\_*
heissen, dienen nur der Bequemlichkeit. Es spielt keine Rolle
mit welcher Datenbank Sie den Bacula-Quelltext \"{u}bersetzt haben,
das Script create\_bacula\_database wird immer die f\"{u}r Sie
richtige Datenbank erstellen.

Die folgenden Schritte sind n\"{o}tig um die PostgreSQL-Datenbank und Tabellen
zu erstellen, die Bacula benutzt:

\begin{enumerate}
\item cd \lt{}Bacula-Installations-Verzeichnis\gt{}

   In diesem Verzeichnis  finden Sie die Bacula-Datenbank-Scripte.

\item ./create\_bacula\_database

   Dieses Script erzeugt die Bacula-Katalog-Datenbank.
   Bevor Sie dieses Script ausf\"{u}hren, sollten Sie sich \"{u}ber
   die verwendete Kodierung der Text-Felder (Pfade, Dateien, ...)
   innerhalb der Datenbank Gedanken machen. Idealerweise wird UTF8 verwendet.
   Allerdings sind bei vielen Unix-Systeme die Dateinamen nicht in UTF8 kodiert,
   weil eventuell UTF8 auf diesen Systemen nicht als Standard-Kodierung gesetzt ist,
   oder weil Dateien von anderen Systemen (z.B. MacOS X) kopiert worden sind.
   Aus diesem Grund verwendet Bacula SQL\_ASCII als Datenbank-Kodierung.
   Wenn Sie das \"{a}ndern wollen, m\"{u}ssen Sie das Script vor der
   Ausf\"{u}hrung entsprechend anpassen. Bedenken Sie dabei aber, dass
   sp\"{a}tere Backups eventuell fehlschlagen, falls Bacula Dateien und
   Verzeichnisse sichern soll, deren Namen nicht UTF8-kodiert sind.

   Wenn die Ausf\"{u}hrung dieses Scripts fehlschl\"{a}gt kann es sein,
   dass die Datenbank einem anderen Benutzer geh\"{o}rt als der, mit dem
   Sie gerade angemeldet sind. Auf vielen Systemen ist der Datenbank-
   Besitzer {\bf pgsql} oder, auf Fedora und RedHat {\bf postgres}.
   Am leichtesten finden Sie den Namen des Besitzers in der /etc/passwd.
   Um einen neuen Datenbank-Benutzer anzulegen, k\"{o}nnen Sie folgende
   Kommandos ausf\"{u}hren:

\begin{alltt}
   su
   (Eingabe des root-Passworts)
   su pgsql (oder postgres)
   createuser IhrLogin (oder beispielsweise bacula)
   Shall the new user be allowed to create databases? (y/n) y
   Shall the new user be allowed to create more new users? (y/n) n
   exit
\end{alltt}

    Jetzt sollten Sie in der Lage sein das Script ./create\_bacula\_database
    auszuf\"{u}hren.

\item ./make\_bacula\_tables

   Diese Script erstellt die von Bacula ben\"{o}tigten Tabellen.
 
\item ./grant\_bacula\_privileges

   Dieses Script erstellt den Datenbank-Benutzer "`bacula"', der nur begrenzte
   Datenbank-Berechtigungen erh\"{a}lt. Eventuell wollen Sie das Ihrer Situation entsprechend
   anpassen. Bitte beachten Sie auch, dass dem Datenbank-Benutzer bacula nicht
   automatisch ein Passwort zugewiesen wird.

\end{enumerate}

Jedes dieser drei Scripte (create\_bacula\_database, make\_bacula\_tables und
grant\_bacula\_privileges) erlaubt die Verwendung von Kommandozeilen-Parametern.
Damit k\"{o}nnen Sie den Datenbank-Benutzernamen oder auch mit "`-h Rechnername"'
einen Server angeben, auf dem die PostgreSQL-Instanz l\"{a}uft.

Um sich anzusehen, was f\"{u}r Zugriffsrechte die Scripte vergeben haben,
k\"{o}nnen Sie diese Kommando ausf\"{u}hren:

\footnotesize
\begin{alltt}
PostgreSQL-Verzeichnis/bin/psql --command \\dp bacula
\end{alltt}
\normalsize

Falls Autorisationsprobleme beim Zugriff auf die Datenbank auftreten,
kann es helfen die Datei pg\_hba.conf (normalerweise in /etc/postgresql/)
wie folgt anzupassen:

\footnotesize
\begin{alltt}
  local   all    all        ident  sameuser
to
  local   all    all        trust  sameuser
\end{alltt}
\normalsize

Dadurch k\"{o}nnen einige Probleme behoben werden. Allerdings ist das
aus Sicherheitsbedenken kein sehr guter Ansatz, auch wenns es hilft
ohne Passwort auf die Datenbank zuzugreifen.

Ein besserer Weg ist es auf Passworter-Autorisierung umzustellen
und dann bei jeden Datenbank-Login das vergebene Passwort zu benutzen.
Dazu f\"{u}gen Sie vor den existierenden "`local"' und "`host"' Eintr\"{a}gen
einfach die folgende Zeile ein:

\footnotesize
\begin{alltt}
  local bacula bacula md5
\end{alltt}
\normalsize

Danach ist es notwendig die PostgreSQL-Instanz neu zu starten oder
"`pg\_ctl reload"' auszuf\"{u}hren, damit die neue Regel aktiviert wird.
Als n\"{a}chstes muss noch ein Passwort f\"{u}r den Datenbank-Benutzer
bacula vergeben werden. Wechseln Sie dazu den Benutzer (z.B. mit su - postgres)
und f\"{u}hren Sie folgende Kommandos aus:

\footnotesize
\begin{alltt}
  \$ psql bacula
  bacula=# alter user bacula with password 'secret';
  ALTER USER
  bacula=# \\q
\end{alltt}
\normalsize

Das vergebene Passwort m\"{u}ssen Sie an den folgenden Stellen in
der Bacula-Konfiguration verwenden: einmal im Katalog-Eintrag
der Bacula-Director-Konfiguration und im Job-Eintrag des BackupCatalog-Jobs
bei dem RunBeforeJob-Kommando. Mit dem Passwort m\"{u}ssen diese
beiden Zeilen dann in etwa so aussehen:

\footnotesize
\begin{alltt}
  dbname = bacula; user = bacula; password = "secret"
    ... und ...
  # WARNING!!! Passing the password via the command line is insecure.
  # see comments in make_catalog_backup for details.
  RunBeforeJob = "/etc/make_catalog_backup bacula bacula secret"
\end{alltt}
\normalsize

Nat\"{u}rlich sollte ein mehr zuf\"{a}lliges Passwort gew\"{a}hlt werden
als in diesem Beispiel. Zudem sollte die Director-Konfiguratios-Datei bacula-dir.conf
entsprechend gesichert werden, dass nicht alle Benutzer Zugriff darauf haben,
sondern nur der Benutzer als der der Bacula-Director l\"{a}uft.

Der Datenbank-Zugriff kann auch \"{u}ber die Datei .pgpass,
im Home-Verzeichnis des entsprechenden Benutzer der Zugriff auf
die Datenbank ben\"{o}tigt, gel\"{o}st werden.
Dazu muss diese Datei folgendes enthalten:

\footnotesize
\begin{alltt}
  localhost:5432:bacula:bacula:secret
\end{alltt}
\normalsize

Danach kann diese Datei in die Home-Verzeichnisse aller Benutzer kopiert werden
die Datenbank-Zugriff erhalten sollen (z.B. bacula, root und den Benutzern die
\"{u}ber die Bacula-Console Zugriff haben sollen). Die Datei muss dem Benutzer
und seiner Gruppe geh\"{o}ren, f\"{u}r root also "`root:root"' und die
Zugriffsrechte m\"{u}ssen auf 600 (nur der Benutzer darf sie lesen) gesetzt sein.

\section{Re-Initialisierung der Katalog-Datenbank}
\index[general]{Datenbank!Re-Initialisierung der Katalog- }
\index[general]{Re-Initialisierung der Katalog-Datenbank }

Nachdem Sie einige anf\"{a}ngliche Tests mit Bacula gemacht haben, wollen
Sie eventuell Ihre Katalog-Datenbank komplett leeren, um alle gelaufenen
Test-Backups aus der Datenbank zu entfernen. Um das zu erreichen,
tun Sie folgendes:

\footnotesize
\begin{alltt}
  cd <install-directory>
  ./drop_bacula_tables
  ./make_bacula_tables
\end{alltt}
\normalsize

Bitte bedenken Sie, dass dabei alle Informationen unwiderruflich
aus der Datenbank gel\"{o}scht werden. Falls Sie auch beschriebene
Volumes wiederverwenden wollen, m\"{u}ssen Sie das Volume-Label
\"{u}berschreiben damit Bacula sie erneut benutzen kann.
Das erreichen Sie durch:

\footnotesize
\begin{alltt}
   (stop Bacula or unmount the drive)
   mt -f /dev/nst0 rewind
   mt -f /dev/nst0 weof
\end{alltt}
\normalsize

hierbei m\"{u}ssen Sie {\bf /dev/nst0} durch das Device ersetzen,
dem Ihr Tapelaufwerk entspricht.

\section{PostgreSQL RPM-Installation}
\index[general]{PostgreSQL!RPM-Installation}
\index[general]{PostgreSQL RPM-Installation}
Wenn Sie lieber die PostgreSQL-RPMs Ihrer Distribution verwenden wollen,
m\"{u}ssen Sie sowohl das PostgreSQL-RPM, als auch das PostgreSQL-Client-RPM
installieren. Die ben\"{o}tigten Client-Bibliotheken finden Sie normalerweise im
PostgreSQL-devel-RPM. Folgende Pakete m\"{u}ssen installiert werden:

\footnotesize
\begin{alltt}
  postgresql
  postgresql-devel
  postgresql-server
  postgresql-libs
\end{alltt}
\normalsize

Bei dem meisten anderen Paket-Managern werden die Pakete \"{a}hnlich
Namen haben. Nach der Installation der Pakete m\"{u}ssen Sie die oben genannten
Bacula-Scripte zur Datenbank-Einrichtung ausf\"{u}hren.


\section{Migration von MySQL zu PostgreSQL}
\index[general]{PostgreSQL!Migration von MySQL zu }
\index[general]{Migration von MySQL zu PostgreSQL }

Die hier beschriebenen Schritte wurden mit folgenden Software-Versionen getestet:

\begin{itemize}
\item Linux Mandrake 10/Kernel 2.4.22-10 SMP 
\item Mysql Ver 12.21 Distrib 4.0.15, for mandrake-linux-gnu (i586) 
\item PostgreSQL 7.3.4 
\item Bacula 1.34.5 
   \end{itemize}

Warnung: Sichern Sie Ihre komplette MySQL-Datenbank bevor Sie diese Schritte
ausf\"{u}hren!

\begin{enumerate}
\item Stoppen Sie Bacula (cd /etc/bacula;./bacula stop oder /etc/init.d/bacula stop)  
\item F\"{u}hren Sie das folgende Kommando aus, um die Daten Ihrer MySQL-Datenbank
zu exportieren:

   \footnotesize
\begin{alltt}
       mysqldump -f -t -n >bacula-backup.dmp

\end{alltt}
\normalsize

\item Sichern Sie Ihr /etc/Bacula-Verzeichnis, \"{a}ndern Sie aber nicht das bestehende Verzeichnis
\item F\"{u}hren Sie erneut die Konfiguration des Bacula-Quelltextes durch und w\"{a}hlen Sie dabei
PostgreSQL anstelle von MySQL als Datenbank aus (Option --with-postgresql=PostgreSQL-Verzeichnis).
\item Kompilieren und Installieren Sie Bacula.
\item Stoppen Sie MySQL.
\item Starten Sie PostgreSQL.
\item Erstellen Sie den Datenbankbenutzer bacula mit dem weiter oben beschriebenen Kommandos.
\item \"{U}berpr\"{u}fen Sie die Datei pg\_hba.conf daraufhin das der Benutzer bacula die entsprechenden 
Berechtigungen f\"{u}r den Datenbankzugriff besitzt. Wenn Ihr System entsprechend gesichert ist,
k\"{o}nnte der Eintrag so aussehen:

\footnotesize
\begin{alltt}
local all all trust

host all all 127.0.0.1 255.255.255.255 trust

Hinweis: PostgreSQL muss nach Anpassungen dieser Datei neu gestartet werden.
 
\end{alltt}
\normalsize

\item Wechseln Sie in das Verzeichnis /etc/bacula und Initialisieren Sie die Katalogdatenbank
mit diesen Kommandos:

\footnotesize
\begin{alltt}
./create_postgresql_database

./make_postgresql_tables

./grant_postgresql_privileges

\end{alltt}
\normalsize

\item \"{U}berpr\"{u}fen Sie, ob Sie die Berechtigung zum Datanbankzugriff haben: 

   \footnotesize
\begin{alltt}
psql -Ubacula bacula
\end{alltt}
\normalsize

Das sollte zu keinen Fehlern f\"{u}hren.

\item Importieren Sie die Daten aus Ihrer MySQL-Datenbank mit:

   \footnotesize
\begin{alltt}
psql -Ubacula bacula <bacula-backup.dmp>
\end{alltt}
\normalsize

\item Aktualisieren Sie die Datenbank-Tabellen mit folgenden Kommandos:

   \footnotesize
\begin{alltt}
psql -Ubacula bacula

SELECT SETVAL('basefiles_baseid_seq', (SELECT
MAX(baseid) FROM basefiles));
SELECT SETVAL('client_clientid_seq', (SELECT
MAX(clientid) FROM client));
SELECT SETVAL('file_fileid_seq', (SELECT MAX(fileid)
FROM file));
SELECT SETVAL('filename_filenameid_seq', (SELECT
MAX(filenameid) FROM filename));

SELECT SETVAL('fileset_filesetid_seq', (SELECT
MAX(filesetid) FROM fileset));

SELECT SETVAL('job_jobid_seq', (SELECT MAX(jobid) FROM job));
SELECT SETVAL('jobmedia_jobmediaid_seq', (SELECT
MAX(jobmediaid) FROM jobmedia));
SELECT SETVAL('media_mediaid_seq', (SELECT MAX(mediaid) FROM media));
SELECT SETVAL('path_pathid_seq', (SELECT MAX(pathid) FROM path));

SELECT SETVAL('pool_poolid_seq', (SELECT MAX(poolid) FROM pool));

\end{alltt}
\normalsize

\item Starten Sie Bacula und \"{u}berpr\"{u}fen Sie den Datenbestand.
F\"{u}hren Sie einen Backup-Job aus um zu sehen, ob alles erwartungsgem\"{a}{\ss} funktioniert.
\end{enumerate}

\section{PostgreSQL updaten}
\index[general]{PostgreSQL updaten }
\index[general]{updaten!PostgreSQL }
\index[general]{Updaten}
Wenn Sie PostgreSQL aktualisieren, m\"{u}ssen Sie Bacula
neu kompilieren und installieren, andernfalls kann es zu
Fehlern kommen. Auch nach der Aktualisierung der PostgreSQL-RPMs
ist es notwendig Bacula neu zu bauen. Das k\"{o}nnen Sie einfach,
mit den entsprechenden RPM-Kommandos, \"{u}ber das Bacula-Source-RPM
ereichen. Eventuell m\"{u}ssen Sie aber vorher die bacula.spec
anpassen, damit es mit der neuen PostgreSQL-Version funktioniert.
