Re: Fwd: Identify system databases - Mailing list pgsql-general

From Adrian Klaver
Subject Re: Fwd: Identify system databases
Date
Msg-id bcae9b4b-a85e-4fc7-8e70-5a98c5e5ff28@aklaver.com
Whole thread Raw
In response to Re: Fwd: Identify system databases  ("David G. Johnston" <david.g.johnston@gmail.com>)
Responses Re: Fwd: Identify system databases
Re: Fwd: Identify system databases
List pgsql-general
On 4/15/25 11:35, David G. Johnston wrote:
> On Tue, Apr 15, 2025 at 11:20 AM Adrian Klaver 
> <adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>> wrote:

> 
>     1) Try connecting(not using single user mode) to a cluster without them.
> 
> 

First I have had this discussion before and was not successful and I 
expect the same outcome this time, but I am half Dutch so that is not a 
concern.


> I did.  Here, the full test.
> -- freshly initdb cluster exists and is running
> 
> ❯ cat ~/Downloads/test-drops.bash
> createdb mydb

 From Postgres log:

CREATE DATABASE mydb;

 From here:

https://www.postgresql.org/docs/current/sql-createdatabase.html

"template

     The name of the template from which to create the new database, or 
DEFAULT to use the default template (template1).
"

I know I can use --template=template with createdb, but that still means 
there has to be a database existing in the initial cluster to use as a 
template. You can't get around that fact.


>     2) Trying creating a database or databases to replace them without them
>     existing in the first place.
> 
> 
> Why?

See above. It boils down to, there has to be 'seed'(system) databases 
extant in the cluster created by initdb for a user to move forward.

> 
> 
>     If what you say is true why does initdb lack an option to not create
>     them on creating a cluster?
> 
> 
> Well, it has to create one database because it is not possible to 
> connect to the cluster without naming a specific database.

Exactly, the cluster needs a database created by the system to function.

> 
> initdb could allow the user to specify the initial database name and 
> only create that single database.  It would work.

 From an earlier post of mine in this thread:

"Further from here:

https://www.postgresql.org/docs/devel/app-initdb.html

"The postgres database is a default database meant for use by users, 
utilities and third party applications"

indicates that postgres is expected to be in a cluster(system).

Lastly the CREATE DATABASE depends on template1 to be there to create at 
least the first user database. Also template0 is a "clean" template 
database that allows for using a new encoding in new database. It is 
also used by pg_dump/restore:

CREATE DATABASE test WITH TEMPLATE = template0 ...
"

It would be possible to do as you say, but then you would need to make 
the system nature of the process explicit by updating pg_database to 
include information on what the default template database, the 'clean' 
template and the 'default connection database' are. As it it stands now 
it is implicit in the naming and the use of those names by the server 
code and outside code.

> 
> By creating the initial three databases the system is more usable due to 
> having established conventions.  They are conventional databases, not 
> system ones.

Then remove them or rename them and see how long it takes the mail 
server to start glowing with posts to --general and --bugs.

The bottom line is the Postgres project has built an infrastructure 
around those names that the community is plugged into.

> 
> Plus, it leaves the cluster in a state that is generally much more 
> user-friendly.  And, as shown, people who dislike the convention can 
> rearrange things into whatever form they desire.
> 
> David J.
> 

-- 
Adrian Klaver
adrian.klaver@aklaver.com




pgsql-general by date:

Previous
From: Ron Johnson
Date:
Subject: Re: Fwd: Identify system databases
Next
From: "David G. Johnston"
Date:
Subject: Re: Fwd: Identify system databases