PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como obter o tempo de criação do banco de dados no PostgreSQL 9.0?

No PostgreSQL, o tempo de criação do banco de dados não é armazenado em nenhum dos pg_catalogs. Então surge a pergunta, como sabemos quando o banco de dados foi criado.

Para cada banco de dados, um diretório é criado com o número database-oid em $PGDATA/base juntamente com um conjunto de OIDs,OID_fsm,OID_vm, PG_VERSION arquivos para cada objeto (tabelas/índices/exibição/etc.,).

A cada OID,OID_fsm,OID_vm, os arquivos serão atualizados de acordo com as alterações feitas no nível do banco de dados. No entanto, o arquivo PG_VERSION nunca será atualizado em nenhuma alteração feita no banco de dados. Então, vamos usar o timestamp do arquivo PG_VERSION como hora de criação do banco de dados. Acredito que haverá uma chance de alterar o timestamp PG_VERSION, mas não tenho certeza em qual caso essas alterações acontecem.

Para obter o timestamp de PG_VERSION, preciso de algo que execute o comando do SO no nível da instância PG. Então, eu usei a função pl/perlu criada por um dos meus colegas Vibhor Kumar.

http://vibhork.blogspot.com/2011/04/plperl-functions-for-getting-number-of.html

Função pl/perlu
CREATE OR REPLACE FUNCTION execute_shell(text) returns setof text
as
$$
$output=`$_[0] 2>&1`;
@output=split(/[nr]+/,$output);
foreach $out (@output)
{ return_next($out);
}
return undef;
$$ language plperlu;

E, uma função para obter o oid do banco de dados.
CREATE OR REPLACE FUNCTION public.get_pg_version_loc(dbname varchar) RETURNS text AS
$body$
DECLARE
dbname ALIAS FOR $1;
data_dir text;
db_oid text;
os_execute text;
BEGIN
SELECT INTO db_oid oid from pg_database where datname = dbname;
show data_directory into data_dir;
os_execute := 'stat -c "%y" '||data_dir||'/base/'||db_oid||'/PG_VERSION';
return os_execute;
END;
$body$
LANGUAGE 'plpgsql';

Saída:
=# select datname,execute_shell(get_pg_version_loc(datname::text)) as "DB_Createion_Time"
-# from pg_database where datname not in ('template0','template1');
datname | DB_Createion_Time
--------------+-------------------------------------
postgres | 2011-01-10 21:48:37.222016571 +0530
provider | 2011-05-26 11:40:14.253434477 +0530
pgbench_test | 2011-08-14 16:52:21.689198728 +0530
pgpool | 2011-08-26 12:30:19.864134713 +0530
(4 rows)

Voltarei com mais coisas :). Poste seus comentários, se houver, eles serão muito apreciados.