4

我正在尝试组合一种方法,用于在集成测试之间将(大型、填充的)postgreSQL 数据库重置为已知状态。

我一直在阅读postgres 的数据库恢复功能,看起来可以恢复到特定的时间点。但这些文件旨在从崩溃中恢复并在此过程中丢失尽可能少的数据。它似乎还需要关闭数据库才能进行任何数据恢复。

是否可以在进行少量更改(在与应用程序交互的几分钟内创建的用户不超过 1 个)后将 postgreSQL 数据库恢复到这些阶段之前的状态,而无需停止并重新启动数据库?

4

1 回答 1

0
/* 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;只有在没有连接到该数据库的会话时才有效
  • 这可以通过先将它们踢出去来处理
  • 然后客户端/应用程序应重新连接。
于 2015-02-26T19:51:27.817 回答