Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 是否可以删除超过某个时间点的所有数据库更改?_Database_Postgresql_Point In Time - Fatal编程技术网

Database 是否可以删除超过某个时间点的所有数据库更改?

Database 是否可以删除超过某个时间点的所有数据库更改?,database,postgresql,point-in-time,Database,Postgresql,Point In Time,我试图在集成测试之间将一个(大型的、填充的)postgreSQL数据库重置为已知状态 我一直在研究postgres的数据库恢复功能,看起来可以恢复到特定的时间点。但这些文件的目的是从撞车中恢复,并在过程中尽可能少地丢失数据。似乎还需要关闭数据库才能执行任何数据恢复 是否可以在少量更改(与应用程序交互几分钟内创建的用户不超过1个)后将postgreSQL数据库恢复到这些阶段之前的状态,而不必停止并重新启动数据库 /* This needs to be be executed only once *

我试图在集成测试之间将一个(大型的、填充的)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;
  • 删除克隆的数据库仅在没有连接到此数据库的会话时有效
  • 这可以通过先把他们踢出去来解决
  • 然后,客户端/应用程序应重新连接

考虑在Postgres之外寻找解决方案。在像
btrfs
zfs
这样的文件系统中,您可以创建一个。因此,您可以停止Postgres,将数据库目录回滚到快照,然后重新启动Postgres。(“创建数据库”基本上是一个
cp-rfp templateX newdb
,加上一些目录魔法)@wildplasser你能详细说明一下吗?最好作为一个答案?克隆数据库是如何工作的?我们的数据库大约是125GB,所以在每个单独的测试之间复制所有这些数据是行不通的。如果它只是存储克隆后的更改,而删除克隆只是删除这些更改,那么这可能会起作用。您没有提到它太大了。我假设了一个开发/测试设置。哎呀,你确实提到过它很大;在第一句话中,如果数据库太大而无法克隆(您的是),并且受影响的页面数量很少,您应该尝试让PITR工作。我从未使用过它,但它似乎仍然可行。注:我刚刚在一台(好的)台式机上用1…2分钟克隆了一个~3GB的数据库。所以你的作业大约需要1/2小时才能完成。这对你来说可能太慢了。