【发布时间】:2008-11-14 12:50:45
【问题描述】:
我想对我的 Web 应用程序进行自动化测试,它使用 postgresql。有谁知道如何在 postgresql 数据库上定义还原点并还原到早期状态? 我听说过有关时间点恢复的信息,但如果这是我需要的,我不知道。
提前致谢
【问题讨论】:
标签: database postgresql web-applications testing
我想对我的 Web 应用程序进行自动化测试,它使用 postgresql。有谁知道如何在 postgresql 数据库上定义还原点并还原到早期状态? 我听说过有关时间点恢复的信息,但如果这是我需要的,我不知道。
提前致谢
【问题讨论】:
标签: database postgresql web-applications testing
首先,不要在您的生产数据库上执行此操作。
正确的方法 (tm) 是将交易用于其价值。在 postgres 中,您甚至可以使用保存点(您可以回滚到)来嵌套它们。
test=# create table foo (foo_id serial primary key, bar varchar);
NOTICE: CREATE TABLE will create implicit sequence "foo_foo_id_seq" for serial column "foo.foo_id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
CREATE TABLE
test=# begin; insert into foo (bar) values ('test');
BEGIN
INSERT 0 1
test=# savepoint sp1;
SAVEPOINT
test=# insert into foo (foo_id, bar) values (1, 'test');
ERROR: duplicate key value violates unique constraint "foo_pkey"
test=# rollback to sp1;
ROLLBACK
test=# select * from foo;
foo_id | bar
--------+------
1 | test
test=# -- note that you're still in a transaction
如果这不适合(由于软件限制或其他原因),您可以始终将数据库的多个转储保存在可以轻松恢复的文件中;和/或有一个脚本自动将您的生产数据库转储到本地测试数据库中。
此外,请始终记住将架构更改保留在版本控制中(或至少一些 .sql 文件);使用测试数据库开发新内容后,可以轻松更新生产数据库。
PITR 主要用于热备/备份目的。
【讨论】:
PITR 适用于在线备份方案,它旨在创建备份而不中断操作,然后能够在发生灾难时恢复数据,而不是用于测试应用程序。数据恢复不在线,比较复杂。
我认为正确的测试方法是拥有一个可以轻松丢弃并从标准备份恢复的数据库,然后您可以使用自动化中的标准备份/恢复脚本重复测试。如果做不到这一点,另一种测试方法是使用事务。您将进行的每个测试都将包含在您执行测试后回滚的事务中。
BEGIN;
SELECT ...
INSERT ...
UPDATE ...
DELETE ...
<Here go queries to check if everything is alright, setting the test result>
ROLLBACK
【讨论】: