Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何获取PostgreSQL数据库的上次访问/修改日期?_Database_Postgresql - Fatal编程技术网

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

Database 如何获取PostgreSQL数据库的上次访问/修改日期?,database,postgresql,Database,Postgresql,在开发服务器上,我想删除未使用的数据库。要认识到这一点,我需要知道数据库是否仍有人在使用 是否有办法获取给定数据库、架构或表的上次访问或修改日期?我想您应该激活一些日志选项。您可以获取有关在postgreSQL上登录的信息。您可以通过检查表文件的上次修改时间来完成此操作。 在postgresql中,每个表对应一个或多个os文件,如下所示: select relfilenode from pg_class where relname = 'test'; relfilenode是表“test”的文

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


是否有办法获取给定数据库、架构或表的上次访问或修改日期?

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

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

select relfilenode from pg_class where relname = 'test';
relfilenode是表“test”的文件名。然后您可以在数据库的目录中找到该文件

在我的测试环境中:

cd /data/pgdata/base/18976

ls -l -t | head

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

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

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'

我不确定真空之类的东西是否会弄乱这个过程,但在我的测试中,至少在插入/更新操作中,获取不再使用的表是一种非常有效的方法。

没有内置的方法来实现这一点。唯一可靠的选择是将触发器添加到每个表中,这些表记录了对单个变更历史记录表的变更,这是非常低效的,而且无法追溯

如果您只关心“已使用数据库”与“未使用数据库”,则可以从CSV格式的数据库日志文件中收集此信息。检测“修改”与“未修改”要困难得多;考虑<代码>选择RealSeStoToSoopyTabl(…)< /C> > /P> 如果不需要检测旧的活动,可以使用
pg_stat_database
,它记录自上次统计重置以来的活动。e、 g:


因此,我可以看到,自从上次统计重置以来,这个数据库上一直有活动。但是,我不知道在统计数据重置之前发生了什么,所以如果半小时前统计数据重置后,我的数据库显示零活动,我将不知道任何有用的信息。

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

  • 使用以下查询检查track commit是否打开或关闭

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

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

    track_commit_timestamp = off
    

    重新启动postgres/系统

    重复步骤1

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

    SELECT pg_xact_commit_timestamp(xmin), * FROM  YOUR_TABLE_NAME;
    
    SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME where COLUMN_NAME=VALUE;
    

  • 我希望有办法用psql来实现。但是,您的提示也可以在脚本中使用。如果其他一切都失败了,我将使用日志文件。谢谢日志不会显示通过函数中的
    select
    修改的表之类的内容。对于这个用例来说,这听起来没问题,但对于那些寻找实际修改时间的人来说,这是行不通的。由于
    真空
    活动、提示位设置等原因,你会从中得到误报。所有依赖于测试操作系统文件修改时间的方法都是错误的,看,这是错误的,原因在我对主要问题的评论中的链接帖子中给出
    sudo服务postgresql重启应该足够了。
    
    track_commit_timestamp = on
    
    SELECT pg_xact_commit_timestamp(xmin), * FROM  YOUR_TABLE_NAME;
    
    SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME where COLUMN_NAME=VALUE;