Вы когда-нибудь оказывались в ситуации, когда вам нужно выполнить восстановление по точке-времени, чтобы восстановить упавший объект базы данных, и вам нужно найти точное время, когда объект был сброшен?
Найти точное время не всегда просто, в большинстве случаев все сводится к догадкам, мы все там бывали.
Именно поэтому некоторое время назад я написал простое расширение pg_drop_events.
pg_drop_events – это обёртка, которая использует триггеры событий PostgreSQL, обходит оператор drop и записывает информацию в таблицу pg_drop_events
.
Пример данных выглядит следующим образом:
postgres=# SELECT pid, usename, query, xact_id, wal_position, objid, object_name, object_type, xact_time FROM pg_drop_events;
pid | usename | query | xact_id | wal_position | objid | object_name | object_type | xact_time
-------+-----------+--------------------------------+---------+--------------+-------+-------------+--------------+-------------------------------
54630 | bolaji | DROP TABLE t.t3 | 25184 | 1/A266B090 | 51293 | t.t3 | table | 2022-05-04 17:16:32.913969+00
54633 | bolaji | ALTER TABLE t.t1 DROP COLUMN a | 25185 | 1/A266BBF8 | 51287 | t.t1.a | table column | 2022-05-04 17:16:39.033796+00
54638 | postgres | DROP SCHEMA t CASCADE | 25186 | 1/A266BEC0 | 51287 | t.t1 | table | 2022-05-04 17:16:56.094366+00
54639 | postgres | DROP SCHEMA t CASCADE | 25186 | 1/A266BEC0 | 51290 | t.t2 | table | 2022-05-04 17:16:56.094366+00
Информация из pg_drop_events
может быть использована для восстановления в момент времени, что и является целью расширения – помочь в восстановлении в момент времени.
PostgreSQL предоставляет различные конфигурации времени выполнения для выполнения восстановления в момент времени. Полный список можно найти здесь recovery target
Лично я предпочитаю использовать xact_id
для точечного восстановления удаленного объекта базы данных. О причинах я расскажу в следующей главе.