2010-07-09 26 views
13

Trên máy chủ phát triển, tôi muốn xóa các cơ sở dữ liệu không sử dụng. Để nhận ra rằng tôi cần phải biết nếu cơ sở dữ liệu vẫn được sử dụng bởi một ai đó hay không.Làm cách nào để có được ngày truy cập/sửa đổi lần cuối của cơ sở dữ liệu PostgreSQL?

Có cách nào để có được quyền truy cập hoặc sửa đổi ngày cuối cùng của cơ sở dữ liệu, lược đồ hoặc bảng đã cho không?

+2

Tất cả các phương pháp tiếp cận dựa trên thử nghiệm điều hành thời gian sửa đổi tệp hệ thống là sai, hãy xem http://dba.stackexchange.com/a/58246/7788 –

Trả lời

9

Bạn có thể thực hiện việc này bằng cách kiểm tra thời gian sửa đổi cuối cùng của tệp bảng. Trong postgresql, mỗi bảng tương ứng với một hoặc nhiều file os, như thế này:

select relfilenode from pg_class where relname = 'test'; 

các relfilenode là tên tập tin của bảng "test" Sau đó, bạn có thể tìm thấy các tập tin trong thư mục của cơ sở dữ liệu.

trong môi trường thử nghiệm của tôi:

cd /data/pgdata/base/18976 

ls -l -t | head 

lệnh phương tiện cuối cùng liệt kê tất cả các file ra lệnh theo thời gian sửa đổi cuối cùng.

+0

Điều này thậm chí còn tốt hơn. Cảm ơn! –

+6

Bạn sẽ nhận được các kết quả sai từ điều này do hoạt động 'vacuum', thiết lập gợi ý, v.v. –

1

Tôi đoán bạn nên kích hoạt một số tùy chọn nhật ký. Bạn có thể nhận thông tin về cách đăng nhập vào postgreSQL here.

+0

I đã hy vọng rằng có cách để làm điều đó với psql. Tuy nhiên, mẹo của bạn cũng có thể được sử dụng trong các tập lệnh. Nếu mọi thứ khác không thành công, tôi sẽ sử dụng các tệp nhật ký. Cảm ơn! –

+0

Nhật ký sẽ không hiển thị những thứ như bảng được sửa đổi thông qua 'select' từ một hàm. Có vẻ như điều đó sẽ ổn cho trường hợp sử dụng này, nhưng nó sẽ không hoạt động đối với những người đang tìm kiếm thời gian sửa đổi thực tế. –

+0

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

1

cách của tôi để có được những ngày sửa đổi các bảng của tôi:

Python Chức năng

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 Query

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' 

Tôi không chắc chắn nếu những thứ như chân không có thể mess aproach này , nhưng trong các thử nghiệm của tôi, đó là một cách khá acurrate để có được các bảng mà không còn được sử dụng, ít nhất, vào các hoạt động INSERT/UPDATE.

+3

Điều này là sai vì những lý do được đưa ra trong bài đăng được liên kết trong nhận xét của tôi về câu hỏi chính. –

7

Không có cách tích hợp để thực hiện việc này - và all the approaches that check the file mtime described in other answers here are wrong. Tùy chọn đáng tin cậy duy nhất là thêm trình kích hoạt vào mọi bảng ghi lại thay đổi đối với một bảng lịch sử thay đổi đơn lẻ, điều này cực kỳ kém hiệu quả và không thể thực hiện hồi tố.

Nếu bạn chỉ quan tâm đến "cơ sở dữ liệu được sử dụng" so với "cơ sở dữ liệu không được sử dụng", bạn có khả năng thu thập thông tin này từ tệp nhật ký cơ sở dữ liệu định dạng CSV. Phát hiện "sửa đổi" vs "không sửa đổi" là rất nhiều khó khăn hơn; xem xét SELECT writes_to_some_table(...).

Nếu bạn không cần phải phát hiện cũ hoạt động, bạn có thể sử dụng pg_stat_database, ghi lại hoạt động kể từ khi số liệu thống kê cuối cùng reset. ví dụ .:

-[ 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 

vì vậy tôi có thể thấy rằng có được hoạt động trên DB này kể từ khi số liệu thống kê cuối cùng đặt lại. Tuy nhiên, tôi không biết gì về những gì đã xảy ra trước khi thiết lập lại số liệu thống kê, vì vậy nếu tôi có DB cho thấy hoạt động bằng 0 kể từ khi số liệu thống kê đặt lại nửa giờ trước, tôi không biết gì hữu ích.

3

PostgreSQL 9.5 cho phép chúng tôi theo dõi cam kết sửa đổi lần cuối.

  1. Kiểm tra theo dõi cam kết là bật hoặc tắt bằng cách sử dụng truy vấn sau đây

    show track_commit_timestamp; 
    
  2. Nếu nó trở về "ON" đi đến bước 3 khác sửa đổi postgresql.conf

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

    Thay đổi

    track_commit_timestamp = off 
    

    để

    track_commit_timestamp = on 
    

    Khởi động lại hệ thống

    Lặp lại bước 1.

  3. Sử dụng truy vấn sau đây để theo dõi cuối cùng cam kết

    SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME; 
    
    SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME where COLUMN_NAME=VALUE; 
    
Các vấn đề liên quan