Как получить дату последнего доступа / изменения базы данных PostgreSQL? - PullRequest
17 голосов
/ 09 июля 2010

На сервере разработки я хотел бы удалить неиспользуемые базы данных. Чтобы понять, что мне нужно знать, используется ли база данных еще кем-то или нет.

Есть ли способ получить дату последнего доступа или модификации данной базы данных, схемы или таблицы?

Ответы [ 5 ]

11 голосов
/ 13 июля 2010

Вы можете сделать это, проверив время последнего изменения файла таблицы.В postgresql каждая таблица соответствует одному или нескольким файлам os, например:

select relfilenode from pg_class where relname = 'test';

relfilenode - имя файла таблицы "test". Затем вы можете найти файл в каталоге базы данных.

в моей тестовой среде:

cd /data/pgdata/base/18976

ls -l -t | head

последняя команда означает вывод списка всех файлов, упорядоченных по времени последнего изменения.

8 голосов
/ 05 февраля 2014

Нет встроенного способа сделать это - и все подходы, которые проверяют файл mtime, описанный здесь в других ответах, неверны .Единственным надежным вариантом является добавление триггеров в каждую таблицу, которые записывают изменения в одной таблице истории изменений, что ужасно неэффективно и не может быть выполнено задним числом.

Если вы заботитесь только об «используемой базе данных»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

, так что я могу видеть, что было активность в этой БД с момента последнего сброса статистики.Однако я ничего не знаю о том, что произошло до сброса статистики, поэтому, если бы у меня была БД, показывающая нулевую активность после сброса статистики полчаса назад, я бы не знал ничего полезного.

5 голосов
/ 31 марта 2017

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
    

    Перезапустите postgres / system

    Повторите шаг 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;
    
2 голосов
/ 15 апреля 2013

Мой способ получить дату модификации моих таблиц:

Функция 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.

1 голос
/ 09 июля 2010

Полагаю, вам следует активировать некоторые параметры журнала.Вы можете получить информацию о регистрации на postgreSQL здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...