PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment obtenir le temps de création de la base de données dans PostgreSQL 9.0 ?

Dans PostgreSQL, l'heure de création de la base de données n'est stockée dans aucun des pg_catalogs. Alors la question se pose, comment savons-nous quand la base de données a été créée.

Pour chaque base de données, un répertoire est créé avec le numéro de base de données sous $PGDATA/base avec un ensemble de OID, OID_fsm, OID_vm, PG_VERSION fichiers pour chaque objet (tables/index/vue/etc.,).

Tous les fichiers OID, OID_fsm, OID_vm seront mis à jour en fonction des modifications apportées au niveau de la base de données. Cependant, le fichier PG_VERSION ne sera jamais mis à jour sur les modifications apportées à la base de données. Nous allons donc utiliser l'horodatage du fichier PG_VERSION comme heure de création de la base de données. Je pense qu'il y aura une chance de changer l'horodatage de PG_VERSION, mais je ne sais pas dans quel cas ces changements se produisent.

Pour obtenir l'horodatage de PG_VERSION, j'ai besoin de quelque chose qui exécute la commande du système d'exploitation au niveau de l'instance PG. J'ai donc utilisé la fonction pl/perlu créée par un de mes collègues Vibhor Kumar.

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

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

Et, une fonction pour obtenir l'ID de la base de données.

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

Sortie :

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

Sera de retour avec plus de choses :). Postez vos commentaires s'il y en a, ils seront très appréciés.