Database 是否可以删除超过某个时间点的所有数据库更改?
我试图在集成测试之间将一个(大型的、填充的)postgreSQL数据库重置为已知状态 我一直在研究postgres的数据库恢复功能,看起来可以恢复到特定的时间点。但这些文件的目的是从撞车中恢复,并在过程中尽可能少地丢失数据。似乎还需要关闭数据库才能执行任何数据恢复 是否可以在少量更改(与应用程序交互几分钟内创建的用户不超过1个)后将postgreSQL数据库恢复到这些阶段之前的状态,而不必停止并重新启动数据库Database 是否可以删除超过某个时间点的所有数据库更改?,database,postgresql,point-in-time,Database,Postgresql,Point In Time,我试图在集成测试之间将一个(大型的、填充的)postgreSQL数据库重置为已知状态 我一直在研究postgres的数据库恢复功能,看起来可以恢复到特定的时间点。但这些文件的目的是从撞车中恢复,并在过程中尽可能少地丢失数据。似乎还需要关闭数据库才能执行任何数据恢复 是否可以在少量更改(与应用程序交互几分钟内创建的用户不超过1个)后将postgreSQL数据库恢复到这些阶段之前的状态,而不必停止并重新启动数据库 /* This needs to be be executed only once *
/* 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;
删除克隆的数据库代码>仅在没有连接到此数据库的会话时有效
- 这可以通过先把他们踢出去来解决
- 然后,客户端/应用程序应重新连接
btrfs
或zfs
这样的文件系统中,您可以创建一个。因此,您可以停止Postgres,将数据库目录回滚到快照,然后重新启动Postgres。(“创建数据库”基本上是一个cp-rfp templateX newdb
,加上一些目录魔法)@wildplasser你能详细说明一下吗?最好作为一个答案?克隆数据库是如何工作的?我们的数据库大约是125GB,所以在每个单独的测试之间复制所有这些数据是行不通的。如果它只是存储克隆后的更改,而删除克隆只是删除这些更改,那么这可能会起作用。您没有提到它太大了。我假设了一个开发/测试设置。哎呀,你确实提到过它很大;在第一句话中,如果数据库太大而无法克隆(您的是),并且受影响的页面数量很少,您应该尝试让PITR工作。我从未使用过它,但它似乎仍然可行。注:我刚刚在一台(好的)台式机上用1…2分钟克隆了一个~3GB的数据库。所以你的作业大约需要1/2小时才能完成。这对你来说可能太慢了。