postgresql 如何从WSL连接到Windows Postgres数据库

3gtaxfhh  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(6)|浏览(237)

我在Windows计算机上运行Postgres 11服务。如何从WSL连接到这个数据库?
当我尝试su - postgres时:

postgres@LAPTOP-NQ52TKOG:~$ psql 
psql: could not connect to server: No such file or directory 
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"

它正在尝试连接到WSL中的Postgres。我不想运行Ubuntu Postgres使用:sudo /etc/init.d/postgresql start

mu0hgdu0

mu0hgdu01#

WSL 2动态地将IP地址分配给Windows主机,IP地址甚至可以在不重新启动Windows的情况下更改(参见下面的注解)。因此,为了可靠地连接,我们需要:
1.允许Windows和Postgres接受来自WSL 2 IP地址范围的连接(默认情况下不允许)
1.在WSL 2中,确定通过psql连接时Windows/PostgreSQL主机的IP地址(动态)。我们将通过.bashrcalias来方便地实现这一点。
不幸的是,我找不到WSL 2 IP地址范围的确切规范。从几次测试/重启来看,WSL 2分配的IP地址主要在172.*.*.*范围内,但我偶尔会分配192.*.*.*,因此我们将在配置防火墙和Postgres时使用这些。

为WSL 2 IP路由器添加Windows防火墙端口规则:

1.打开Windows Defender Firewall with Advanced Security
1.点击New Rule...
1.选择Port作为规则类型
1.选择TCP,对于Specific local ports,输入5432
1.选择Allow the connection。从WSL 2连接将不安全,因此不要选择安全选项
1.至少选择Public。也可以选择DomainPrivate。我只能在选择Public的情况下连接
1.命名规则,例如。Postgres - connect from WSL2并创建它
1.右键单击新创建的规则并选择Properties,然后单击Scope选项卡
1.在Remote IP address下,选择These IP addresses,然后单击Add...并输入范围172.0.0.1172.254.254.254
1.对IP地址范围192.0.0.1192.254.254.254重复步骤9
1.单击Apply,然后单击OK
1.确保已启用规则

配置Postgres以接受来自WSL 2 IP路由器的连接

假设PostgreSQL for Windows的默认安装/设置,以下文件位于C:\Program Files\PostgresSQL\$VERSION\data
验证postgresql.conf是否具有以下设置:

listen_addresses = '*'

这应该已经被设置为'*',所以这里什么也不做。
更新pg_hba.conf以允许来自WSL 2范围的连接,例如Postgresl 12:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             172.0.0.0/8             md5
host    all             all             192.0.0.0/8             md5

对于PostgreSQL 13+,您应该使用scram-sha-256作为方法。
重新启动Postgres以使更改生效。这可以通过Windows Services应用程序或具有管理员权限的cmd完成,例如Postgresql 12:

net stop postgresql-x64-12
net start postgresql-x64-12

WSL Shell Conveniences

在WSL中,将以下内容添加到~/.bashrc或类似文件中:

# Add DNS entry for Windows host
if ! $(cat /etc/hosts | grep -q 'winhost'); then
  echo 'Adding DNS entry for Windows host in /etc/hosts'
  echo '\n# Windows host - added via ~/.bashhrc' | sudo tee -a /etc/hosts
  echo -e "$(grep nameserver /etc/resolv.conf | awk '{print $2, "   winhost"}')" | sudo tee -a /etc/hosts
fi

然后重新加载您的.bashrc更改:source ~/.bashrc

用法

psql -h winhost -p 5432 -U postgres

备注:

  • WSL 2分配给Windows主机的IP地址与分配给网络上的物理Windows计算机的IP地址不同。WSL 2使用vEthernet连接。
  • 您可以通过Control Panel\Network and Internet\Network Connections检查vEthernet连接
  • 请注意,当查看IPv4属性时,IP地址看起来好像是静态设置的,但实际上并非如此!尝试重新启动并再次检查IPv4属性
  • 如果有一天您无法连接到Postgres,请检查winhost是否在防火墙规则的IP地址范围内。可能是WSL分配了一个我们没有预料到的IP地址!
gcxthw6b

gcxthw6b2#

在WSL 2中,您需要使用主机IP连接
获取主机IP
grep nameserver /etc/resolv.conf | awk '{print $2}'
然后你需要允许TCP 5432入站规则在“Windows Defender防火墙与高级安全”
我做了我自己PS.you仍然需要允许TCP 5432在防火墙
把这个放进~/.bashrc
cat /etc/hosts | grep 172.; test $? -eq 0 && $1 || echo -e "$(grep nameserver /etc/resolv.conf | awk '{print $2, " host"}')\n$(cat /etc/hosts)" | sudo tee /etc/hosts
如果之前不存在主机IP,则将其附加到/etc/hosts(通常在重新启动wsl或计算机时发生)
然后

psql -h host -p 5432 -U postgres
u91tlkcl

u91tlkcl3#

明确指定您的主机、端口和用户名例如:

psql -h 127.0.0.1 -p 5432 -U postgres
mzmfm0qo

mzmfm0qo4#

对我来说,有效的方法是遵循以下步骤:

  • 更改pg_hba.conf以监听所有接口:host all all 0.0.0.0/0 trust
  • 打开PostgreSQL防火墙
  • 使用/etc/hosts中指向我的主机的ip的主机名之一。这个主机名对我来说是:host.docker.internal
py49o6xq

py49o6xq5#

这个问题可以通过两种可能的方式来解决
显式指定主机名和用户名

psql -h localhost -U postgres


导航到runpsql.sh文件并运行查询

/Library/PostgreSQL/14/scripts/runpsql.sh

现在通过输入密码(如果需要)运行psql查询

xzv2uavs

xzv2uavs6#

我发现WSL 2确实给出了给予这个错误:
psql:错误:连接到服务器“localhost”(127.0.0.1),端口5432失败:服务器是否在该主机上运行并接受TCP/IP连接?
但WSL 1没有。
我有两个不同的WSL发行版运行Ubuntu,一个在WSL 1上,一个在WSL 2上,并在WSL 1上测试了连接,我的连接是成功的。
我把另一个降级,重新测试,它也工作。我重新升级,我得到了错误。
WSL 2是一个更完整的(见这里. https://learn.microsoft.com/en-us/windows/wsl/compare-versions),是一个完整的Linux内核和托管VM,而WSL 1不是。
如果你像我一样,你的测试要求不那么严格(切换到管理员用户来处理你工作笔记本电脑上的防火墙和postgres设置,对我来说是一个费力的过程),你只需要像我一样从Linux进行测试,你可以安装另一个WSL,让它保持在1甚至降级。值得注意的是,这将不支持牧场主桌面,因为它需要WSL 2。Docker Desktop安装了WSL 2,所以这不应该成为考虑因素。
更多信息在这里查看您的WSL版本等。
https://learn.microsoft.com/en-us/windows/wsl/compare-versions
HTH。

相关问题