2010-07-09 195 views
13

在開發服務器上,我想刪除未使用的數據庫。意識到我需要知道數據庫是否仍然被某人使用。如何獲取PostgreSQL數據庫的上次訪問/修改日期?

有沒有辦法獲得給定的數據庫,模式或表的最後訪問或修改日期?

+2

所有依賴於測試工作的方法系統文件修改時間有誤,請參閱http://dba.stackexchange.com/a/58246/7788 – 2014-02-05 01:24:16

回答

9

您可以通過檢查表格文件的最後修改時間來完成。 在PostgreSQL,每個表對應一個或多個操作系統文件,如:

select relfilenode from pg_class where relname = 'test'; 

的relfilenode是表「測試」。然後,你可以在數據庫中找到的目錄中的文件的文件名。

在我的測試環境

cd /data/pgdata/base/18976 

ls -l -t | head 

的最後一個命令的手段上市的最後修改時間排序的所有文件。

+0

這甚至更好。謝謝! – 2010-07-13 04:19:23

+6

由於「真空」活動,提示位設置等原因,您會得到誤報。 – 2012-10-06 00:07:51

1

我想你應該激活一些日誌選項。您可以獲取有關在PostgreSQL here上登錄的信息。

+0

我希望有辦法用psql來做到這一點。但是,您的提示也可以在腳本中使用。如果一切都失敗了,我會使用日誌文件。謝謝! – 2010-07-09 15:44:07

+0

日誌不會顯示像通過函數中的'select'修改的表。聽起來這樣的用例可以,但它不適用於尋找實際修改時間的用戶。 – 2014-02-05 01:25:27

+0

http://dba.stackexchange.com/a/58246/7788 – user637338 2015-03-26 15:03:37

1

我的方式讓我的表的修改日期:

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操作上獲得不再使用的表是一種非常有效的方式。

+3

這對於我對主要問題的評論中鏈接文章中給出的原因是錯誤的。 – 2014-02-05 01:24:43

7

有沒有內置的方式來做到這一點 - 和all the approaches that check the file mtime described in other answers here are wrong。唯一可靠的選擇是將觸發器添加到每個表中,記錄對單個更改歷史記錄表的更改,這是非常低效且不可追溯的。

如果您只關心「數據庫使用」vs「數據庫未使用」,則可以從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 

這樣我就可以看到有對這個DB一直活動自上次統計重置。但是,我不知道統計信息重置之前發生了什麼,所以如果我有一個數據庫顯示零活動,因爲半小時前統計信息重置,我不知道什麼有用。

3

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 
    

    重新啓動系統

    重複步驟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; 
    
相關問題