public inbox for [email protected]
help / color / mirror / Atom feedRe: Fwd: Identify system databases
6+ messages / 5 participants
[nested] [flat]
* Re: Fwd: Identify system databases
@ 2025-04-15 18:35 David G. Johnston <[email protected]>
2025-04-15 19:10 ` Re: Fwd: Identify system databases Tom Lane <[email protected]>
2025-04-16 00:24 ` Re: Fwd: Identify system databases Adrian Klaver <[email protected]>
0 siblings, 2 replies; 6+ messages in thread
From: David G. Johnston @ 2025-04-15 18:35 UTC (permalink / raw)
To: Adrian Klaver <[email protected]>; +Cc: Igor Korot <[email protected]>; pgsql-generallists.postgresql.org <[email protected]>
On Tue, Apr 15, 2025 at 11:20 AM Adrian Klaver <[email protected]>
wrote:
> On 4/15/25 09:48, David G. Johnston wrote:
> > On Tue, Apr 15, 2025 at 9:31 AM Adrian Klaver <[email protected]
> > <mailto:[email protected]>> wrote:
> >
>
> >
> > Agreed.
> >
> > The fact that initdb creates the template0, template1 and postgres
> > databases and you can't change that makes them system not user
> > databases.
> >
> >
> > Based on that definition there is a boundary in the system where OIDs
> > are considered bootstrap/system OIDs versus user OIDs. Key off of
> > that. Though since the names never change, and there are always/only
> > three, it seems pointless to use the OID aspect of initdb as a basis.
> >
> > My definition of a "system database" would be a database that, if it
> > didn't exist, would cause the system to break. i.e., is a database
> > whose presence is integral to the operations of the system. None of
> > these qualify under that definition. Which is why there is no column in
> > pg_database identifying system databases - there are none.
>
> 1) Try connecting(not using single user mode) to a cluster without them.
>
I did. Here, the full test.
-- freshly initdb cluster exists and is running
❯ cat ~/Downloads/test-drops.bash
createdb mydb
psql -c 'alter database template0 is_template false;' mydb
dropdb template0
psql -c 'alter database template1 is_template false;' mydb
dropdb template1
dropdb --maintenance-db mydb postgres
psql -c '\l' mydb
❯ bash ~/Downloads/test-drops.bash
ALTER DATABASE
ALTER DATABASE
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype |
Locale | ICU Rules | Access privileges
------+--------+----------+-----------------+------------+------------+--------+-----------+-------------------
mydb | davidj | UTF8 | libc | en_US.utf8 | en_US.utf8 |
| |
(1 row)
> 2) Trying creating a database or databases to replace them without them
> existing in the first place.
>
Why?
> 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.
initdb could allow the user to specify the initial database name and only
create that single database. It would work.
By creating the initial three databases the system is more usable due to
having established conventions. They are conventional databases, not
system ones.
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.
^ permalink raw reply [nested|flat] 6+ messages in thread
* Re: Fwd: Identify system databases
2025-04-15 18:35 Re: Fwd: Identify system databases David G. Johnston <[email protected]>
@ 2025-04-15 19:10 ` Tom Lane <[email protected]>
2025-04-15 21:17 ` Re: Fwd: Identify system databases Ron Johnson <[email protected]>
1 sibling, 1 reply; 6+ messages in thread
From: Tom Lane @ 2025-04-15 19:10 UTC (permalink / raw)
To: David G. Johnston <[email protected]>; +Cc: Adrian Klaver <[email protected]>; Igor Korot <[email protected]>; pgsql-generallists.postgresql.org <[email protected]>
"David G. Johnston" <[email protected]> writes:
> On Tue, Apr 15, 2025 at 11:20 AM Adrian Klaver <[email protected]>
> wrote:
>> If what you say is true why does initdb lack an option to not create
>> them on creating a cluster?
> By creating the initial three databases the system is more usable due to
> having established conventions. They are conventional databases, not
> system ones.
Precisely. For example, the only reason for the "postgres" database
to exist is so that there is a reasonable default database for clients
to connect to. If we didn't have it we'd need some other convention.
(Indeed, we used to not have it, and back then the default client
behavior was usually to connect to template1. That led to people
creating random junk in template1 and then being surprised when
CREATE DATABASE copied it into new databases.)
In the end this discussion is about terminology. These three
databases are part of the ecosystem and clients generally expect them
to be there. But the server doesn't depend on them to function.
Does that make them "system" databases? All depends on what you
think that means.
regards, tom lane
^ permalink raw reply [nested|flat] 6+ messages in thread
* Re: Fwd: Identify system databases
2025-04-15 18:35 Re: Fwd: Identify system databases David G. Johnston <[email protected]>
2025-04-15 19:10 ` Re: Fwd: Identify system databases Tom Lane <[email protected]>
@ 2025-04-15 21:17 ` Ron Johnson <[email protected]>
0 siblings, 0 replies; 6+ messages in thread
From: Ron Johnson @ 2025-04-15 21:17 UTC (permalink / raw)
To: pgsql-generallists.postgresql.org <[email protected]>
On Tue, Apr 15, 2025 at 3:11 PM Tom Lane <[email protected]> wrote:
> "David G. Johnston" <[email protected]> writes:
> > On Tue, Apr 15, 2025 at 11:20 AM Adrian Klaver <
> [email protected]>
> > wrote:
> >> If what you say is true why does initdb lack an option to not create
> >> them on creating a cluster?
>
> > By creating the initial three databases the system is more usable due to
> > having established conventions. They are conventional databases, not
> > system ones.
>
> Precisely. For example, the only reason for the "postgres" database
> to exist is so that there is a reasonable default database for clients
> to connect to. If we didn't have it we'd need some other convention.
> (Indeed, we used to not have it, and back then the default client
> behavior was usually to connect to template1. That led to people
> creating random junk in template1 and then being surprised when
> CREATE DATABASE copied it into new databases.)
>
Interesting history. I've always interpreted the "postgres" database as
being the system database, but now I know it's not.
--
Death to <Redacted>, and butter sauce.
Don't boil me, I'm still alive.
<Redacted> lobster!
^ permalink raw reply [nested|flat] 6+ messages in thread
* Re: Fwd: Identify system databases
2025-04-15 18:35 Re: Fwd: Identify system databases David G. Johnston <[email protected]>
@ 2025-04-16 00:24 ` Adrian Klaver <[email protected]>
2025-04-16 00:33 ` Re: Fwd: Identify system databases David G. Johnston <[email protected]>
2025-04-16 07:31 ` Re: Fwd: Identify system databases Laurenz Albe <[email protected]>
1 sibling, 2 replies; 6+ messages in thread
From: Adrian Klaver @ 2025-04-16 00:24 UTC (permalink / raw)
To: David G. Johnston <[email protected]>; +Cc: Igor Korot <[email protected]>; pgsql-generallists.postgresql.org <[email protected]>
On 4/15/25 11:35, David G. Johnston wrote:
> On Tue, Apr 15, 2025 at 11:20 AM Adrian Klaver
> <[email protected] <mailto:[email protected]>> 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
[email protected]
^ permalink raw reply [nested|flat] 6+ messages in thread
* Re: Fwd: Identify system databases
2025-04-15 18:35 Re: Fwd: Identify system databases David G. Johnston <[email protected]>
2025-04-16 00:24 ` Re: Fwd: Identify system databases Adrian Klaver <[email protected]>
@ 2025-04-16 00:33 ` David G. Johnston <[email protected]>
1 sibling, 0 replies; 6+ messages in thread
From: David G. Johnston @ 2025-04-16 00:33 UTC (permalink / raw)
To: Adrian Klaver <[email protected]>; +Cc: Igor Korot <[email protected]>; pgsql-generallists.postgresql.org <[email protected]>
On Tue, Apr 15, 2025 at 5:24 PM Adrian Klaver <[email protected]>
wrote:
> >
> > By creating the initial three databases the system is more usable due to
> > having established conventions. They are conventional databases, not
> > system ones.
>
> The bottom line is the Postgres project has built an infrastructure
> around those names that the community is plugged into.
>
>
So, the answer is no, there is no dedicated pg_database column to identify
the system/conventional databases created by initdb. They are identified
by name. You must know from documentation or experience that they are
"postgres", "template1" and "template0".
Pick whichever of "system" or "convention" or some other word makes you
happy to categorize those three databases. Though I suggest "the initdb"
databases since neither of the other terms is used anywhere in the
documentation.
David J.
^ permalink raw reply [nested|flat] 6+ messages in thread
* Re: Fwd: Identify system databases
2025-04-15 18:35 Re: Fwd: Identify system databases David G. Johnston <[email protected]>
2025-04-16 00:24 ` Re: Fwd: Identify system databases Adrian Klaver <[email protected]>
@ 2025-04-16 07:31 ` Laurenz Albe <[email protected]>
1 sibling, 0 replies; 6+ messages in thread
From: Laurenz Albe @ 2025-04-16 07:31 UTC (permalink / raw)
To: Adrian Klaver <[email protected]>; David G. Johnston <[email protected]>; +Cc: Igor Korot <[email protected]>; pgsql-generallists.postgresql.org <[email protected]>
On Tue, 2025-04-15 at 17:24 -0700, Adrian Klaver wrote:
> 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.
Right.
But then you fortunately cannot drop all databases, because you cannot
drop the database you are connected to.
Still, a cluster that is missing "postgres" will give beginners trouble,
a cluster that is missing "template1" is annoying, and a cluster without
"template0" is possibly in serious trouble.
Yours,
Laurenz Albe
^ permalink raw reply [nested|flat] 6+ messages in thread
end of thread, other threads:[~2025-04-16 07:31 UTC | newest]
Thread overview: 6+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2025-04-15 18:35 Re: Fwd: Identify system databases David G. Johnston <[email protected]>
2025-04-15 19:10 ` Tom Lane <[email protected]>
2025-04-15 21:17 ` Ron Johnson <[email protected]>
2025-04-16 00:24 ` Adrian Klaver <[email protected]>
2025-04-16 00:33 ` David G. Johnston <[email protected]>
2025-04-16 07:31 ` Laurenz Albe <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox