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让我们跟踪上次修改的提交
show track_commit_timestamp;
cd /etc/postgresql/9.5/main/
vi postgresql.conf
改变
track_commit_timestamp = off
到
重新启动postgres/系统
重复步骤1SELECT 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;