在开发服务器上,我想删除未使用的数据库。要意识到我需要知道数据库是否仍被某人使用。
有没有办法获得给定数据库,架构或表的上次访问或修改日期?
答案 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让我们跟踪上次修改后的提交。
使用以下查询
打开或关闭跟踪提交show track_commit_timestamp;
如果它返回" ON"转到第3步,修改postgresql.conf
cd /etc/postgresql/9.5/main/
vi postgresql.conf
更改
track_commit_timestamp = off
到
track_commit_timestamp = on
重新启动postgres / system
重复步骤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;
答案 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的信息。