WSL访问Windows现有PostgreSQL数据库及pgAdmin配置问题
PostgreSQL跨Windows/WSL实例问题解答
问题1:WSL端无法查看Windows端数据库的原因与解决方法
原因说明
你在Windows和WSL中安装的是两个完全独立的PostgreSQL服务实例:
- 二者运行在相互隔离的操作系统环境中,各自使用独立的数据存储目录、端口监听空间,默认都监听自身环境的
localhost:5432,网络和数据均不互通 - 你在WSL中执行
psql命令时,默认连接的是WSL本地的PostgreSQL实例,因此无法读取Windows端存储的数据库数据
解决办法
方案1:WSL直接连接Windows端实例(无需迁移数据)
不需要导入数据,直接在WSL中连接Windows端的PostgreSQL服务即可操作对应数据:
- 在Windows命令行执行
ipconfig,找到WSL虚拟网卡对应的IPv4地址(一般为192.168.x.x网段) - 修改Windows端PostgreSQL的配置:
- 打开
postgresql.conf,将listen_addresses配置为0.0.0.0或对应WSL网卡的地址 - 打开
pg_hba.conf,添加规则允许WSL网段的IP访问
- 打开
- WSL端执行连接命令:
连接成功后即可查看、操作Windows端的所有数据库psql -h [Windows网卡IP] -p 5432 -U [Windows端PG用户名]
方案2:将Windows端数据库迁移到WSL端实例
如果需要把数据完全迁移到WSL本地实例,使用备份恢复流程操作:
- 在Windows端执行备份命令:
pg_dump -U [Windows端PG用户名] -d [待迁移数据库名] -f backup.sql - 将导出的
backup.sql文件移动到WSL可访问的目录下 - 在WSL端的PSQL命令行中创建空目标库:
CREATE DATABASE [目标数据库名]; - 执行导入操作:
psql -U [WSL端PG用户名] -d [目标数据库名] -f backup.sql
问题2:pgAdmin4同时管理两端PostgreSQL服务的配置方法
两个实例默认都占用5432端口导致冲突,需要先修改WSL端实例的配置,再添加到pgAdmin中:
配置步骤
- 修改WSL端PostgreSQL的监听配置
- 在WSL终端打开PG主配置文件:
sudo nano /etc/postgresql/13/main/postgresql.conf - 找到
port = 5432配置项,修改为未被占用的端口,例如port = 5433,保存退出 - 打开访问控制配置文件:
sudo nano /etc/postgresql/13/main/pg_hba.conf - 在文件末尾添加一行规则,允许Windows端访问:
host all all 0.0.0.0/0 md5 - 重启WSL端PG服务使配置生效:
sudo service postgresql restart
- 在WSL终端打开PG主配置文件:
- 在pgAdmin4中添加WSL端实例
- 在WSL终端执行
ip a,找到eth0网卡对应的IPv4地址(一般为192.168.x.x网段) - 打开pgAdmin4,右键「服务器」选择「注册」→「服务器」
- 「常规」页自定义填写服务器名称,例如
WSL-PostgreSQL13 - 「连接」页填写对应参数:
- 主机名/地址:填写刚才查询到的WSL的IPv4地址
- 端口:填写你修改后的端口,例如
5433 - 用户名:填写WSL端PG的用户名(默认用户为
postgres)
- 点击保存即可,现在你可以在pgAdmin4中同时查看、操作Windows和WSL两端的所有数据库
- 在WSL终端执行
数据同步说明
两个PostgreSQL是完全独立的实例,默认不会自动同步数据,如有同步需求可选择以下方案:
- 小数据量/非实时同步:定期用
pg_dump备份一端数据,恢复到另一端即可 - 实时同步:配置两个实例之间的逻辑复制功能实现
内容的提问来源于stack exchange,提问作者Galuh Alifani
相关产品推荐
相关产品推荐

