AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 3394
Accepted
Zilk
Zilk
Asked: 2011-06-21 14:53:22 +0800 CST2011-06-21 14:53:22 +0800 CST 2011-06-21 14:53:22 +0800 CST

是否可以使用 PostgreSQL 快速创建/恢复数据库快照?

  • 772

首先,我是一名开发人员,而不是 DBA 或系统管理员;请温柔:)

我正在开发一个应用程序工作流程,其中单个用户操作将触发数据库中的复杂更改 - 在某些表中创建数百条记录,在其他表中更新数百条记录等。总而言之,大约 12 个表(约 100 ) 被这个动作感动。由于复杂性,我很难在运行另一个测试之前手动还原所有更改。在我的大部分开发时间里,我可以简单地在工作流的末尾插入一个“ROLLBACK”语句,但是当我接近提交我的更改时,我需要测试真实的东西。

我有一个生产数据库的本地副本可以使用。就我而言,在测试之间转储和恢复比编写脚本来撤消所有更改要快。它更快,但它仍然让我慢了很多(在我老化的笔记本电脑上恢复大约需要 20 分钟)。有什么办法可以保存数据库当前状态的快照,然后快速恢复它?

我保证是系统上唯一的用户,并且我有 root 访问权限。tar'ed 和 gzip'ed 后,数据库转储约为 100MB。PostgreSQL 版本是 8.3。

提前感谢您提供任何有用的想法。

postgresql restore
  • 8 8 个回答
  • 35608 Views

8 个回答

  • Voted
  1. Best Answer
    Peter Eisentraut
    2011-06-23T12:43:15+08:002011-06-23T12:43:15+08:00

    您可以使用文件系统级别的快照,但这通常很麻烦,需要特殊的文件系统,而且并不总是可用,尤其是在老化的笔记本电脑上。;-)

    您如何将基本状态创建为数据库,然后使用该CREATE DATABASE ... TEMPLATE功能从中创建一个新数据库以进行测试运行。测试后,您将那个数据库扔掉。那么你的速度限制基本上只是到cp -R数据库目录的时间。这与您在没有文件系统快照魔法的情况下获得的速度差不多。

    • 45
  2. David Portabella
    2016-06-13T09:00:14+08:002016-06-13T09:00:14+08:00

    使用Stellar,它就像数据库的git:

    Stellar 允许您在编写数据库迁移、切换分支或弄乱 SQL 时快速恢复数据库。支持 PostgreSQL 和 MySQL(部分)。

    • 14
  3. wildpeaks
    2011-07-02T04:45:36+08:002011-07-02T04:45:36+08:00

    如果您的数据库在Virtualbox中运行,您可以在几秒钟内轻松保存快照并恢复数据库状态和操作系统本身的快照(如果数据库或操作系统中确实有大量数据,则需要 1-2 分钟或非常分配给虚拟机的少量内存)免费。

    在您/大多数情况下,最好安装一个轻量级的 linux(而不是 Windows 服务器)来运行托管数据库的虚拟机,因为您提到您的笔记本电脑上可用的资源很少。


    在生产站点上,我使用MediaTemple的快照备份来实现相同的结果(但每个备份插槽 20 美元并且特定于该虚拟主机服务,因此可能不适合您)。

    • 5
  4. Jack Douglas
    2011-06-22T00:12:03+08:002011-06-22T00:12:03+08:00

    可能不是您希望的答案,但您是否考虑过一些较低级别的快照 - 例如 LVM?

    • 3
  5. user92843
    2016-04-23T06:59:41+08:002016-04-23T06:59:41+08:00

    在尝试做同样的事情并最终在 postgresql 数据目录上使用 git 时发现了这个问题。放弃更改很简单:

    git reset --hard
    
    • 2
  6. Hvisage
    2019-10-21T11:06:07+08:002019-10-21T11:06:07+08:00

    虽然我不得不说Stellarandgit reset --hard是一个有趣的解决方案,但我会遇到更大的数据库和测试的问题,并且我确实使用了Virtualboxetc. 解决方案,但是,在更大的测试中,当你正在使用裸机等解决方案。

    因此,由于@Peter Eisentraut 还提到的以下原因,我不得不提到ZFS将来要考虑这些文件系统:

    1. 快照 - 特别是当您从 Prod 复制到 QA/DR 时,您可以使用相同的“文件系统”进行测试:
    #On a replication node, rather stop, snap, restore for a "consistent" backup ;)
    su -l -c "/usr/bin/m2ee stop" acw_qa
    pg_ctlcluster ${=QA} stop --force
    zfs destroy -R $SNAPSHOT
    pg_ctlcluster ${=REPLICATION} stop --force
    zfs snapshot $SNAPSHOT
    pg_ctlcluster ${=REPLICATION} start
    
    zfs destroy $CLONE
    zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
    rm $CLONEDIR/$CLUSTER/recovery.conf
    pg_ctlcluster ${=QA} start
    su -l -c "/usr/bin/m2ee start" acw_qa
    
    1. 做一个测试,就在测试之前做一个 postgresql stop 如上所述,zfs snapshot $SNAPSHOT启动 postgresql,然后回滚,停止 postgresql,然后zfs rollback $SNAPSHOT

    2. 压缩——Postgresql 在我的数据库中获得了典型的 3:1 压缩,所以你可以做更多的测试;)

    • 1
  7. Noam Nol
    2022-02-08T01:46:08+08:002022-02-08T01:46:08+08:00

    按照TEMPLATE彼得的回答,这些是我使用的命令:

    列出数据库:

    psql -h localhost -l
    

    复制数据库:

    createdb -T <db_to_be_cloned> <clone_name>
    

    删除数据库:

    dropdb <db_name>
    

    使用这些命令我们可以做快照:

    mydb为db创建快照:

    createdb -h localhost -T mydb sshot-mydb-001
    

    mydb从快照恢复:

    dropdb -h localhost mydb
    createdb -h localhost -T sshot-mydb-001 mydb
    
    • 1
  8. Haroldo_OK
    2017-01-17T02:38:40+08:002017-01-17T02:38:40+08:00

    另一个可以试验的选择是实际保存 postgresql 数据目录的副本,然后在您想要恢复它时用该副本重写现有目录。它需要更多的磁盘空间,但肯定会比从备份恢复更快。不过,我不确定这是否会比模板方法更快,所以首先进行一些测试是个好主意。

    • 0

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve