代码之家  ›  专栏  ›  技术社区  ›  Jakub Zalas

如何获取PostgreSQL数据库的最后一次访问/修改日期?

  •  17
  • Jakub Zalas  · 技术社区  · 14 年前

    在开发服务器上,我想删除未使用的数据库。要认识到我需要知道数据库是否仍被某人使用。

    有没有办法获得给定数据库、模式或表的最后一次访问或修改日期?

    5 回复  |  直到 14 年前
        1
  •  14
  •   tinychen    14 年前

    您可以通过检查表文件的上次修改时间来完成。 在postgresql中,每个表对应一个或多个os文件,如下所示:

    select relfilenode from pg_class where relname = 'test';
    

    relfilenode是表“test”的文件名,您可以在数据库的目录中找到该文件。

    cd /data/pgdata/base/18976
    
    ls -l -t | head
    

    last命令意味着列出按上次修改时间排序的所有文件。

        2
  •  9
  •   Community paulsm4    7 年前

    没有内在的方法可以做到这一点-而且 all the approaches that check the file mtime described in other answers here are wrong . 唯一可靠的选择是将触发器添加到每个表中,这些表将更改记录到单个更改历史记录表中,这是非常低效的,而且无法追溯。

    SELECT writes_to_some_table(...) .

    古老的 活动,您可以使用 pg_stat_database ,用于记录活动 自从上次数据重置后 . 例如。:

    -[ RECORD 6 ]--+------------------------------
    datid          | 51160
    datname        | regress
    numbackends    | 0
    xact_commit    | 54224
    xact_rollback  | 157
    blks_read      | 2591
    blks_hit       | 1592931
    tup_returned   | 26658392
    tup_fetched    | 327541
    tup_inserted   | 1664
    tup_updated    | 1371
    tup_deleted    | 246
    conflicts      | 0
    temp_files     | 0
    temp_bytes     | 0
    deadlocks      | 0
    blk_read_time  | 0
    blk_write_time | 0
    stats_reset    | 2013-12-13 18:51:26.650521+08
    

    所以我看到了

        3
  •  5
  •   Thirumal    6 年前

    postgresql9.5允许我们跟踪上次修改的提交。

    1. 使用以下查询检查track commit是否打开

      show track_commit_timestamp;
      
    2. 如果返回“ON”,则转到步骤3,否则修改postgresql.conf

      cd /etc/postgresql/9.5/main/
      vi postgresql.conf
      

      改变

      track_commit_timestamp = off
      

      track_commit_timestamp = on
      

      重新启动postgres/系统

      重复步骤1。

    3. 使用以下查询跟踪上次提交

      SELECT pg_xact_commit_timestamp(xmin), * FROM  YOUR_TABLE_NAME;
      
      SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME where COLUMN_NAME=VALUE;
      
        4
  •  2
  •   Falco    11 年前

    Python函数

    CREATE OR REPLACE FUNCTION py_get_file_modification_timestamp(afilename text)
      RETURNS timestamp without time zone AS
    $BODY$
        import os
        import datetime
        return datetime.datetime.fromtimestamp(os.path.getmtime(afilename))
    $BODY$
      LANGUAGE plpythonu VOLATILE
      COST 100;
    

    SELECT
        schemaname,
        tablename,
        py_get_file_modification_timestamp('*postgresql_data_dir*/*tablespace_folder*/'||relfilenode)
    FROM
        pg_class
    INNER JOIN
        pg_catalog.pg_tables ON (tablename = relname)
    WHERE
        schemaname = 'public'
    

    我不确定像vacuum这样的东西是否会弄乱这个过程,但在我的测试中,获取不再使用的表是一种非常有效的方法,至少在INSERT/UPDATE操作中是这样。

        5
  •  1
  •   pcent    14 年前