sql >> Database >  >> RDS >> PostgreSQL

Hoe krijg ik database-aanmaaktijd in PostgreSQL 9.0?

In PostgreSQL wordt de aanmaaktijd van de database niet opgeslagen in een van de pg_catalogs. Dus de vraag rijst, hoe weten we wanneer de database is gemaakt.

Voor elke database wordt een directory aangemaakt met database-oid nummer onder $PGDATA/base samen met een set van OID's,OID_fsm,OID_vm, PG_VERSION bestanden voor elk object (tabellen/indexen/weergave/ enz.).

Elke OID,OID_fsm,OID_vm, bestanden worden bijgewerkt volgens de wijzigingen die op database-niveau zijn aangebracht. Het PG_VERSION-bestand wordt echter nooit bijgewerkt met wijzigingen die in de database zijn aangebracht. Dus we gaan de tijdstempel van het PG_VERSION-bestand gebruiken als aanmaaktijd voor de database. Ik denk dat er een kans is dat de PG_VERSION-tijdstempel wordt gewijzigd, maar ik weet niet zeker in welk geval deze wijzigingen plaatsvinden.

Om de tijdstempel van PG_VERSION te krijgen, heb ik iets nodig dat de OS-opdracht op PG-instantieniveau uitvoert. Dus gebruikte ik de pl/perlu-functie gemaakt door een van mijn collega Vibhor Kumar.

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

pl/perlu Functie

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;

En één functie om database oid te krijgen.

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

Uitvoer:

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

Zal terugkomen met meer dingen :). Plaats eventueel uw opmerkingen, deze worden zeer op prijs gesteld.


  1. Alle gebruikers in PostgreSQL weergeven?

  2. JDBC ResultSet:ik heb een getDateTime nodig, maar er zijn alleen getDate en getTimeStamp

  3. Gebruik XEvent Profiler om query's vast te leggen in SQL Server

  4. COUNT(*) selecteren met DISTINCT