sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan får man databaseoprettelsestid i PostgreSQL 9.0?

I PostgreSQL gemmes databaseoprettelsestidspunktet ikke i nogen af ​​pg_catalogs. Så spørgsmålet opstår, hvordan ved vi, hvornår databasen blev oprettet.

For hver database oprettes en mappe med database-oid-nummer under $PGDATA/base sammen med et sæt OID'er,OID_fsm,OID_vm, PG_VERSION filer for hvert objekt (tabeller/indekser/visning/ osv.,).

Hver OID, OID_fsm, OID_vm, filer vil blive opdateret i henhold til ændringerne foretaget på database-niveau. Dog vil PG_VERSION-filen aldrig blive opdateret på eventuelle ændringer, der er foretaget i databasen. Så vi vil bruge tidsstemplet for PG_VERSION-filen som databaseoprettelsestidspunkt. Jeg tror, ​​der vil være en chance for at ændre PG_VERSION-tidsstemplet, men jeg er ikke sikker på, i hvilket tilfælde disse ændringer sker.

For at få tidsstempel for PG_VERSION har jeg brug for noget, der udfører OS-kommando på PG Instance-niveau. Så jeg brugte pl/perlu-funktionen oprettet af en af ​​mine kollegaer Vibhor Kumar.

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

pl/perlu-funktion

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;

Og en funktion til at få database 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';

Output:

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

Vender tilbage med flere ting :). Skriv eventuelt dine kommentarer, de vil blive meget værdsat.


  1. MySQL HVOR I ()

  2. Understøtter din Salesforce-driver massehandlinger?

  3. Sådan opgraderes PostgreSQL 11 til PostgreSQL 12 med nul nedetid

  4. Konverter 'datetime' til 'smalldatetime' i SQL Server (T-SQL-eksempler)