Ich fasse mich kurz: Nachdem ich PostgreSQL einmal installiert, testweise betrieben danach aber wieder deinstalliert hatte, habe ich es kürzlich neu installiert (apt-get). Nun läuft das Ding, doch ich habe keine “template0” Datenbank. Bevor ich eigene DBs anzulegen beginne, möchte ich dies jetzt richtig stellen.
Frage: Wie kann ich mir “template0” (und “template1”) wieder erstellen lassen?
Das Verzeichnis dafür existiert bereits (/usr/local/pgsql/data…), doch ich habe darin noch nichts Eigenes erstellt. Ich könnte also problemlos riskieren, dieses zu löschen und vollständig neu erstellen zu lassen.
Wenn Du weder template0 noch template1 hast, dann wirst Du kaum eigene Datenbanken erstellen können, denn dazu brauchst Du eine templateX - Datenbank oder eine andere, bereits von Dir angelegte. Henne-Ei-Problem.
could not change directory to "/root"
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 de_CH.UTF-8.
The default database encoding has accordingly been set to UTF8.
The default text search configuration will be set to "german".
creating directory /usr/local/psql/data ... initdb: could not create directory "/usr/local/psql": Keine Berechtigung
Das Verzeichnis existiert jedoch bereits mit owner “root” und group “postgres”. Die darunter liegenden Verzeishnisse /8.4/bin und /8.4/lib ebenfalls.
Soll ich dieses ganze Verzeichnis erst löschen?
Übrigens: Die ERSTE Meldung (could not change directory to “/root”) kommt mir auch spanisch vor. Woher kommt diese denn? Etwas falsch mit “passwd”? Das sieht bei mir so aus:
Nachtrag: Ich habe das Verzeichnis jetzt gelöscht und (natürlich via user postgres) mittels INITDB neu anlegen lassen. So sieht das aus:
could not change directory to "/root"
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 de_CH.UTF-8.
The default database encoding has accordingly been set to UTF8.
The default text search configuration will be set to "german".
creating directory /usr/local/psql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 24MB
creating configuration files ... ok
creating template1 database in /usr/local/psql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... 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
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.
Success. You can now start the database server using:
/usr/lib/postgresql/8.4/bin/postgres -D /usr/local/psql/data
or
/usr/lib/postgresql/8.4/bin/pg_ctl -D /usr/local/psql/data -l logfile start
Trotzdem: Logge ich mich mit phpgAdmin dort ein (nach einem Server-Restart, sicherheitshalber) sehe ich dort nur ein Schema “public” OHNE Tabellen, Sichten, Sequenzen, Funktionen und Domänen. Da sind keine “templates”…
der physische Speicherort kann eigentlich egal sein. Die Datenbanken (templateX sind Datenbanken) liegen unterhalb von $data_directory/base in ordnern, die mit Zahlen benannt sind. Was wo liegt, bekommst Du aus der Tabelle pg_database raus:
test=*# select oid, datname from pg_database ;
oid | datname
-------+-----------
1 | template1
12690 | template0
12698 | postgres
16385 | test
(4 rows)
Die Spalte “oid” ist dabei der Name des Ordners.
Aber, wie gesagt, der physische Speicherort kann Dir eigentlich egal sein…
Hmmm… Also die Templates existieren. INITDB hat sie “nachweislich” erstellt und ich sehe sie auch in /usr/local/psql/data/base/…(nummern). Soweit sieht das IMO ok aus.
Jetzt aber wird’s komisch:
postgresql status
--liefert-->
Running clusters: 8.4/main
...
Die Clusters sind doch nicht DORT, sondern - siehe oben: in /usr/local/…
Mir scheint, dass da irgendeine Config schief ist. Doch WELCHE Config? Die von postgresql oder die vom Admin?
Ich würde jetzt gerne erst mal die von postgresql verifizieren:
a) Weshalb zeigt mit Status diesen (IMO falschen) Cluster an?
b) Kann ich einen geeigneten SQL-Befehl absetzen, der mir mit Sicherheit anzeigt, ob PG korrekt (mit den neu angelegten templates) funktioniert?
Übrigens: Auch dies wird bei mir korrekt angezeigt:
Ja, der zeigt mir genau das an, was eben gerade nicht stimmt:
postgres@nas:/root$ psql -c "show data_directory" template1
could not change directory to "/root"
data_directory
------------------------------
/var/lib/postgresql/8.4/main
(1 row)
Dort liegen schon auch Datenbanken; doch ich habe keine Ahnung WESHALB. Jedenfalls: Dort WILL ICH SIE NICHT
Wie kommt der auf diese Idee? Welche Config nimmt der denn, wenn er “auto-gestartet” wird? Wie kann ich das verifizieren? (jene im data-Verzeichnis kann er ja erst dann berücksichtigen, wenn er weiss, welches das data-Verzeichnis ist)
Ausserdem: Ich habe PG eben gestoppt und manuell mit “-D /usr/local/psql/data” neu gestartet. Doch in PhpPgAdmin hat sich dadurch gar nichts geändert.
Übrigens: Kann mir jemand die Zeile für “postgres” aus “password” zeigen? Meine sieht so aus - ist das korrekt (und sinnvoll)?