旁注/免责声明:
这是一个坏主意,因为表创建时间不是 100% 可靠的,因为表可能由于表上的操作(例如 CLUSTER)而在内部被删除和重新创建。
除此之外,您可以像这样获得创建时间(假设 example-table-name of t_benutzer
):
--select datname, datdba from pg_database;
--select relname, relfilenode from pg_class where relname ilike 't_benutzer';
-- (select relfilenode::text from pg_class where relname ilike 't_benutzer')
SELECT
pg_ls_dir
,
(
SELECT creation
FROM pg_stat_file('./base/'
||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
|| '/' || pg_ls_dir
)
) as createtime
FROM pg_ls_dir(
'./base/' ||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
)
WHERE pg_ls_dir = (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
秘诀是在相应的表文件上使用 pg_stat_file。
-- http://www.greenplumdba.com/greenplum-dba-faq/howtofindtablecreationdateingreenplum
select
pg_ls_dir
,
(
select
--size
--access
--modification
--change
creation
--isdir
from pg_stat_file(pg_ls_dir)
) as createtime
from pg_ls_dir('.');
根据这篇文章PostgreSQL:表创建时间的评论,这
不是 100% 可靠的,因为表可能由于表上的操作(例如 CLUSTER)而在内部被删除并重新创建。
还有图案
/main/base/<database id>/<table filenode id>
似乎是错误的,因为在我的机器上,来自不同数据库的所有表都具有相同的数据库 ID,并且似乎该文件夹已被替换为某个任意 inode 编号,因此您需要找到编号最接近您的表的文件夹inode id(最大文件夹名称,其中 folderid <= table_inode_id 和文件夹名称是数字)
简化版是这样的:
SELECT creation
FROM pg_stat_file(
'./base/'
||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
|| '/' || (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
)
然后可以使用 information_schema 和 cte 使查询变得简单,或者创建自己的视图:
;WITH CTE AS
(
SELECT
table_name
,
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name)
) as folder
,(SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name) filenode
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema = 'public'
)
SELECT
table_name
,(
SELECT creation
FROM pg_stat_file(
'./base/' || folder || '/' || filenode
)
) as creation_time
FROM CTE
(使用 nhibernate 模式创建的所有表都创建,因此屏幕截图上所有表的时间大致相同是正确的)。
对于风险和副作用,请使用您的大脑和/或询问您的医生或药剂师;)