【问题标题】:Change scheme for postgres extension on heroku更改heroku上postgres扩展的方案
【发布时间】:2022-08-18 07:15:53
【问题描述】:

我们有一个现有的 heroku 应用程序,我们有时会 pg:backups restore 到其他应用程序。 自 8 月 1 日起恢复失败 (https://devcenter.heroku.com/changelog-items/2446)

现有应用在public 中有扩展名,新创建的应用在heroku_ext 中有扩展名。所以我想把扩展移到heroku_ext

some-app::DATABASE=> alter extension hstore set schema heroku_ext;
ERROR:  permission denied for schema heroku_ext

架构:

some-app::DATABASE=> \\dn
       List of schemas
    Name    |     Owner
------------+----------------
 heroku_ext | postgres
 public     | some-user

扩展(为简洁起见,仅显示一个)

some-app::DATABASE=> \\dx
                                            List of installed extensions
        Name        | Version |   Schema   |                              Description
--------------------+---------+------------+------------------------------------------------------------------------
 hstore             | 1.7     | public     | data type for storing sets of (key, value) pairs

我无法删除/重新创建扩展,因为有 hstore 列取决于它。如何更改扩展的架构?

更新:

与heroku取得联系,他们说他们正在解决这个问题并提供以下信息作为解决方法:

通过以下方式手动迁移 Postgres 插件:

将受影响的数据库拉入本地数据库手动迁移 在应用程序上本地创建新数据库的相关扩展 将带有迁移扩展的本地数据库推送到新数据库中 推广新数据库手动更新模式引用。为了 例子:

更改 WITH SCHEMA public 的所有实例;与架构 heroku_ext;和所有实例: DEFAULT public to DEFAULT heroku_ext 通过在文本编辑器中使用查找和替换或更改 使用 sed 的 pg_dump

  • permission denied for schema heroku_ext - 如果您要尝试这个,您需要能够在该模式中创建对象。您还需要成为扩展的所有者,并且(我认为)只有一些扩展支持在安装后更改其架构。
  • 谢谢@RichardHuxton hstore 是可重定位的,我可以将它移动到本地 PG 安装上的新模式。这更像是一个 heroku 问题,我会说因为他们引入了这个限制,即必须将扩展安装到 NEW 应用程序的 \"heroku_ext\" 架构中。所以我们不能复制数据库。
  • Heroku 的回答令人失望☹️,因为这会在本地操作时引入额外的停机时间,因此需要启动和下载。也很容易出错。希望他们能解决这个问题。
  • 是的,令人失望。他们没有考虑到所有用例。特别是因为某些扩展是不可重定位的。

标签: postgresql heroku


【解决方案1】:

找到解决我的问题的解决方法heroku pg:copy

heroku addons:create heroku-postgresql:standard-0 --fork source-app-name::DATABASE --app target-app-name

这不是复制数据库内容,而是创建原始数据库的克隆,因此架构是兼容的。

提示:使用

heroku pg:promote DB_NAME_OF_CLONE --app target-app-name

用新的替换旧的(架构不兼容的数据库)。

【讨论】:

  • 不幸的是,我们不能在源数据库和克隆数据库之间使用heroku pg:copy。尝试这样做可能会导致部分删除架构。
【解决方案2】:

我们也看到了这一点。很遗憾 Heroku 没有公开解决这个问题。请注意,即使是 Heroku 创建的备份,如果不进行修改,此时也无法正确恢复。

我们有四个要备份的应用程序。三个出现恢复就好了,一个失败了。失败的是使用 gis 扩展——似乎包含数据的扩展失败了。

请注意,至少有一个扩展没有安装到公共模式。如果您要对备份文件进行大规模搜索和替换,请确保您只更改那些进入公共模式的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多