PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để có được Thời gian tạo cơ sở dữ liệu trong PostgreSQL 9.0?

Trong PostgreSQL, thời gian tạo cơ sở dữ liệu không được lưu trữ trong bất kỳ pg_catalogs nào. Vì vậy, câu hỏi được đặt ra, làm thế nào chúng ta biết cơ sở dữ liệu được tạo ra khi nào.

Đối với mọi cơ sở dữ liệu, một thư mục được tạo với số cơ sở dữ liệu-oid dưới $ PGDATA / base cùng với một tập hợp OID, OID_fsm, OID_vm, PG_VERSION các tệp cho từng Đối tượng (Bảng / Chỉ mục / Chế độ xem / v.v.,).

Mọi tệp OID, OID_fsm, OID_vm, sẽ được cập nhật theo các thay đổi được thực hiện ở cấp cơ sở dữ liệu. Tuy nhiên, tệp PG_VERSION sẽ không bao giờ được cập nhật về bất kỳ thay đổi nào được thực hiện đối với cơ sở dữ liệu. Vì vậy, chúng tôi sẽ sử dụng dấu thời gian của tệp PG_VERSION làm thời gian tạo cơ sở dữ liệu. Tôi tin rằng sẽ có cơ hội thay đổi dấu thời gian PG_VERSION, nhưng tôi không chắc những thay đổi này xảy ra trong trường hợp nào.

Để lấy dấu thời gian của PG_VERSION, tôi cần một thứ gì đó thực thi lệnh OS ở cấp PG Instance. Vì vậy, tôi đã sử dụng hàm pl / perlu do một trong những đồng nghiệp của tôi là Vibhor Kumar tạo ra.

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

Hàm 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;

Và, một chức năng để lấy oid cơ sở dữ liệu.

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

Đầu ra:

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

Sẽ trở lại với nhiều thứ hơn :). Hãy đăng bình luận của bạn nếu có, chúng sẽ được đánh giá cao.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails 4 session. Thỉnh thoảng là con số không

  2. Có phải thiết kế tồi khi sử dụng các mảng trong cơ sở dữ liệu không?

  3. Thoát khỏi các tên cột giống từ khóa trong Postgres

  4. Cách tốt nhất để cài đặt hstore trên nhiều lược đồ trong cơ sở dữ liệu Postgres?

  5. Cách chèn dữ liệu CSV vào cơ sở dữ liệu PostgreSQL (cơ sở dữ liệu từ xa)