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?

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

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.

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.

Comments

0

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

Comments

Your Answer

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.