【发布时间】:2011-02-04 08:26:05
【问题描述】:
如何在 Postgresql 中找到建表时间。
例子,
如果我创建了一个文件,我可以找到文件创建时间,我想知道表创建时间。
【问题讨论】:
标签: postgresql
如何在 Postgresql 中找到建表时间。
例子,
如果我创建了一个文件,我可以找到文件创建时间,我想知道表创建时间。
【问题讨论】:
标签: postgresql
<data-dir>/<relation-file-path>
【讨论】:
我尝试了一种不同的方法来获取表创建日期,这有助于跟踪动态创建的表。假设您的数据库中有一个表 inventory,您可以在其中保存表的创建日期。
CREATE TABLE inventory (id SERIAL, tablename CHARACTER VARYING (128), created_at DATE);
然后,当您要跟踪的表被创建时,它会添加到您的inventory。
CREATE TABLE temp_table_1 (id SERIAL); -- A dynamic table is created
INSERT INTO inventory VALUES (1, 'temp_table_1', '2020-10-07 10:00:00'); -- We add it into the inventory
然后你可以利用pg_tables 运行类似的东西来获取现有的表创建日期:
SELECT pg_tables.tablename, inventory.created_at
FROM pg_tables
INNER JOIN inventory
ON pg_tables.tablename = inventory.tablename
/*
tablename | created_at
--------------+------------
temp_table_1 | 2020-10-07
*/
对于我的用例来说没问题,因为我使用一组我需要跟踪的动态表。
P.S:将数据库中的inventory 替换为您的表名。
【讨论】:
inventory”......如果你没有创建一个表inventory,它显然会失败。您需要将查询中的inventory 替换为您的表名。如果您在澄清这一点后删除您的反对票,我将不胜感激。
我正在尝试采用不同的方式来获取此信息。 从from this discussion 开始,我的解决方案是:
DROP TABLE IF EXISTS t_create_history CASCADE;
CREATE TABLE t_create_history (
gid serial primary key,
object_type varchar(20),
schema_name varchar(50),
object_identity varchar(200),
creation_date timestamp without time zone
);
--delete event trigger before dropping function
DROP EVENT TRIGGER IF EXISTS t_create_history_trigger;
--create history function
DROP FUNCTION IF EXISTS public.t_create_history_func();
CREATE OR REPLACE FUNCTION t_create_history_func()
RETURNS event_trigger
LANGUAGE plpgsql
AS $$
DECLARE
obj record;
BEGIN
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands () WHERE command_tag in ('SELECT INTO','CREATE TABLE','CREATE TABLE AS')
LOOP
INSERT INTO public.t_create_history (object_type, schema_name, object_identity, creation_date) SELECT obj.object_type, obj.schema_name, obj.object_identity, now();
END LOOP;
END;
$$;
--ALTER EVENT TRIGGER t_create_history_trigger DISABLE;
--DROP EVENT TRIGGER t_create_history_trigger;
CREATE EVENT TRIGGER t_create_history_trigger ON ddl_command_end
WHEN TAG IN ('SELECT INTO','CREATE TABLE','CREATE TABLE AS')
EXECUTE PROCEDURE t_create_history_func();
这样就得到了一个记录所有创建表的表。
【讨论】:
SELECT oid FROM pg_database WHERE datname = 'mydb';
那么(假设 oid 是 12345):
ls -l $PGDATA/base/12345/PG_VERSION
此解决方法假定 PG_VERSION 在创建后最不可能被修改。
注意:如果未定义 PGDATA,请检查 Where does PostgreSQL store the database?
【讨论】:
--查询
select pslo.stasubtype, pc.relname, pslo.statime
from pg_stat_last_operation pslo
join pg_class pc on(pc.relfilenode = pslo.objid)
and pslo.staactionname = 'CREATE'
Order By pslo.statime desc
将有助于实现预期的结果
(在greenplum上试过)
【讨论】:
你可以从 pg_stat_last_operation 得到这个。操作方法如下:
select * from pg_stat_last_operation where objid = 'table_name'::regclass order by statime;
此表存储以下操作:
select distinct staactionname from pg_stat_last_operation;
staactionname
---------------
ALTER
ANALYZE
CREATE
PARTITION
PRIVILEGE
VACUUM
(6 rows)
【讨论】:
pg_stat_all_tables 也有帮助。
您不能 - 信息不会记录在任何地方。查看表格文件不一定会为您提供正确的信息 - 有一些表格操作会为您创建一个新文件,在这种情况下日期会重置。
【讨论】:
我查看了 pg_* 表,但在其中找不到任何创建时间。可以找到表文件,但是在 Linux 上您无法获得文件创建时间。所以我认为答案是你只能在 Windows 上找到这些信息,使用以下步骤:
select datname, datdba from pg_database;获取数据库ID
select relname, relfilenode from pg_class;获取表文件节点id
<PostgreSQL folder>/main/base/<database id>/<table filenode id>(不确定在 Windows 上是什么)。【讨论】:
我认为在 PostgreSQL 中不可能,但您可能会在基础表文件的创建时间找到它。
【讨论】: