首先,我是一名开发人员,而不是 DBA 或系统管理员;请温柔:)
我正在开发一个应用程序工作流程,其中单个用户操作将触发数据库中的复杂更改 - 在某些表中创建数百条记录,在其他表中更新数百条记录等。总而言之,大约 12 个表(约 100 ) 被这个动作感动。由于复杂性,我很难在运行另一个测试之前手动还原所有更改。在我的大部分开发时间里,我可以简单地在工作流的末尾插入一个“ROLLBACK”语句,但是当我接近提交我的更改时,我需要测试真实的东西。
我有一个生产数据库的本地副本可以使用。就我而言,在测试之间转储和恢复比编写脚本来撤消所有更改要快。它更快,但它仍然让我慢了很多(在我老化的笔记本电脑上恢复大约需要 20 分钟)。有什么办法可以保存数据库当前状态的快照,然后快速恢复它?
我保证是系统上唯一的用户,并且我有 root 访问权限。tar'ed 和 gzip'ed 后,数据库转储约为 100MB。PostgreSQL 版本是 8.3。
提前感谢您提供任何有用的想法。
您可以使用文件系统级别的快照,但这通常很麻烦,需要特殊的文件系统,而且并不总是可用,尤其是在老化的笔记本电脑上。;-)
您如何将基本状态创建为数据库,然后使用该
CREATE DATABASE ... TEMPLATE
功能从中创建一个新数据库以进行测试运行。测试后,您将那个数据库扔掉。那么你的速度限制基本上只是到cp -R
数据库目录的时间。这与您在没有文件系统快照魔法的情况下获得的速度差不多。使用Stellar,它就像数据库的git:
如果您的数据库在Virtualbox中运行,您可以在几秒钟内轻松保存快照并恢复数据库状态和操作系统本身的快照(如果数据库或操作系统中确实有大量数据,则需要 1-2 分钟或非常分配给虚拟机的少量内存)免费。
在您/大多数情况下,最好安装一个轻量级的 linux(而不是 Windows 服务器)来运行托管数据库的虚拟机,因为您提到您的笔记本电脑上可用的资源很少。
在生产站点上,我使用MediaTemple的快照备份来实现相同的结果(但每个备份插槽 20 美元并且特定于该虚拟主机服务,因此可能不适合您)。
可能不是您希望的答案,但您是否考虑过一些较低级别的快照 - 例如 LVM?
在尝试做同样的事情并最终在 postgresql 数据目录上使用 git 时发现了这个问题。放弃更改很简单:
虽然我不得不说
Stellar
andgit reset --hard
是一个有趣的解决方案,但我会遇到更大的数据库和测试的问题,并且我确实使用了Virtualbox
etc. 解决方案,但是,在更大的测试中,当你正在使用裸机等解决方案。因此,由于@Peter Eisentraut 还提到的以下原因,我不得不提到
ZFS
将来要考虑这些文件系统:做一个测试,就在测试之前做一个 postgresql stop 如上所述,
zfs snapshot $SNAPSHOT
启动 postgresql,然后回滚,停止 postgresql,然后zfs rollback $SNAPSHOT
压缩——Postgresql 在我的数据库中获得了典型的 3:1 压缩,所以你可以做更多的测试;)
按照
TEMPLATE
彼得的回答,这些是我使用的命令:列出数据库:
复制数据库:
删除数据库:
使用这些命令我们可以做快照:
mydb
为db创建快照:mydb
从快照恢复:另一个可以试验的选择是实际保存 postgresql 数据目录的副本,然后在您想要恢复它时用该副本重写现有目录。它需要更多的磁盘空间,但肯定会比从备份恢复更快。不过,我不确定这是否会比模板方法更快,所以首先进行一些测试是个好主意。