PostgreSQL auf Mac OS X selbstgebaut


Dies ist eine Anleitung, um PostgreSQL auf Mac OS X Tiger zu installieren. Diese Anleitung ist größtenteils an diese Anleitung angelehnt, doch an einigen Stellen weiche ich davon ab, wo es mir sinnvoll erschien. Ich habe sie für mich und meinen Arbeitskollegen geschrieben, doch ich hoffe, daß sie sich auch für andere als hilfreich erweist.

Es gibt viele Anleitungen, die beschreiben, wie man PostgreSQL auf einem Unix-System installiert. Mac OS X ist im Grunde ein solches. Doch es bringt ein zusätzliches Verzeichnis-Layout mit sich, was sich hierfür eher anbietet. Nach der Installation befinden sich alle Dateien von PostgreSQL in /Library/PostgreSQL. Zusätzlich werden die Binaries sowie die Man-Pages nach /usr/local symlinked, damit man diese einfach von der Kommandozeile benutzen kann. (/usr/local/bin werden die meisten im $PATH haben). Zum Schluß landen die Datenbanken selbst in /Users/Shared/PostgreSQL. Alle Schritte wurden auf einem Powerbook mit G4-Prozessor durchgeführt, sollten jedoch auf den neuen Intel-Macs genauso funktionieren.

Die folgenden Schritte setzen voraus, daß Xcode auf dem System installiert ist. Ansonsten wird es schwierig, PostgreSQL zu kompilieren.

Installation von PostgreSQL auf Mac OS X

Nachdem du die Quelltexte von PostgreSQL (in meinem Fall ist es PostgreSQL 8.1.3) ausgepackt hast, wechsel in das Verzeichnis mit den Quelltexten. Der Anfang ist der übliche GNU-Dreisatz.

  1. ./configure --prefix=/Library/PostgreSQL --enable-thread-safety \
     --with-krb5 --with-bonjour --with-openssl
  2. make

    (nun ist etwas Zeit für einen Kaffee oder ein anderes Getränk)

  3. sudo make install
  4. Ich habe mich entschieden, die uid/gid 73 zu benutzen, da diese frei war. Dies muß bei späteren Mac OS X-Versionen nicht unbedingt der Fall sein, und es tut im Grunde auch jede andere uid/gid, solange diese bislang frei war. Die Gruppe und der Benutzer legst du mit diesen Befehlen an.
    sudo niutil -create . /groups/postgres
    sudo niutil -createprop . /groups/postgres gid 73
    sudo niutil -createprop . /groups/postgres realname "PostgreSQL Users"
    sudo niutil -createprop . /groups/postgres name postgres
    sudo niutil -createprop . /groups/postgres passwd "*"

    An dieser Stelle kannst du noch dich selbst zur Gruppe postgres hinzufügen. z.B:

    sudo niutil -createprop . /groups/postgres users fastjack

    (hier solltest du deinen Login-Namen einsetzen, außer du meldest dich auch als „fastjack“ an)

    sudo niutil -create . /users/postgres
    sudo niutil -createprop . /users/postgres uid 73
    sudo niutil -createprop . /users/postgres gid 73
    sudo niutil -createprop . /users/postgres name postgres
    sudo niutil -createprop . /users/postgres realname "PostgreSQL User"
    sudo niutil -createprop . /users/postgres shell /bin/sh
    sudo niutil -createprop . /users/postgres home /Users/Shared/PostgreSQL
    sudo niutil -createprop . /users/postgres passwd "*"
    sudo niutil -createprop . /users/postgres expire 0
    sudo niutil -createprop . /users/postgres change 0

    Falls du lieber mit einem graphischen Tool arbeitest, kannst du den NetInfo Manager (befindet sich bei den Dienstprogrammen) benutzen.

  5. Mac OS X sollte die Gruppe und den Benutzer direkt erkennen. Ein kurzer Test mit „sudo -u postgres id“ sollte folgende Ausgabe bringen:
    uid=73(postgres) gid=73(postgres) groups=73(postgres)Wir können also diesen Benutzer nun verwenden.
  6. Jetzt sollte das Verzeichnis mit dem frisch installierten PostgreSQL noch der Gruppe der PostgreSQL-Benutzer zugänglich gemacht werden. Dies ist nicht unbedingt nötig, doch ich wollte da ganz sichergehen.
    sudo chgrp -R postgres /Library/PostgreSQL
    sudo chmod -R g+r /Library/PostgreSQL
    sudo chmod -R g+x /Library/PostgreSQL/bin/*
  7. Lege nun die Symlinks für die einzelnen Binaries in /usr/local/bin an, sowie die Man-Pages in /usr/local/man. Falls die Verzeichnisse in /usr/localnoch nicht existieren, lege sie vorher an.
    cd /Library/PostgreSQL/bin
    for FOO in /Library/PostgreSQL/bin/*; do
    sudo ln -s $FOO /usr/local/bin/${FOO#$(pwd)/}
    done
    cd ../man/man1
    for FOO in /Library/PostgreSQL/man/man1/*; do
    sudo ln -s $FOO /usr/local/man/man1/${FOO#$(pwd)/}
    done
    cd ../man7
    for FOO in /Library/PostgreSQL/man/man7/*; do
    sudo ln -s $FOO /usr/local/man/man7/${FOO#$(pwd)/}
    done
  8. Zsh-Benutzer werden sollten an dieser Stelle einmal rehash aufrufen, damit die Shell die Binaries in /usr/local/binfindet.Ergänzung: Sollten es beim erstellen der Symlinks zu Fehlermeldungen kommen, so könnte es sein, daß die Verzeichnisse /usr/local/bin, /usr/local/man/man1 oder /usr/local/man/man7 nicht exisitieren. Lege diese dann an und führe das Skript zum erstellen der Symlinks erneut aus.
  9. Nun wird es an der Zeit, auch eine Datenbank anzulegen, oder einen Cluster, wie es im PostgreSQL-Slang heißt.Wie ich bereits am Anfang erwähnte, soll die Datenbank in /Users/Shared/PostgreSQL liegen. Dazu muß das Verzeichnis erst existieren. Lege das Verzeichnis mit folgendem Befehl an.
    sudo mkdir -p /Users/Shared/PostgreSQL
    sudo chown postgres:postgres /Users/Shared/PostgreSQL

    Und jetzt initialisiere die Datenbank mit initdb.

    sudo -u postgres initdb -U dba -A md5 -E UTF8 -W -D /Users/Shared/PostgreSQL/data

    Nun sollte erstmal ein Haufen Zeilen über den Bildschirm huschen. An einer Stelle wirst du nach dem Passwort für den Admin (in diesem Fall habe ich den Admin „dba“ genannt) gefragt. Gib dort ein Passwort ein, aber vergiß es hinterher nicht!

    The files belonging to this database system will be owned by user "postgres".
    This user must also own the server process.
    
    The database cluster will be initialized with locale C.
    
    creating directory /Users/Shared/PostgreSQL/data ... ok
    creating directory /Users/Shared/PostgreSQL/data/global ... ok
    creating directory /Users/Shared/PostgreSQL/data/pg_xlog ... ok
    creating directory /Users/Shared/PostgreSQL/data/pg_xlog/archive_status ... ok
    creating directory /Users/Shared/PostgreSQL/data/pg_clog ... ok
    creating directory /Users/Shared/PostgreSQL/data/pg_subtrans ... ok
    creating directory /Users/Shared/PostgreSQL/data/pg_twophase ... ok
    creating directory /Users/Shared/PostgreSQL/data/pg_multixact/members ... ok
    creating directory /Users/Shared/PostgreSQL/data/pg_multixact/offsets ... ok
    creating directory /Users/Shared/PostgreSQL/data/base ... ok
    creating directory /Users/Shared/PostgreSQL/data/base/1 ... ok
    creating directory /Users/Shared/PostgreSQL/data/pg_tblspc ... ok
    selecting default max_connections ... 50
    selecting default shared_buffers ... 300
    creating configuration files ... ok
    creating template1 database in /Users/Shared/PostgreSQL/data/base/1 ... ok
    initializing pg_authid ... ok
    Enter new superuser password: Hier das Passwort eingeben
    Enter it again: und hier nochmal wiederholen
    setting password ... ok
    enabling unlimited row size for system tables ... ok
    initializing dependencies ... ok
    creating system views ... ok
    loading pg_description ... ok
    creating conversions ... ok
    setting privileges on built-in objects ... ok
    creating information schema ... ok
    vacuuming database template1 ... ok
    copying template1 to template0 ... ok
    copying template1 to postgres ... ok
    
    Success. You can now start the database server using:
    
        postmaster -D /Users/Shared/PostgreSQL/data
    or
        pg_ctl -D /Users/Shared/PostgreSQL/data -l logfile start
  10. Damit der Server auch ein Log anlegt, was uns bei Problemen hilfreich sein könnte, mußt du noch ein Verzeichnis in /var/loganlegen. Der postgres-Benutzer muß Schreibrechte für dieses Verzeichnis besitzen. Dies geht am besten mit diesen Befehlen:
    sudo mkdir /var/log/pgsql
    sudo chown postgres /var/log/pgsql

    Damit sollte das Verzeichnis für den PostgreSQL-Server beschreibbar sein, damit dieser uns seine Befindlichkeiten mitteilen kann. Falls du ein anderes Verzeichnis verwenden möchtest, so muß der Pfad entsprechend in der launchd-Konfigurationsdatei aus dem nächsten Schritt auch geändert werden.

  11. Nun könntest du zwar den Server, wie oben beschrieben, starten, doch dies würde nur bis zum nächsten Reboot halten. Da muß was dauerhaftes her. Dazu braucht Mac OS X Tiger eine Konfigurationsdatei für den launchd. Meine sieht so aus. (Im Grunde ist sie unverändert aus der Anfangs erwähnten englischen Anleitung)
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 
    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"  "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict>     <key>Label</key>     <string>org.postgresql.postmaster</string>     <key>OnDemand</key>     <false/>     <key>ProgramArguments</key>     <array>         <string>/Library/PostgreSQL/bin/postmaster</string>         <string>-D</string>         <string>/Users/Shared/PostgreSQL/data</string>         <string>-c</string>         <string>redirect_stderr=YES</string>         <string>-c</string>         <string>log_connections=YES</string>         <string>-c</string>         <string>log_directory=/var/log/pgsql</string>         <string>-c</string>         <string>log_filename=postgres_log</string>     </array>     <key>ServiceDescription</key>     <string>PostgreSQL Server</string>     <key>UserName</key>     <string>postgres</string> </dict> </plist> 

    Speichere diese Datei als org.postgresql.postmaster.plist und kopiere sie dann nach /Library/LaunchDaemons. Hier auch direkt zum herunterladen.

    Diese Datei benötigt Mac OS X in /Library/LaunchDaemons, damit der PostgreSQL-Server beim booten mitgestartet wird. Von Hand kann nun der Server mit folgenden Befehlen gestartet werden:

    sudo launchctl load /Library/LaunchDaemons/org.postgresql.postmaster.plist
    sudo launchctl start org.postgresql.postmaster
  12. Der Server sollte nun eigentlich laufen. Ein ps ax | egrep "post(master|gres)"sollte ungefähr folgendes Bild ergeben:
      1825  ??  Ss     0:00.29 /Library/PostgreSQL/bin/postmaster -D /Users/Shared/PostgreSQL/data
    -c redirect_stderr=YES -c log_connections=YES -c log_directory=/var/log/pgsql -c log_filename=postgres_log
      1827  ??  S      0:00.02 postgres: logger process
      1829  ??  R      0:00.08 postgres: writer process
      1830  ??  S      0:00.00 postgres: stats buffer process
      1831  ??  S      0:00.01 postgres: stats collector process

    Der Server läuft also. In /var/log/pgsql sollte sich nun auch ein Logfile wiederfinden. Schau darin nach, ob auch alles reibungslos gelaufen ist. Sollten sich Probleme ergeben, so ist das Logfile die erste Anlaufstelle, um Hinweise zur Lösung zu finden. Mein Logfile sieht so aus:

    LOG:  database system was shut down at 2006-05-03 08:22:15 CEST
    LOG:  checkpoint record is at 0/33E75C
    LOG:  redo record is at 0/33E75C; undo record is at 0/0; shutdown TRUE
    LOG:  next transaction ID: 567; next OID: 10793
    LOG:  next MultiXactId: 1; next MultiXactOffset: 0
    LOG:  database system is ready
    LOG:  transaction ID wrap limit is 2147484148, limited by database "postgres"

    Wir können also eine erste Kontaktaufnahme zum Server wagen. Da wir beim initdb keinen Benutzernamen als Datenbankadministrator angegeben haben, ist der Name des Datenbankadministrators „postgres“. Um also als Datenbankadministrator eine Verbindung zur Datenbank aufzubauen, gib folgenden Befehl ein: psql -U dba template1. PostgreSQL sollte nun nach dem Passwort fragen, was wir beim initdb (s. Punkt 9) festgelegt haben. Nach erfolgreicher Authentifizierung, sollte uns der Prompt des Komandozeilenclients für PostgreSQL begrüßen:

    Welcome to psql 8.1.3, the PostgreSQL interactive terminal.
    
    Type:  \copyright for distribution terms
           \h for help with SQL commands
           \? for help with psql commands
           \g or terminate with semicolon to execute query
           \q to quit
    
    template1=#

    Da wir noch keine eigenen Datenbanken angelegt haben, wird sich die Beispielquery auf eine unspektakuläre Addition beschränken. Gib am Prompt folgendes ein: select 1+1; (Das Semikolon darf hier nicht weggelassen werden). PostgreSQL sollte nun so antworten:

     ?column?
    ----------
            2
    (1 row)

    Damit ist klar, daß 1 + 1 = 2 ist, und daß PostgreSQL rechnen kann.

  13. Die folgenden Schritte sind optional und eher für Anfänger empfohlen, um sich ein wenig mit PostgreSQL vertraut zu machen. Fortgeschrittene können den Rest getrost überspringen.Nun wollen wir erstmal eine neue Datenbank anlegen, in der wir auch arbeiten können. Du solltest nicht versuchen, Datenbanken in der template1-Datenbank anzulegen. Diese Datebank wird als Vorlage bei jedem „create database“ benutzt. Alles was in dieser Datenbank also angelegt wird, wird in jede neu erstellte Datenbank kopiert, was nicht unbedingt gewünscht ist.Eine neue Datebank kann man entweder von der Shell mit „createdb“ oder im PostgreSQL-Client mit „create database“. Da wir noch im PostgreSQL-Client (hoffentlich) drin sind, können wir also schnell eine Datenbank mit create database testdb; anlegen. Der Client sollte dies mit einem „CREATE DATABASE“ bestätigen. Wechsel nun zu dieser Datenbank mit \connect testdb. Der Prompt sollte nun den Namen der neuen Datenbank anzeigen.
  14. Legen wir also nun eine Tabelle in unserer neuen Datebank an.
    create table testtable
    id serial,
    somestring varchar(20),
    primary key(id)
    );

    PostgreSQL wird nun einige Meldungen ausgeben und zum Schluß mit „CREATE TABLE“ bestätigen, daß eine neue Tabelle angelegt wurde. Hier gibt es einige PostgreSQL-Besonderheiten zu beachten (besonders für MySQL-Umsteiger). PostgreSQL wandelt Tabellen- und Spaltennamen standardmäßig in Kleinbuchstaben um, wenn sie nicht nicht explizit in doppelte Anführungszeichen setzt. Hätten wir also „create table TestTable…“ geschrieben, wäre trotzdem nur eine Tabelle mit dem Namen „testtable“ angelegt worden. Wollten wir tatsächlich eine Tabelle „TestTable“ anlegen, so hätten wir „create table "TestTable"…“ schreiben müssen.

  15. Die Tabelle ist im Augenblick noch leer. Fügen wir also ein paar Datensätze ein.
    insert into testtable (somestring) values ('foo');
    insert into testtable (somestring) values ('bar');
    insert into testtable (somestring) values ('baz');
    insert into testtable (somestring) values ('qux');
  16. Um die Daten auch wieder aus der Tabelle herauszuholen, führen wir select * from testtable;aus. PostgreSQL sollte mit dem Inhalt der gesamten Tabelle antworten.
     id | somestring
    ----+------------
      1 | foo
      2 | bar
      3 | baz
      4 | qux
    (4 rows)

Damit läuft PostgreSQL nun auf auf deinem Mac. Jetzt kannst du es mit sinnvollen Daten füllen.

Nachtrag: Folgender Alias für die Shell hat sich als recht nützlich erwiesen: alias pg_ctl='sudo -u postgres pg_ctl'.


One response to “PostgreSQL auf Mac OS X selbstgebaut”

  1. Schöne Anleitung. Leider fehlt mir noch immer eine Anleitung, wie Module nachinstalliert werden können. Beipsielsweise das Modul fuzzystrmatch. Anleiung für Linux gibt es dergelichen viele, aber unter Mac OS ist mir das einfach nicht möglich.