2010-07-09 6 views
13

개발 서버에서 사용하지 않는 데이터베이스를 제거하고 싶습니다. 데이터베이스가 여전히 누군가에 의해 사용되는지 여부를 알아야합니다.PostgreSQL 데이터베이스의 마지막 액세스/수정 날짜를 얻는 방법?

주어진 데이터베이스, 스키마 또는 테이블의 최종 액세스 또는 수정 날짜를 얻는 방법이 있습니까?

+2

에게 운영을 테스트에 의존하는 모든 방법을 커밋 시스템 파일 수정 시간이 잘못되었습니다. http://dba.stackexchange.com/a/58246/7788 –

답변

9

테이블 파일의 마지막 수정 시간을 확인하면됩니다. PostgreSQL의에서 는, 모든 테이블은 다음과 같이 하나 개 이상의 운영 체제 파일을 해당합니다

select relfilenode from pg_class where relname = 'test'; 

relfilenode는 데이터베이스의 디렉토리에있는 파일을 찾을 수있는 그 때는 테이블 "테스트"의 파일 이름입니다. 내 테스트 환경에서

: 최종 수정 시간으로 정렬 된 모든 파일을 나열

cd /data/pgdata/base/18976 

ls -l -t | head 

마지막 명령을 의미합니다.

+0

이것은 더 좋습니다. 감사! –

+6

'vacuum' 활동, 힌트 비트 설정 등으로 인해 위양 반응을 보일 수 있습니다. –

1

일부 로그 옵션을 활성화해야합니다. postgreSQL here에 로그온하는 방법에 대한 정보를 얻을 수 있습니다.

+0

I를 참조하십시오. psql을 사용하는 방법이 있기를 바랬습니다. 그러나 팁은 스크립트에서도 사용할 수 있습니다. 다른 모든 것이 실패하면 로그 파일을 사용합니다. 감사! –

+0

로그는 함수에서'select'를 통해 수정 된 테이블과 같은 것을 표시하지 않습니다. 이 사용 사례에서는 괜찮을 것 같지만 실제 수정 시간을 찾는 사람들에게는 적합하지 않습니다. –

+0

http://dba.stackexchange.com/a/58246/7788 – user637338

1

내 테이블의 수정 날짜 수에가는 길 :

파이썬 기능

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' 

잘 모르겠어요을 경우 진공 캔 엉망이 aproach 같은 것들 ,하지만 내 테스트에서 INSERT/UPDATE 작업에서 더 이상 사용되지 않는 테이블을 가져 오는 것은 꽤 힘들다.

+3

주 질문에 대한 내 의견의 링크 된 게시물에있는 이유 때문에 잘못되었습니다. –

7

기본 제공 방법은 없습니다. all the approaches that check the file mtime described in other answers here are wrong입니다. 유일하게 신뢰할 수있는 옵션은 단일 변경 기록 테이블에 대한 변경 사항을 기록하는 모든 테이블에 트리거를 추가하는 것입니다. 이는 무시 무시하게 비효율적이며 소급 적용 할 수 없습니다.

"데이터베이스 사용"과 "데이터베이스 사용되지 않음"만 신경 쓰면 잠재적으로 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에 된 활동이 것을 볼 수 있습니다. 그러나 통계가 재설정되기 전에 어떤 일이 발생했는지에 대해서는 알지 못합니다. 따라서 30 분 전에 통계가 재설정 된 이후 DB가 제로 활동을 나타내면 유용하지 않습니다.

3

PostgreSQL 9.5는 마지막으로 수정 된 커밋을 추적합니다.확인 트랙이 커밋

  1. 은 "ON"을 반환하는 경우는 postgresql.conf에게 수정 다른 3 단계로 이동하거나 다음 쿼리

    show track_commit_timestamp; 
    
  2. 을 사용하여 꺼져

    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; 
    
관련 문제