Postgresql Ubuntu 奇怪的行为(版本不兼容?)

Postgresql Ubuntu strange behaviour (version incompatibility?)

我正在尝试 运行 Ubuntu 16.04 LTS 上的 postgresql 数据库。

首先,我使用 sudo apt-get install postgresql 安装了 9.5.1 版的 postgres。然后我创建了另一个用户和一个新数据库。我已将新数据库的所有权限授予新用户,并将所有者也设置为新用户。

我连接到新数据库并通过恢复我使用 \i /path/to/dump.sql 从另一个数据库(具有 postgresql 版本 9.2)创建的普通备份(转储)来填充它。我没有收到任何错误,然后当我输入 \dt 时,我得到了带有表格的列表。

问题是:当我现在断开连接 (\q) 并重新连接(与我之前连接的相同,sudo psql -U "username" dbname)并再次键入 \dt 时,它显示 "No relations found"。当我再次尝试填充它时,出现了一堆错误,例如 "Relation relationname already exists".

当我尝试使用 pgAdmin(通过 sudo apt-get install pgadmin3 安装)时出现另一个 problem/symptom。尝试使用本地主机连接时,我无法使用新创建的用户(我可以从终端连接)进行连接。 但我可以 使用 postgres 和我通过终端设置的密码 进行连接。 我没有看到我从 pgAdmin 的命令行手动创建的任何数据库

是的,我猜至少有一个问题可能是 9.2 和 9.5 之间的版本不兼容。有什么办法可以test/fix这个吗?不过我也觉得应该还有其他问题。

如果 SQL 转储包含一个 SET search_path TO... 将其设置为与用户默认值不同的值的命令,则可能会发生您描述的情况。

因此,它不仅会在该模式中创建其 table 和其他对象,而且会在会话的其余部分保留 search_path,因此当您执行 \dt 在同一个会话中,它确实看到并列出了新创建的 tables.

但是当你退出并重新进入 psql 时,这个 search_path 不再有效,你回到了你的用户的默认 search_path,这应该不会到达架构,所以 \dt 不再 "sees" 任何 table.

您可以使用 show search_path 在 psql 会话中检查此设置,并在 SQL 文件中使用 grep "SET search_path" 检查它的设置。


根据评论,情况似乎是这样的:转储将 tables 创建到用户默认搜索路径之外的架构中。

让该用户无缝工作的一种可能解决方案是更新其搜索路径,以便它始终首先到达该架构。这可以通过以下方式完成:

ALTER USER username SET search_path TO schema1,"$user",public;

其中 schema1 是 SQL 转储所指的内容以及它创建 table 的位置。