我们有一个很大的PostgreSQL转储,里面有数百个表,我可以用pg_restore成功导入。我们正在开发一个软件,它可以插入很多这样的表(大约100个),并且每次运行时我们都需要将这些表返回到它们的原始状态(这意味着返回到转储中的内容)。再次恢复原始转储需要花费大量时间,我们不能在每次调试会话之前等待半个小时。因此,我需要一种相对快速的方法来将这些表从转储恢复后恢复到它们所处的状态。
我已经尝试使用pg_restore与-L开关和选择这些表,但我得到一个重复的键错误时使用——data-only和——clean或"不能删除表X,因为其他对象依赖于它"错误时,只使用——clean。在pg_restore之前发出SET CONSTRAINTS ALL DEFERRED命令也不起作用。也许我把表列表中的行写错了,现在是
491; 1259 39623998 TABLE public some_table some_user
8021; 0 0 COMMENT public TABLE some_table some_user
8022; 0 0 ACL public some_table some_user
,然后
6700; 0 39624062 TABLE DATA public some_table postgres
8419; 0 0 SEQUENCE SET public some_table_pk_id_seq some_user
我们只插入数据,不更新现有的行,所以删除索引上面的所有行并重置序列可能会工作,但我真的不想为所有的100个表手动创建这些命令,我甚至不确定它会工作,即使我设置级联删除其他对象取决于给定的行。
有没有人有更好的办法来处理这个问题?
所以您正在寻找类似快照的东西,以便能够快速恢复到某个状态。
我不知道PostgreSql是否有可能回滚到某个时间戳
在寻找解决方案时,我在这里发现了两个想法
- 使用
create database
和template
选项 - 使用VMWare或VirtualBox虚拟化PostgreSql安装,并使用虚拟机的快照功能
同样,这两个想法都是从上面的源代码复制的(我搜索了"postgresql db快照")。
您可以使用PITR在加载之前创建快照,并使用PITR快照将您带回到具有日志的任何点。