Можно ли отбросить все изменения базы данных за определенный момент времени?

Я пытаюсь собрать средства для сброса (большой, заполненной) базы данных postgreSQL в известное состояние между интеграционными тестами.

Я читал о функциях восстановления баз данных postgres, и похоже, что их можно восстановить в определенный момент времени. Но документы направлены на восстановление после сбоя и потерю как можно меньшего количества данных в процессе. Также кажется, что для восстановления данных требуется отключение базы данных.

Можно ли восстановить базу данных postgreSQL после небольшого количества изменений (не более одного пользователя создастся за несколько минут взаимодействия с приложением) до состояния непосредственно перед этими этапами, без необходимости останавливать и перезапускать базу данных?

1 ответ

/* This needs to be be executed only once
**
CREATE DATABASE my_template;
\connect my_template

CREATE TABLE one
        ( num SERIAL NOT NULL PRIMARY KEY
        , msg varchar
        );

INSERT INTO one(msg) VALUES('Hello world!' );

**
*/

    -- We need to connect to *some* database
    -- but *not* the one we are going to drop.
\connect my_template

        -- kill client sessions
-- SELECT pg_terminate_backend(sa.procpid) pre-9.0
SELECT pg_terminate_backend(sa.pid)     -- version >=9.0
FROM pg_stat_activity sa
WHERE datname IN ( 'cloned' )
-- AND usename NOT IN ( 'postgres' )
    ;


DROP DATABASE IF EXISTS cloned ;
CREATE DATABASE cloned 
    -- more options ...
    template=my_template;

\connect cloned

\d
   -- verify that table one actually exists and is populated
SELECT * FROM one;
  • drop database cloned; работает только при отсутствии подключенных сеансов к этой базе данных
  • Это может быть обработано, выгоняя их сначала
  • Клиенты / приложения должны затем повторно подключиться.
Другие вопросы по тегам