sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo obtener el tiempo de creación de la base de datos en PostgreSQL 9.0?

En PostgreSQL, el tiempo de creación de la base de datos no se almacena en ninguno de los pg_catalogs. Entonces surge la pregunta, ¿cómo sabemos cuándo se creó la base de datos?

Para cada base de datos, se crea un directorio con el número de base de datos en $PGDATA/base junto con un conjunto de OID, OID_fsm, OID_vm, PG_VERSION archivos para cada Objeto (Tablas/Índices/Vista/etc.,).

Cada OID, OID_fsm, OID_vm, los archivos se actualizarán según los cambios realizados a nivel de la base de datos. Sin embargo, el archivo PG_VERSION nunca se actualizará con los cambios realizados en la base de datos. Entonces, usaremos la marca de tiempo del archivo PG_VERSION como hora de creación de la base de datos. Creo que habrá una posibilidad de cambiar la marca de tiempo de PG_VERSION, pero no estoy seguro de en qué caso ocurrirán estos cambios.

Para obtener la marca de tiempo de PG_VERSION, necesito algo que ejecute el comando del sistema operativo en el nivel de instancia de PG. Entonces, utilicé la función pl/perlu creada por uno de mis colegas Vibhor Kumar.

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

Función 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;

Y, una función para obtener la base de datos oid.

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';

Salida:

=# 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)

Volveré con más cosas :). Publique sus comentarios, si los hay, serán muy apreciados.