Postgresql 使用不同于 postgres 的用户导入转储

Posted

技术标签:

【中文标题】Postgresql 使用不同于 postgres 的用户导入转储【英文标题】:Postgresql Import dump with user dfferent from postgres 【发布时间】:2021-04-17 06:10:11 【问题描述】:

我正在尝试将我的数据库从生产机器备份到备用机器。

我的生产机器是debian(未指定版本)发行版

我的备用机是 ubuntu 20.10 发行版

在互联网上进行了一些阅读之后,这是我能够完成的事情

pg_dump -h 123.123.123.123 -p 5432 my_db > my_db.bak -> 检查 psql 勾选此项,创建一个简单的删除/创建数据库 my_db 所有者 my_db_backup; psql 检查

到目前为止一切顺利

用我的 sqlworkbench 连接到 db -> 检查 使用导入的表 -> 嗯,不检查

问题在于表和序列的所有权。导入时,postgres 是它们的所有者,但我希望 my_db_backup 作为所有者 insted。

作为一种解决方法,我已经尝试过

将表 xxx 所有者更改为 my_db_backup; - > 检查每个表 如果存在 xxx OWNER TO my_db_backup,则更改序列; -> 需要很长时间,无法完成;

最后阶段(更改所有权)的命令是 psql

finalize.sql 是

\connect my_db;
ALTER TABLE xxx OWNER TO my_db_backup;
ALTER SEQUENCE IF EXISTS seq_xxx OWNER TO my_db_backup; -- this takes forever

我错过了什么?

我宁愿直接使用正确的所有者导入,而不是之后更改所有者,但只要我可以更改 my_db 中的所有对象,这仍然可以接受

tnx 寻求帮助

【问题讨论】:

我不明白您为什么要更改备用所有对象的所有权。为什么不让它归同一所有者所有? 【参考方案1】:

我终于能够使用不同的用户完成导入,如下所示

psql -U my_db_backup < my_db.bak

为了避免询问密码,我不得不像这样在 pg_hba.conf 中输入一个条目

local my_db    my_db_backup  trust

为了避免在 pg_dump 期间请求密码,我不得不在我的生产机器中添加这个条目

host  my_db  postgres     456.456.456.456/32    trust

其中 456.456.456.456 id 是备用机器的 ip。

我还必须更改一点 pg_dump 以避免不同用户导入时出错

pg_dump -h 123.123.123.123 -p 5432 --no-owner --no-acl my_db > my_db.bak

所以完整的脚本看起来像

pg_dump -h 123.123.123.123 -p 5432 --no-owner --no-acl my_db > my_db.bak
psql < createDatabase.sql
psql -U my_db_backup < my_db.bak

编辑:要让任何用户都可以使用该脚本,需要做一些事情

pg_dump -h 123.123.123.123 -p 5432 -U postgres --no-owner --no-acl -w my_db > my_db.bak
psql -U postgres < createDatabase.sql
psql -U my_db_backup < my_db.bak

添加 -U postgres 只是因为 pg_dump 尝试使用当前用户登录,所以如果您以 root 身份运行脚本,例如,pg_dump 和 psql 将尝试以 root 身份登录,显然会失败。

另一件事是使 pg_dump 不要求输入密码所需的 -w 选项。

【讨论】:

以上是关于Postgresql 使用不同于 postgres 的用户导入转储的主要内容,如果未能解决你的问题,请参考以下文章

postgres 错误:Postgresql 11.6 中的列不存在错误

PostgreSQL操作-psql基本命令

Postgres-XL 向后兼容 PostgreSQL?

Postgres-XL:JSON 函数

简单的 Postgresql 语句 - 列名不存在

如何解决这个问题以使用 psql? | psql:错误:致命:角色“postgres”不存在