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

时间:2010-07-09 10:30:40

标签: database postgresql

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

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

5 个答案:

答案 0 :(得分:11)

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

select relfilenode from pg_class where relname = 'test';

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

在我的测试环境中:

cd /data/pgdata/base/18976

ls -l -t | head

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

答案 1 :(得分:8)

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

如果您只关心“使用的数据库”与“未使用的数据库”,您可以从CSV格式的数据库日志文件中收集此信息。检测“修改”与“未修改”相比要困难得多;考虑SELECT writes_to_some_table(...)

如果您不需要检测活动,则可以使用pg_stat_database,记录自上次重置统计信息以来的活动。 e.g:

-[ 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

所以我可以看到自上次统计信息重置以来已经在此数据库上有活动。但是,我对统计数据重置之前发生的事情一无所知,所以如果我的数据库在半小时前重置统计数据后显示零活动,那么我就没有任何用处了。

答案 2 :(得分:5)

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 / system

    重复步骤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;
    

答案 3 :(得分:2)

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

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操作上。

答案 4 :(得分:1)

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