If you are concerned about your logfile and the postgresql.conf, just do a file system backup of them before running initdb.
If your database did suffer from a harddisk corrupted then it is probably advisable to run initdb to make sure everything (including the system tables) are re-created properly.
As the configuration files are just plain text (as are the logfiles) you can simply copy the backup over into the new data directory after running initdb.
(Note: I don't know what pg_dropcluster
does. It is not a standard Postgres tool)
The error is harmless but to get rid of it, I think you need to break this restore into two commands, as in:
dropdb -U postgres mydb && \
pg_restore --create --dbname=postgres --username=postgres pg_backup.dump
The --clean
option in pg_restore doesn't look like much but actually raises non-trivial problems.
For versions up to 9.1
The combination of --create
and --clean
in pg_restore options used to be an error in older PG versions (up to 9.1). There is indeed some contradiction between (quoting the 9.1 manpage):
--clean
Clean (drop) database objects before recreating them
and
--create
Create the database before restoring into it.
Because what's the point of cleaning inside a brand-new database?
Starting from version 9.2
The combination is now accepted and the doc says this (quoting the 9.3 manpage):
--clean
Clean (drop) database objects before recreating them. (This might generate some harmless error messages, if any objects were not present in the destination database.)
--create
Create the database before restoring into it. If --clean is also specified, drop and recreate the target database before connecting to it.
Now having both together leads to this kind of sequence during your restore:
DROP DATABASE mydb;
...
CREATE DATABASE mydb WITH TEMPLATE = template0... [other options]
...
CREATE SCHEMA public;
...
CREATE TABLE...
There is no DROP
for each individual object, only a DROP DATABASE
at the beginning. If not using --create
this would be the opposite.
Anyway this sequence raises the error of public
schema already existing because creating mydb
from template0
has imported it already (which is normal, it's the point of a template database).
I'm not sure why this case is not handled automatically by pg_restore
. Maybe this would cause undesirable side-effects when an admin decides to customize template0
and/or change the purpose of public
, even if we're not supposed to do that.
Best Answer
If you run
pg_dump
with the--clean
option then the generated SQL dump would containdrop
statements for all dumped objects (note that when using the custom format andpg_restore
you don't need to decide on this when dumping, but when restoring).However if the target database contains tables (or other objects) that were not contained in the source, those would not be dropped.
Using
pg_dump --clean
(orpg_restore --clean
) is pretty much the same behaviour as with Oracle'simpdp
using theTABLE_EXISTS_ACTION=REPLACE
. That too wouldn't drop (replace) tables that were not part of the source.To avoid having tables in the target that were not contained in the source, people very often simply drop the entire database before importing the dump. But this is (when using the
--clean
option) not really required.