Я смотрю на изменение способа создания резервных копий и мне интересно, есть ли способ определить, какие базы данных в кластере postgreql не были недавно изменены?
Вместо использования pg_dumpall я бы хотел использовать pg_dump и создавать дамп только тех баз данных, которые изменились с момента последнего резервного копирования (некоторые базы данных обновляются не очень часто). Идея заключается в том, что если ничего не изменилось, то текущая резервная копия должна все еще быть хорошим.
Кто-нибудь знает способ определить, когда конкретная база данных последний раз обновлялась / изменялась?
Спасибо...
Обновить:
Я надеялся, что мне не придется писать триггеры повсюду, поскольку я не могу контролировать создание баз данных в одном конкретном кластере (не говоря уже о создании объектов БД в базе данных).
Более подробно, похоже, что существует корреляция между содержимым файла $ PGDATA / global / pg_database (в частности, второе поле) и именами каталогов в $ PGDATA / base.
Если исходить из конечности, я бы предположил, что второе поле файла pg_database - это oid базы данных, и что каждая база данных имеет свой собственный подкаталог в каталоге $ PGDATA / base (с oid для имени подкаталога). Это верно? Если да, то разумно ли использовать временные метки файлов из файлов в каталоге $ PGDATA / base / * в качестве триггера для необходимости резервного копирования?
... или есть лучший способ?
Еще раз спасибо...
источник
Ответы:
Хотя использование,
select datname, xact_commit from pg_stat_database;
как предлагает @Jack, Дуглас не совсем работает (очевидно, из-за автовакуума),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
похоже, работает. Изменения как DML, так и DDL изменят значения столбцов tup_ *, а avacuum
- нет (vacuum analyze
с другой стороны ...).В случае, если это может быть полезно для других, я включаю сценарий резервного копирования, который я установил. Это работает для Pg 8.4.x, но не для 8.2.x-- YMMV в зависимости от используемой версии Pg.
Обновление: скрипт был помещен на github здесь .
источник
Похоже, вы можете использовать,
pg_stat_database
чтобы получить количество транзакций и проверить, если это изменится от одного резервного копирования к следующему:Если кто-то звонил
pg_stat_reset
вам, вы не можете быть уверены, изменился ли БД или нет, но вы можете считать, что это маловероятно, что это произойдет, а затем точно такое количество транзакций, которое соответствует вашему последнему чтению.--РЕДАКТИРОВАТЬ
Посмотрите этот ТАК вопрос, почему это может не сработать. Не уверен, почему это может произойти, но включение ведения журнала может пролить некоторый свет ....
источник
pg_stat_reset
вероятность того, что значение xact_commit совпадет с предыдущим, будет довольно низкой, нет? Так что, безусловно, выглядит, чтобы поймать наличие изменений DML. Теперь все, что мне нужно, это поймать, были ли изменения в DDL.create table ...
тест действительно увеличивает xact_commit.От копания в документах и группах новостей postgres:
txid_current()
даст вам новыйxid
- если вы вызовете функцию еще раз позже, если вы получитеxid
один выше, вы знаете, что между двумя вызовами не совершено никаких транзакций. Вы можете получить ложные срабатывания, хотя - например, если кто-то звонитtxid_current()
источник
Запомните отметку времени в ваших файлах, содержащих DB-данные, и посмотрите, изменились ли они. Если они сделали, была запись.
Изменить после WAL-подсказки: Вы должны делать это только после сброса ожидающих записей.
источник
Postgresql 9.5 позволяет нам отслеживать последнюю модифицированную временную отметку. Проверьте эту ссылку https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html.
источник