在Heroku上更改Postgres扩展的方案。

3
我们有一个现有的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插件:

将受影响的数据库拉入本地数据库手动迁移相关扩展在本地创建一个新数据库将已迁移扩展的本地DB推送到新数据库中 提升新数据库手动更新模式引用。 例如:

将所有WITH SCHEMA public;实例更改为WITH SCHEMA heroku_ext; 将所有DEFAULT public实例更改为DEFAULT heroku_ext 使用文本编辑器中的查找和替换或使用sed更改pg_dump的输出


对于模式 heroku_ext,权限被拒绝 - 如果您要尝试此操作,您需要能够在该模式中创建对象。您还需要是扩展的所有者,并且(我认为)只有一些扩展支持在安装后更改其模式。 - Richard Huxton
感谢@RichardHuxtonhstore是可重定位的,我可以将其移动到本地PG安装中的新模式中。 我认为这更多是Heroku的问题,因为他们引入了这个限制,即扩展必须安装在NEW应用程序中的“heroku_ext”模式中。所以我们无法复制数据库。 - Pascal
Heroku的答复令人失望☹️,因为这会在本地操作时引入额外的停机时间,因此需要上传和下载。而且还容易出现错误。希望他们能解决这个问题。 - Benjamin
是的,令人失望。他们没有考虑到所有使用情况。 特别是一些扩展是不可重定位的。 - Pascal
3个回答

1

0
我们也遇到了这个问题。很遗憾Heroku没有公开解决这个问题。请注意,即使是由Heroku创建的备份,在没有修改的情况下无法正确恢复。

我们有四个应用程序正在进行备份。其中三个似乎可以成功恢复,而一个失败了。失败的那个应用程序使用了gis扩展--看起来包含数据的扩展都会失败。

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


0
发现了一个解决我的问题的变通方法,使用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。这样做可能会导致部分删除的模式。 - Benjamin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接