【问题标题】:How to get last access/modification date of a PostgreSQL database?如何获取 PostgreSQL 数据库的最后访问/修改日期?
【发布时间】:2011-03-13 19:27:10
【问题描述】:

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

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

【问题讨论】:

标签: database postgresql


【解决方案1】:

您可以通过检查表文件的最后修改时间来做到这一点。 在postgresql中,每张表对应一个或多个os文件,如下所示:

select relfilenode from pg_class where relname = 'test';

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

在我的测试环境中:

cd /data/pgdata/base/18976

ls -l -t | head

最后一条命令表示按最后修改时间排序的所有文件。

【讨论】:

  • 由于vacuum 活动、提示位设置等原因,您会从中得到误报。
【解决方案2】:

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

如果您只关心“使用的数据库”与“未使用的数据库”,您可以从 CSV 格式的数据库日志文件中收集这些信息。检测“修改”与“未修改”要困难得多;考虑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】:

    PostgreSQL 9.5 让我们能够跟踪上次修改的提交。

    1. 使用以下查询检查轨道提交是打开还是关闭

      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;
      

    【讨论】:

    • 不需要重启系统; sudo service postgresql restart 应该足够了。
    【解决方案4】:

    获取表格修改日期的方法:

    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;
    

    SQL 查询

    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'
    

    我不确定真空之类的东西是否会弄乱这种方法,但在我的测试中,这是一种非常准确的方法来获取不再使用的表,至少在 INSERT/UPDATE 操作中。

    【讨论】:

    • 由于我对主要问题的评论中链接帖子中给出的原因,这是错误的。
    【解决方案5】:

    我猜你应该激活一些日志选项。您可以获取有关登录 postgreSQL 的信息here

    【讨论】:

    • 我希望有办法用 psql 做到这一点。但是,您的提示也可以在脚本中使用。如果其他一切都失败了,我将使用日志文件。谢谢!
    • 日志不会显示通过 select 从函数修改的表之类的内容。对于这个用例来说,这听起来没问题,但它不适用于寻找实际修改时间的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2019-02-26
    相关资源
    最近更新 更多