33

I want to get the Database creation date in POSTGRESQL. My version is 9.3.4 running on Ubuntu 14.04. Can I do it with a select statement or can I do it with access to the server?

tshepang
12.5k25 gold badges98 silver badges140 bronze badges
asked Jul 17, 2014 at 14:19
3

4 Answers 4

75

I completely agree with Craig Ringer (excellent answer!)... but for my purposes , this is good enough:

SELECT (pg_stat_file('base/'||oid ||'/PG_VERSION')).modification, datname FROM pg_database;

Simple and clean (but superuser).

answered May 18, 2015 at 16:54
Sign up to request clarification or add additional context in comments.

3 Comments

this is modification date on database or it can treat as creation date too?
According the documentation: "pg_stat_file returns a record containing the file size, last accessed time stamp, last modified time stamp, last file status change time stamp (Unix platforms only), file creation time stamp (Windows only), and a boolean indicating if it is a directory. " .... so only if you are in a Windows enviroment you can use the "creation" attribute. In my linux machine the "modification" attribute is good enough to get a pseudo creation date.
But does not work if you clone the instance
15

There is no built-in record of the PostgreSQL database creation time in the system. All approaches that rely on file system creation/modification times can produce wrong answers.

For example, if you pg_basebackup a replica node then fail over to it, the creation time will appear to be the time the replica was created. pg_basebackup doesn't preserve file creation/modification times because they're generally not considered relevant for operation of the database system.

The only reliable way to get the database creation time is to create a 1-row table with the creation time in it when you create the database, then set permissions / add a trigger so it rejects updates.

If you don't mind the risk of a wrong answer where the creation time is reported as being much newer than it really was, you can look at the timestamp of the base/[dboid]/PG_VERSION file. @Bob showed a useful way to do that.

answered Jul 18, 2014 at 1:26

Comments

2

Also alternative solution:

  1. Find database OID:
postgres=# select oid,datname from pg_database where datname='bars_paidserv';
-[ RECORD 1 ]----------
oid | 5137290
datname | bars_paidserv
  1. Go to database datatfiles (you can find your directory by executing show data_directory):

cd /var/lib/postgresql/9.6/main/base

  1. list PG_VERSION file in your OID:
postgres@test-rp:~/9.6/main/base$ ls -l 5137290/PG_VERSION
-rw------- 1 postgres postgres 4 Jan 29 12:34 5137290/PG_VERSION

i.e. my database bars_paidserv with OID 5137290 was created on Jan 29.

answered Mar 11, 2021 at 12:03

Comments

0

You can check in postgres log if ddl trace is activated and you have enough retention. With a grep on "CREATE DATABASE"

answered Apr 4, 2024 at 13:38

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.