Можно ли отбросить все изменения базы данных за определенный момент времени?
Я пытаюсь собрать средства для сброса (большой, заполненной) базы данных 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;
работает только при отсутствии подключенных сеансов к этой базе данных- Это может быть обработано, выгоняя их сначала
- Клиенты / приложения должны затем повторно подключиться.