【问题标题】:How to find table creation time?PostgreSQL:表创建时间
【发布时间】:2011-02-04 08:26:05
【问题描述】:

如何在 Postgresql 中找到建表时间。

例子,

如果我创建了一个文件,我可以找到文件创建时间,我想知道表创建时间。

【问题讨论】:

    标签: postgresql


    【解决方案1】:
    1. 检查数据目录位置 显示数据目录;
    2. 检查 Postgres 关系文件路径: 选择 pg_relation_filepath('table_name'); 您将获得关系的文件路径
    3. 检查此文件的创建时间<data-dir>/<relation-file-path>

    【讨论】:

      【解决方案2】:

      我尝试了一种不同的方法来获取表创建日期,这有助于跟踪动态创建的表。假设您的数据库中有一个表 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”不存在第 3 行:INNER JOIN 库存
      • @PrasadLele 它不应该与复制和粘贴一起使用。正如我所提到的,“假设你的数据库中有一个表inventory”......如果你没有创建一个表inventory,它显然会失败。您需要将查询中的inventory 替换为您的表名。如果您在澄清这一点后删除您的反对票,我将不胜感激。
      • 我已将库存替换为我的表名,但它仍然不起作用。
      • 您能否提供有关错误@DennisV.R. 的更多信息? ?
      • @JaumeJiménez 示例与我的 PostgreSQL 9.6 pastebin.com/raw/ckus87RX
      【解决方案3】:

      我正在尝试采用不同的方式来获取此信息。 从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();
      

      这样就得到了一个记录所有创建表的表。

      【讨论】:

        【解决方案4】:

        Suggested here

        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?

        【讨论】:

          【解决方案5】:

          --查询

          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上试过)

          【讨论】:

          • 这与 Manoj 和 greenplum 特定的答案相同。
          • 我正在使用两个表
          【解决方案6】:

          你可以从 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_last_operation 不存在”,我使用的是 pg9.2.4。
          • pg_stat_last_operation 是 Greenplum。
          • Table pg_stat_all_tables 也有帮助。
          【解决方案7】:

          您不能 - 信息不会记录在任何地方。查看表格文件不一定会为您提供正确的信息 - 有一些表格操作会为您创建一个新文件,在这种情况下日期会重置。

          【讨论】:

          • 你知道哪些表操作会创建新文件吗?那是重命名表吗?还是添加字段?知道表的历史以及哪些操作创建了一个新文件,我至少可以推测创建时间。
          【解决方案8】:

          我查看了 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 上是什么)。

          【讨论】:

          • 对一个表有一些操作,比如CLUSTER,会生成一个新文件,而不是重用旧文件。所以这不是一个可靠的方法。
          • @Alex Korban:在这里完全自动化:stackoverflow.com/questions/18849756/…
          • @Quandary:很有趣,谢谢。除了自己存储创建时间之外,似乎仍然没有防弹的方法。
          • 我需要成为主用户吗?你能表达一个查询(有效),就像@Manoj's?
          • 看看@Quandary的链接:stackoverflow.com/questions/18849756/…
          【解决方案9】:

          我认为在 PostgreSQL 中不可能,但您可能会在基础表文件的创建时间找到它。

          【讨论】:

            猜你喜欢
            • 2014-10-25
            • 1970-01-01
            • 2017-08-28
            • 1970-01-01
            • 2017-08-16
            • 2018-01-13
            • 2019-07-24
            • 2014-03-13
            • 2022-11-22
            相关资源
            最近更新 更多