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 的位置。
我正在尝试 运行 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 的位置。