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

Jak*_*las 18 database postgresql

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

有没有办法获得给定数据库,架构或表的上次访问或修改日期?

tin*_*hen 11

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

select relfilenode from pg_class where relname = 'test';
Run Code Online (Sandbox Code Playgroud)

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

在我的测试环境中:

cd /data/pgdata/base/18976

ls -l -t | head
Run Code Online (Sandbox Code Playgroud)

最后一个命令意味着列出按上次修改时间排序的所有文件.

  • 由于"真空"活动,提示位设置等原因,你会得到误报. (6认同)

Cra*_*ger 9

没有内置的方法来执行此操作 - 此处检查其他答案中描述的文件mtime的所有方法都是错误的.唯一可靠的选择是向每个表添加触发器,以记录对单个更改历史记录表的更改,这种效率非常低,无法追溯执行.

如果您只关心"使用的数据库"与"未使用的数据库",则可以从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
Run Code Online (Sandbox Code Playgroud)

所以我可以看到自上次重置统计数据以来,该数据库上已经有活动.但是,我对统计数据重置之前发生的事情一无所知,所以如果自从半小时前统计数据重置以来我的数据库显示零活动,我就知道没什么用处了.


Thi*_*mal 5

PostgreSQL 9.5让我们跟踪上次修改的提交.

  1. 使用以下查询打开或关闭检查跟踪提交

    show track_commit_timestamp;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果返回"ON",请转到步骤3,否则修改postgresql.conf

    cd /etc/postgresql/9.5/main/
    vi postgresql.conf
    
    Run Code Online (Sandbox Code Playgroud)

    更改

    track_commit_timestamp = off
    
    Run Code Online (Sandbox Code Playgroud)

    track_commit_timestamp = on
    
    Run Code Online (Sandbox Code Playgroud)

    重启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;
    
    Run Code Online (Sandbox Code Playgroud)