sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL 9.0でデータベース作成時間を取得するにはどうすればよいですか?

    PostgreSQLでは、データベースの作成時間はどのpg_catalogにも保存されません。そのため、データベースがいつ作成されたかをどのようにして知ることができるのかという疑問が生じます。

    データベースごとに、 $ PGDATA / baseの下にdatabase-oid番号でディレクトリが作成されます。 OID、OID_fsm、OID_vm、PG_VERSIONのセットとともに 各オブジェクトのファイル(テーブル/インデックス/ビュー/など)。

    すべてのOID、OID_fsm、OID_vm、ファイルは、データベースレベルで行われた変更に従って更新されます。ただし、PG_VERSIONファイルは、データベースに加えられた変更で更新されることはありません。したがって、データベースの作成時間としてPG_VERSIONファイルのタイムスタンプを使用します。 PG_VERSIONタイムスタンプが変更される可能性があると思いますが、どちらの場合にこの変更が行われるかはわかりません。

    PG_VERSIONのタイムスタンプを取得するには、PGインスタンスレベルでOSコマンドを実行するものが必要です。そこで、同僚のVibhorKumarによって作成されたpl/perlu関数を使用しました。

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

    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;

    そして、データベースOIDを取得するための1つの関数。

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

    出力:

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

    より多くのもので戻ってきます:)。コメントがあれば投稿してください。高く評価されます。


    1. ストアドプロシージャとアクセス許可-EXECUTEで十分ですか?

    2. Django + Postgres:現在のトランザクションは中止され、トランザクションブロックが終了するまでコマンドは無視されます

    3. AlphaAnywhereでのSalesforce.comの操作

    4. MySQLのLEN()と同等のものは何ですか?