【问题标题】:how to automate postgress import and export of functions and views如何自动化 postgres 函数和视图的导入和导出
【发布时间】:2013-03-18 22:04:50
【问题描述】:

我有一个使用 PostgreSQL 数据库的项目,它使用 19 个存储过程(函数)和大约 70 个视图。

现在,我们对实时数据库进行了一些更新,并且由于 postgres 的限制以及需要删除和重新创建所有函数和视图,函数发生了变化,我们花了相当长的时间来做这件事。

是否有一种自动化的方式来改变 postgress 中的函数和视图,以关注依赖关系并以正确的顺序执行。

我们有基本视图,然后创建上层视图...它有点复杂的数据库,至少对我来说是这样的:)

谢谢

【问题讨论】:

    标签: database postgresql


    【解决方案1】:

    我认为最简单的方法是将数据库备份到文本文件:

    pg_dump database_name > database_name.pg_dump
    

    它们将处于正确的依赖顺序中,否则从备份中恢复数据库会很困难。您可以在备份文件中编辑函数和视图定义并将其恢复到新数据库。

    如果数据库备份文件太大而无法在编辑器中编辑,从 Postgres 9.2 开始,您可以将其拆分为 3 个部分:

    pg_dump --section=pre-data > database_name.1.pg_dump
    pg_dump --section=data > database_name.2.pg_dump
    pg_dump --section=post-data > database_name.3.pg_dump
    

    您将只编辑第一部分,该部分很小。在旧版本中,您可以使用例如 split 实用程序。

    如果您无法承受备份和恢复所需的停机时间,那就更麻烦了。但我仍然建议使用备份文件。请记住,Postgres 在事务中支持 DDL — 如果您在事务中导入函数和视图并且会出现错误,您可以简单地回滚所有更改,进行更正并重试。

    【讨论】:

      【解决方案2】:

      没有“简单”的方法。 IMO 最好的方法是先做好准备,然后使用 SQL 脚本和版本控制来设置方法。

      我们在 LedgerSMB 中所做的是将函数定义保存在一系列 .sql 文件中,这些文件在 subversion 中被跟踪。然后我们有一个重新加载它们的脚本。如果您以前没有这样做,这将需要一些工作来设置。最简单的方法是:

      pg_dump -s > ddl_statements_for_mydb.sql
      

      然后您可以复制/粘贴函数定义(将 CREATE 更改为 CREATE OR REPLACE 或在适当的地方添加 DROP IF EXISTS)。然后你会想要模块化成可用的块,并有一个脚本以正确的顺序将所有块重新加载到你的数据库中。现在设置所有内容所花费的时间和精力将在未来节省很多倍,因为您可以以可预测的方式将更改应用到测试、暂存和生产帐户,而没有明显的停机时间(甚至可能根本没有停机时间,具体取决于如何你构建它)。

      【讨论】:

        猜你喜欢
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        • 2017-02-23
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多