initdb fails, windows server 2008, uac?

Hallo,

ich habe versucht die aktuelle PostgreSQL Version (9.0.4) auf einem Windows Server 2008 System (mit Adminaccount + Rechtsklick als Admin ausführen) zu installieren.
Die Datenbank konnte jedoch nicht initialisiert werden, die initcluster.vbs hat folgende Zeilen ins Logfile geschrieben:

Executing cscript //NoLogo "C:\Program Files\PostgreSQL\9.0/installer/server/initcluster.vbs" "postgres" "postgres" "****" "C:\Program Files\PostgreSQL\9.0" "C:\Program Files\PostgreSQL\9.0\data" 5432 "DEFAULT"
Script exit code: 1

Script output:
 WScript.Shell Initialized...
Scripting.FileSystemObject initialized...

Called CreateDirectory(C:\Program Files\PostgreSQL\9.0\data)...
Called CreateDirectory(C:\Program Files\PostgreSQL\9.0)...
WScript.Network initialized...
Called IsVistaOrNewer()...
    'winmgmts' object initialized...
    Version:6.0
    MajorVersion:6
Ensuring we can write to the data directory (using icacls):
    Executing batch file 'radB4C2E.bat'...
    Bearbeitete Datei: C:\Program Files\PostgreSQL\9.0\data
1 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten.

    Executing batch file 'radB4C2E.bat'...
    Die Dateien, die zu diesem Datenbanksystem geh”ren, werden dem Benutzer
¯administrator® geh”ren. Diesem Benutzer muss auch der Serverprozess geh”ren.

Der Datenbankcluster wird mit der Locale German_Germany.1252 initialisiert werden.
Die Standardtextsuchekonfiguration wird auf ¯german® gesetzt.

berichtige Zugriffsrechte des bestehenden Verzeichnisses C:/Program Files/PostgreSQL/9.0/data ... initdb: konnte Rechte des Verzeichnisses ¯C:/Program Files/PostgreSQL/9.0/data® nicht „ndern: Permission denied

Called Die(Failed to initialise the database cluster with initdb)...
Failed to initialise the database cluster with initdb

Nun hab ich diesen Beitrag gelesen: http://www.pg-forum.de/h-ufig-gestellte-fragen-faq/1706-installation-von-postgresql-unter-windows-scheitert-oder-funktioniert-nicht.html
und dementsprechend deutet alles darauf hin, dass ich vor der Installation die UAC deaktivieren muss, damit alles glatt durchläuft.
Da ich nun aber keinen Schimmer habe, welche Effekte das Abschalten der UAC hat, ich mich mit dem Server nicht wirklich auskenne, das Ding im laufenden Betrieb ist und möglichst weder neu gestartet noch sonstwie beeinträchtigt werden sollte möcht ich mich hier nochmal vorher absichern.
Also:

  1. Ist das in diesem Fall tatsächlich die Lösung des Problems, die UAC während der Installation zu deaktivieren (und anschließend wieder reaktivieren)? Kann es dann nach der Installation noch zu Problemen in dem Zusammenhang kommen?
  2. Hat das Deaktivieren der UAC weitere Eigenschaften im Zusammenhang mit einem Server im laufenden Betrieb, die ich kennen sollte?

Vielen Dank schon Mal im Voraus!

Das initdb solltest Du nicht als Admin laufen lassen sondern als “postgres” (der Windows Benutzer unter dem später der Service laufen wird), dann stimmen die Berechtigungen auf dem Datenverzeichnis auf jeden Fall.

Aber das müsste der One-Click-Installer doch automatisch so machen?

Ich meine soweit ich das aus dem Install-Logfile rauslesen kann wird beim Aufruf des initcluster.vbs Scripts der Name des Service Accounts mitgegeben, und das Script leitet den dann an die initdb.exe weiter.

Executing cscript //NoLogo "C:\Program Files\PostgreSQL\9.0/installer/server/initcluster.vbs" [B]"postgres" "postgres" "****" [/B]"C:\Program Files\PostgreSQL\9.0" "C:\Program Files\PostgreSQL\9.0\data" 5432 "DEFAULT"

Das schon, aber das Script wird ja als “Admin” ausgeführt, weil Du den One-Click-Installer als Admin ausgeführt hast (soweit ich das im Kopf habe).

Ich mach das immer alles “manuell”, deswegen weiß ich nicht so genau was der Installer im Einzelnen macht.

Naja, bei Windows XP funktioniert das mit dem One-Click-Installer auch so, dass er automatisch den Benutzer wechselt wenn’s notwendig ist. Könnte mir nicht vorstellen warum das auf dem Win Server 2008 anders sein sollte, der Installer ist ja der gleiche.

Ach so, das wusste ich nicht.

Aber reicht es nicht, wenn Du nur für die Zeit wo der Installer läuft die UAC abschaltest?

Genau deswegen wollte ich ja fragen, ob damit hier schon jemand Erfahrungen gemacht hat.
Ist wie gesagt ein Server im laufenden Betrieb (zwar nur firmenintern, aber immerhin), ich würde ungern der Verursacher sein, wenn durch Sicherheitslücken dank abgeschalteter UAC da irgendwas schief läuft. Kann ich evtl. angeben, dass ich die UAC nur für den Installer deaktiviere und nicht komplett für das ganze System?

Hi,

Bist du sicher, dass du “postgres” als Systembenutzer angegeben hast?
Wieso sollen den dann die Dateien “administrator” gehören?

Postgres möchte nicht als “root” oder “administrator” laufen(um nicht evtl. das ganze System zu beeinträchtigen,
falls es zu einer Korruption des Kontos kommt),
sondern einen eigenen Benutzer auf dem System haben, unter dem der Service läuft und dem auch das Data-Directory gehört.
Neben diesem System-Benutzer, gibt es auch einen DB-eigenen Superuser, der “postgres” heisst.
Die beiden darf man nicht verwechseln.

Die Installation unter 2008 sollte wie unter win 7 laufen, d.h. das die Rechte zur Installation vom Installer dann angefragt werden , wenn sie benötigt werden.
D.h. für die Installation brauchst du Admin-Rechte, aber nicht für den Betrieb.
Die UAC kann ab win7 (glaube ich)ohne neustart geändert werden, hat aber nichts mit deinem Problem zu tun.

HTH Hkocam

[/quote]

Hätte vielleicht im Eingangspost noch dazuschreiben sollen, dass ich den One-Click-Installer verwende und den mit Adminrechten ausführe. Kann ich aber leider nicht mehr editieren. Der Installer legt den “postgres”-Benutzer selbst an und sollte für die Datenbankinitialisierung auch automatisch diesen Benutzer verwenden. Die Dateien sollen also gar nicht dem “Administrator” gehören.

Aber wie löse ich mein Problem dann?

Also ein neu aufgesetztes Windows Server 2008 in gleicher Version macht offenbar keine Probleme. Aber das ist natürlich nicht genauso konfiguriert wie der echte Server, möglicherweise macht das den Unterschied.

Hat denn keiner von euch eine Idee, woran das liegen könnte?
Bin für jeden Rat dankbar!

Edit: Offenbar hängt es ja erstmal daran, dass er die Zugriffsrechte des Verzeichnisses nicht ändern kann. Kann ich das möglicherweise manuell machen und die initdb.exe dann nochmals manuell aufrufen? Wenn ja wie mach ich das (beides)?

Also ich hatte es jetzt auf einem Windows7 (64bit) mit dem One-Click Installer von 9.1

Initdb ist einfach nicht fertig geworden. Im ProcessExplorer habe ich dann gesehen, dass das .vbs Script offensichtlich versucht die Berechtigungen für das Datenverzeichnis via iacls.exe zu setzen. Bei wurde das ingesamt viermal aufgerufen. Zweimal für den (Admin)Benutzer unter dem ich den Installer gestartet habe, und zweimal für den Postgres Service Account.

Das Datenverzeichnis war mit c:\Daten\db\pgdata91 angegeben, der Installer ruft einmal ein iacls.exe für c:\ (!!) auf und dann nochmal für c:\Daten was bei einer gut gefüllten Platte ziemlich lange dauern wird.

Ich habe dann den Installer abgebrochen, die Rechte manuell auf das Verzeichnis gesetzt und beim nächsten Lauf des Installers einfach die iacls.exe gekillt. Danach lief das initdb problemlos durch und der Service ist auch gestartet und funktioniert.

Nicht hübsch, aber wenigsten klappt es so. Ich habe den Fehler in der Mailingliste gepostet, bis jetzt aber noch kein Feedback bekommen.

Die 9.1er hab ich noch gar nicht probiert ehrlich gesagt. Scheint aber nochmal ein anderer Fehler zu sein, da es bei mir im Prinzip sofort nach dem Aufruf von initdb hakt, weil er keine Befugnis hat die Rechte von dem Verzeichnis zu verändern.

Mein nächster Versuch (morgen früh) wäre dann erstmal den Installer laufen zu lassen bis dieser Fehler kommt, dann versuchen die Rechte manuell zu setzen und dann die initdb.exe manuell aufrufen. Damit müsste die Installation dann abgeschlossen sein, oder?
Ansonsten hau ich nochmal die 9.1er drüber mit dem Hinweis von dir. Danke auf jeden Fall schon mal!

Was wäre denn die Vorgehensweise wenn ich das ohne den Installer installiere? Ist das irgendwie überschaubar?
Binaries runterladen und entpacken, Service Account anlegen,

Ich persönliche finde das ziemlich einfach.

Binaries runterladen und entpacken, Service Account anlegen

Genau, dann (als postgres Windows benutzer) initdb aufrufen. Da als Postgres Benutzer gestartet, stimmten auch die Berechtigungen.
Als Admin dann “pg_ctl register” aufrufen um den Service anzulegen. Fertig

OK, auf mein Posting in der Mailingliste kam eine Antwort. Der Aufruf von iacls.exe ist nicht so, dass es rekursiv für alle Unterverzeichnisse gemacht wird - da habe ich mich geirrt. Es wird nur dafür gesorgt, dass alle Verzeichnisse bis zum Datenverzeichnis die korrekten Berechtigungen haben.
Warum es dann allerdings “hängt” weiß ich auch nicht.

Ich habe jetzt den 9.1-Installer statt dem 9.0.4er probiert, bekomme aber exakt denselben Fehler wie vorher auch, das Logfile ist im Grunde identisch, sobald er den Punkt “berichtige Zugriffsrechte des bestehenden Verzeichnisses” erreicht, scheidet er mit “Permission denied” aus.
Habe dann versucht das ganze auf einem anderen Server zu installieren, OS Win Server 2003, aber es kommt dennoch der gleiche Fehler. Scheint also ein übergreifendes Problem zu sein, das irgendwie mit der Domäne zusammenhängt? Manuell konnte ich alle Rechte für den lokalen Postgres-Account setzen, auch per cmd mit der icacls.exe, so wie du es in der Mailinglist beschrieben hast. Verstehe also nicht so ganz warum der Installer sich damit schwer tut.

Montag bekomme ich einen komplett “leeren” Rechner mit XP hingestellt auf dem ich rumspielen kann. Dann ist mir auch keiner böse wenn ich da manuell was dran rumdoktore. :wink:

Ich habe die 9.0.4er jetzt manuell installiert, habe aber dieselbe Fehlermeldung bekommen beim Aufruf der initdb.exe wie mit dem Installer. Daraufhin habe ich dem Windows-Benutzer postgres für das PostgreSQL-Verzeichnis Vollzugriff gegeben, damit er auch die Berechtigungen lesen und ändern kann. Beim erneuten Start lief die initdb.exe ohne Fehler durch und PostgreSQL ist installiert und funktioniert.

Also nochmal vielen Dank für deine Hilfe, castorp!

Schön. Und nun 9.0.5, denn die .4 hat einen Bug. Oder aber gleich 9.1.1 :wink:

Andreas

Dazu noch eine blöde Frage:

Von 9.0.4 auf 9.0.5 kommt man ja durch schlichtes Ersetzen der Binaries. Wie funktioniert das von 9.0.5 auf 9.1.1? Dumpall, komplett deinstallieren, neuinstallieren, und restore? Oder gibts einen einfacheren Weg?
“UPDATE postgreSQL SET version = 9.1.1;” oder sowas wäre doch klasse. :smiley:

pg_upgrade, aber noch nicht getestet. Ach ja: nutze für den dumpall das aus der neueren Version.


Andreas