psql通过指令登入数据库服务器,核心就一条命令:psql -U 用户名 -d 数据库名 -h 主机地址 -p 端口号,掌握参数组合后,无论本地还是远程都能轻松连上。
psql登录命令是什么?先记住这四条参数
很多刚接触PostgreSQL的朋友,第一次敲psql命令就卡在登录环节,其实这套指令的逻辑非常直白,你用psql连接数据库服务器,本质上就是告诉它四个信息:我是谁、去哪台机器、进哪个库、走哪个门。
psql基本语法拆解
psql的命令行格式如下:
psql [选项] [数据库名称]
实际使用中最常用的选项就是下面这几个:
- -U 或 –username:指定连接数据库的用户名,比如PostgreSQL默认的管理员通常是postgres。
- -d 或 –dbname:指定要连接的数据库名,如果不填,默认连接与用户名同名的数据库。
- -h 或 –host:指定数据库服务器的主机地址,本地登录可以写localhost,远程登录写服务器IP或域名。
- -p 或 –port:指定端口号,PostgreSQL默认是5432,如果服务器改了端口,这里必须对应。
举个本地登录的例子,你想用postgres用户连本机的mydb数据库:
psql -U postgres -d mydb -h localhost -p 5432
执行后系统会提示输入密码,密码正确就直接进入数据库交互界面,看到mydb=#这样的提示符就说明登录成功了,如果不加-d参数,会尝试连接和用户名相同的数据库,
psql -U postgres
这等价于尝试连接postgres这个数据库,而PostgreSQL安装后默认就有一个名为postgres的数据库,所以这条指令在本地基本都能直接进。
免密登录的便捷技巧
如果每次都要输密码嫌麻烦,业内专家指出可以将连接信息写入HOME目录下的.pgpass文件,格式是主机:端口:数据库:用户名:密码。
localhost:5432:mydb:postgres:我的密码
保存后记得用chmod命令设置文件权限为600,否则系统会忽略这个文件,此外还可以直接通过环境变量PGPASSWORD传递密码,但安全性较低,不建议生产环境使用。
psql怎么远程连接数据库?关键在host和port
远程登入数据库服务器是运维场景里的高频需求,不少人在本地连得好好的,一到远程就报错,here原因多半是只改了IP没注意端口和访问权限,psql远程连接和本地最大的区别在于,你需要明确指定服务器的公网或内网IP地址,并且确认服务器防火墙放行了5432端口。
远程连接的三种常见写法
第一种,直连IP地址,这是最常规的操作:
psql -U admin -d business_db -h 192.168.1.100 -p 5432
第二种,云服务器场景,带公网域名或弹性IP:
psql -U admin -d business_db -h ecs-example.aliyuncs.com -p 5432
第三种,不走默认端口,很多云数据库为了安全会把端口改成高位随机数:
psql -U admin -d business_db -h 10.0.0.5 -p 15432
远程连接前必查的三个配置文件
直接敲远程命令大概率会碰到两种情况:一是提示超时,二是提示密码验证失败,多数情况下不是命令写错了,而是服务器端没放行,按下面三步排查,一般都能解决。
第一步,检查postgresql.conf里的监听地址。 默认配置只监听localhost,远程访问必须把listen_addresses改为,然后重启PostgreSQL服务。
第二步,检查pg_hba.conf里的访问规则。 这个文件是PostgreSQL的准入白名单,需要在里面追加一行记录,让来自特定IP段的客户端使用md5或scram-sha-256方式认证,
host all all 192.168.1.0/24 scram-sha-256
第三步,确认云安全组或系统防火墙。 简米云、酷番云这类平台需要在控制台的安全组规则里放行5432端口,同时服务器本地的iptables或firewalld也要同步放行,缺一不可。
psql登录报错怎么办?五个高频坑一次说清
连接报错的提示信息看着吓人,其实翻来覆去就那几类原因,下面列出新手最容易踩的五个坑,每个都附上排错思路。
提示psql: error: could not connect to server
这句英文的意思是客户端压根没摸到数据库服务器,首先要确认服务器进程是不是活着,用pg_isready命令检测,如果返回accepting connections说明服务正常,接着ping一下服务器IP,再telnet测试端口通不通:
telnet 192.168.1.100 5432
如果telnet显示Connection refused,说明端口没监听或防火墙拦截了,重点排查我上文提到的三个配置文件。
提示password authentication failed
密码验证失败的提示很常见,先确认密码有没有输错,注意PostgreSQL密码是区分大小写的,如果确认密码无误还报错,那就要检查pg_hba.conf里对应记录的认证方式,有些系统装完默认是trust信任模式,不会要求密码,一旦改成md5或scram-sha-256就需要正确密码才能登录,特别提醒一句,PostgreSQL 14版本之后默认认证方式是scram-sha-256,而不是老版本的md5,很多教程没更新,照着旧文档改就会踩坑。
提示database “xxx” does not exist
这个报错很直白,你要连的那个数据库不存在,用psql -U postgres -l先列出服务器上所有数据库,看看名字是不是记错了,注意大小写和连字符。
提示psql: FATAL: no pg_hba.conf entry for host
服务器收到了请求,但pg_hba.conf里没有匹配到你的IP,解决方法是回到服务器上编辑pg_hba.conf,在文件末尾追加一行允许规则,然后执行
SELECT pg_reload_conf();让配置热生效,不用重启服务。
提示SSL connection required
新版PostgreSQL出于安全考虑,云厂商常强制开启SSL,如果客户端没配SSL参数就会报这个错,简单处理是在psql命令后面加一个sslmode=disable参数:
psql "host=192.168.1.100 port=5432 dbname=mydb user=admin sslmode=disable"
psql登录postgresql默认密码忘了怎么处理
忘记postgres用户的密码,这种事在测试环境太常见了,生产环境不建议用这种手段,但开发机或者内网测试库完全可以自救。
三步重置postgres密码
先找到服务器的pg_hba.conf文件,把local开头的认证方式临时改成trust,然后用系统用户postgres重新加载服务并登录:
sudo -u postgres psql
进入数据库后执行修改密码的SQL:
ALTER USER postgres WITH PASSWORD '新密码';
最后把pg_hba.conf重新改回md5或scram-sha-256,再执行一次SELECT pg_reload_conf();大功告成,整个过程耗时不到两分钟,唯一需要注意的是操作前确认当前环境允许重启服务。
用连接串一键登录
有些场景下你希望用一条命令同时带上用户名、密码、数据库和主机,可以写在连接串里,
psql postgresql://admin:mypass@192.168.1.100:5432/business_db
这种方式适合脚本自动化和CI/CD流水线,但连接串里的密码会暴露在命令历史中,建议只在受控环境使用,如果你用的是Windows的cmd或PowerShell,同样支持这套语法,不需要额外安装任何图形化工具。
psql退出和常用内指令
登录成功后很多人不知道该怎么退出,其实在psql交互界面输入q或者按Ctrl+D就能安全退出连接,既然聊到内指令,顺手整理几个高频操作:
- l:列出所有数据库
- dt:显示当前数据库的所有表
- d 表名:查看表的详细结构
- du:列出所有用户和角色
- conninfo:查看当前连接信息
- ?:查看所有psql命令的帮助
这些指令在排查问题时非常实用,比如你怀疑自己连错了库,敲一下conninfo就能看到当前会话连接的是哪个主机和数据库,省得来回切换。
psql连接参数对照表
为了让你可以快速查阅,下面把psql最核心的参数做成一览表,方便直接复制使用:
| 参数 | 作用 | 示例 |
|---|---|---|
| -U | 指定用户名 | psql -U postgres |
| -d | 指定数据库 | psql -d mydb |
| -h | 指定主机地址 | psql -h 10.0.0.8 |
| -p | 指定端口 | psql -p 5433 |
| -W | 强制提示输密码 | psql -U admin -W |
| -c | 执行单条SQL后退出 | psql -U postgres -c “SELECT version();” |
| -f | 执行SQL脚本文件 | psql -U postgres -f backup.sql |
| -l | 列出所有数据库 | psql -U postgres -l |
psql和pgAdmin怎么选?命令行到底强在哪
很多初学者习惯用pgAdmin图形界面点鼠标,等到上服务器排查问题才发现图形界面根本用不了,只能靠命令行,行业共识认为,命令行工具是排障的底线能力,图形界面能做的一切操作,psql几乎都能覆盖,而且脚本化操作更高效。
对比维度更直观一些:
- 执行速度:psql秒开,pgAdmin需要加载Web服务或客户端
- 资源占用:psql几兆内存,pgAdmin动辄几百兆
- 自动化能力:psql适合写进shell脚本,pgAdmin只能手动操作
- 运维场景:服务器只剩SSH时,psql是唯一选择
如果你每天要和数据库打交道,建议把psql作为主力工具,pgAdmin留作可视化查看数据表格时的补充,另外提一个使用细节,psql执行完SQL语句可以用timing开启耗时统计,每次查询完会显示毫秒数,优化慢查询时很好用。
记住这篇文章的核心结论:psql登入数据库服务器的完整路径就是psql -U 用户名 -d 数据库名 -h 主机 -p 端口,连接失败优先查pg_hba.conf、postgresql.conf和防火墙,这三个关卡任何一个没打通都登不进去,把这条命令链刻在脑子里,PostgreSQL的大门随时为你敞开。
psql登录相关常见问题解答
psql提示fe_sendauth: no password supplied怎么办?
这说明客户端连接时没有提供密码,检查你是不是用了-W参数强制输入密码,或者.pgpass文件里的格式有误,直接用psql -U 用户名 -d 数据库名 -h 主机地址交互式输入密码是最稳妥的方式。
psql的默认端口是什么?改了端口怎么找?
PostgreSQL的默认端口是5432,行业内几乎不会改动,如果确实改了,可以登录到服务器查看postgresql.conf里的port配置项,或者用cat /etc/postgresql/版本号/main/postgresql.conf | grep port快速定位。
同一台服务器上装了多个PostgreSQL实例怎么办?
多实例场景必须用不同端口区分,连接时使用-p 端口号指向不同实例,同时确认每个实例的postgresql.conf和pg_hba.conf独立配置,你可以用pg_lsclusters命令查看本机所有实例及其端口和状态。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/718068.html





