我该如何在PostgreSQL中查找表格的创建时间?
举例说明:如果我创建了一个文件,我可以像这样查找到文件的创建时间,现在我想知道表格的创建时间。
我该如何在PostgreSQL中查找表格的创建时间?
举例说明:如果我创建了一个文件,我可以像这样查找到文件的创建时间,现在我想知道表格的创建时间。
我查看了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内部并不可能实现,但你可能会在底层表文件的创建时间中找到它。
这里建议:
SELECT oid FROM pg_database WHERE datname = 'mydb';
oid
是 12345,那么:ls -l $PGDATA/base/12345/PG_VERSION
PG_VERSION
最不可能被修改。PGDATA
,请查看PostgreSQL 数据库存储在哪里?。<data-dir>/<relation-file-path>
我尝试了一种不同的方法来获取表格创建日期,这可以帮助跟踪动态创建的表格。假设您在数据库中有一个名为inventory
的表格,您可以在其中保存表格的创建日期。
CREATE TABLE inventory (id SERIAL, tablename CHARACTER VARYING (128), created_at DATE);
然后,当你想要跟踪的表被创建时,它会被添加到你的库存
中。
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
*/
对于我的用例来说,这是可以的,因为我使用一组需要跟踪的动态表。
附言:在数据库中将inventory
替换为您的表名。
inventory
的表”... 如果您没有创建名为inventory
的表,它显然会失败。您需要在查询中将inventory
替换为您的表名称。如果您已经明确了这一点,请撤销您的负面投票,我将不胜感激。 - Jaume Jiménezid
、tablename
、created_at
)的表。这段代码片段不是要复制和粘贴,而是要适应您的使用情况。我已经编辑了答案,希望现在能对您有所帮助。 - Jaume Jiménez我正在尝试用另一种方式来获取这个。 从这个讨论开始,我的解决方案是:
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 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上尝试过)
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
表也可能有所帮助。 - Hans Ginzel