PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erhalte ich die Datenbankerstellungszeit in PostgreSQL 9.0?

In PostgreSQL wird die Erstellungszeit der Datenbank in keinem der pg_catalogs gespeichert. Daher stellt sich die Frage, woher wir wissen, wann die Datenbank erstellt wurde.

Für jede Datenbank wird ein Verzeichnis mit Datenbank-ID-Nummer unter $PGDATA/base angelegt zusammen mit einer Reihe von OIDs, OID_fsm, OID_vm, PG_VERSION Dateien für jedes Objekt (Tabellen/Indizes/View/ etc.,).

Alle OID-, OID_fsm-, OID_vm-Dateien werden gemäß den auf Datenbankebene vorgenommenen Änderungen aktualisiert. Die Datei PG_VERSION wird jedoch niemals bei Änderungen an der Datenbank aktualisiert. Wir verwenden also den Zeitstempel der Datei PG_VERSION als Erstellungszeit der Datenbank. Ich glaube, dass es möglich sein wird, den Zeitstempel von PG_VERSION zu ändern, aber ich bin mir nicht sicher, in welchem ​​Fall diese Änderungen stattfinden.

Um den Zeitstempel von PG_VERSION zu erhalten, brauche ich etwas, das den Betriebssystembefehl auf PG-Instanzebene ausführt. Also habe ich die pl/perlu-Funktion verwendet, die von einem meiner Kollegen Vibhor Kumar erstellt wurde.

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;

Und eine Funktion zum Abrufen von Datenbank-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';

Ausgabe:

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

Wir kommen mit mehr Sachen zurück :). Posten Sie Ihre Kommentare, falls vorhanden, sie werden sehr geschätzt.