reinstall PosgresQL - wo ist template0?

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.

Frage: hast Du initdb ausgeführt?


Andreas

Ich meinte eigentlich: ja - woher sonst sollte das Verzeichnis (und dessen Inhalt) stammen?

Trotzdem habe ich das jetzt nochmal versucht (erst su postgres, dann):

 /usr/lib/postgresql/8.4/bin/initdb -D /usr/local/psql/data

Der liefert mir jetzt aber:

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:

postgres:x:108:113:PostgreSQL administrator,,,:/usr/lib/postgresql/8.4/bin:/bin/bash

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”…

Noch ein Nachtrag. Was oben (Meldungen von INITDB) ersichtlich ist, sehe ich auch hier:

postgres@nas:/root$ psql -l
could not change directory to "/root"
                                  List of databases
   Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | de_CH.UTF-8 | de_CH.UTF-8 |
 template0 | postgres | UTF8     | de_CH.UTF-8 | de_CH.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 template1 | postgres | UTF8     | de_CH.UTF-8 | de_CH.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
(3 rows)
  1. Mich irritiert noch immer die erste Fehlermeldung bzgl. “root”. Was soll das?

  2. WO LIEGT diese Datenbank und wo sind diese (frisch angelegten) Templates?

  1. kann ich Dir nicht sagen.

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…


Andreas

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:

postgres=# select oid, datname from pg_database ;
  oid  |  datname
-------+-----------
     1 | template1
 11563 | template0
 11564 | postgres
(3 rows)

psql -c “show data_directory” template1

Das zeigt Dir an, wo data_dir liegt. Wo das ist, wird mit der postgresql.conf oder aber beim Start des Servers via -D festgelegt.


Andreas

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 :slight_smile:

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)?

postgres:x:108:113:PostgreSQL administrator,,,:/usr/lib/postgresql/8.4/bin:/bin/bash