我正在尝试组合一种方法,用于在集成测试之间将(大型、填充的)postgreSQL 数据库重置为已知状态。
我一直在阅读postgres 的数据库恢复功能,看起来可以恢复到特定的时间点。但这些文件旨在从崩溃中恢复并在此过程中丢失尽可能少的数据。它似乎还需要关闭数据库才能进行任何数据恢复。
是否可以在进行少量更改(在与应用程序交互的几分钟内创建的用户不超过 1 个)后将 postgreSQL 数据库恢复到这些阶段之前的状态,而无需停止并重新启动数据库?
我正在尝试组合一种方法,用于在集成测试之间将(大型、填充的)postgreSQL 数据库重置为已知状态。
我一直在阅读postgres 的数据库恢复功能,看起来可以恢复到特定的时间点。但这些文件旨在从崩溃中恢复并在此过程中丢失尽可能少的数据。它似乎还需要关闭数据库才能进行任何数据恢复。
是否可以在进行少量更改(在与应用程序交互的几分钟内创建的用户不超过 1 个)后将 postgreSQL 数据库恢复到这些阶段之前的状态,而无需停止并重新启动数据库?
/* 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;
只有在没有连接到该数据库的会话时才有效