最近在帮公司新人搭PostgreSQL学习环境,发现几个经典报错反复出现。每次都是百度一圈、试了半天才解决。索性整理出来,利人利己。
如果你是刚接触PostgreSQL的运维、开发或者学生,下面这几个报错你大概率会遇见。收藏好,能省不少时间。
坑一:FATAL: password authentication failed for user "postgres"
场景:装完PG,用psql -U postgres想登进去,结果死活提示密码错误。
原因:PostgreSQL安装时默认的认证方式是peer或trust(取决于操作系统),不是md5密码认证。你设的那个系统用户密码,和数据库里的角色密码是两回事。
排查思路:
-
先用操作系统用户免密登录(Linux下):
bash
sudo -u postgres psql
-
进去之后,给
postgres角色重新设置一个密码:sql
ALTER USER postgres WITH PASSWORD '你的新密码';
-
检查
pg_hba.conf文件(通常在/etc/postgresql/版本号/main/或数据目录下),确保本地连接的认证方法不是peer:text
# "local" is for Unix domain socket connections only local all all md5
-
重启PG服务:
bash
sudo systemctl restart postgresql
再试一次,psql -U postgres -W,输入刚才设的密码,应该就进去了。
坑二:FATAL: no pg_hba.conf entry for host "192.168.x.x"
场景:你在本地用Navicat或DBeaver连虚拟机里的PG,或者另一台服务器想远程连接,结果报这个错。
原因:PostgreSQL默认只允许本地连接。任何来自其他IP的请求,必须明确在pg_hba.conf里放行。
解决方法:
-
编辑
pg_hba.conf,添加一行:text
# 允许192.168.1.0/24网段的所有用户通过密码访问所有数据库 host all all 192.168.1.0/24 md5
-
同时要修改
postgresql.conf,让PG监听所有网络接口:text
listen_addresses = '*'
-
重启服务。
注意:如果服务器上有防火墙,别忘了开放5432端口:
bash
sudo ufw allow 5432/tcp # Ubuntu # 或 sudo firewall-cmd --add-port=5432/tcp --permanent # CentOS/RHEL
坑三:psql: error: connection to server at "127.0.0.1", port 5432 failed: Connection refused
场景:本机连本机,端口没错,就是拒绝连接。
原因分析优先级:
-
PG服务压根没起来。
bash
systemctl status postgresql
如果显示
inactive (dead),直接启动它。 -
端口被改了。
有些发行版(比如某些Docker镜像)会把默认端口改成5433或别的。去postgresql.conf里确认port = 5432。 -
监听地址不对。
如果listen_addresses = 'localhost',那么用127.0.0.1可以,但用本机实际IP(比如192.168.x.x)就不行。按坑二的方法改成'*'。 -
PG安装在非标准路径,服务脚本没注册。
源码编译安装时常见。直接找到pg_ctl启动:bash
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data start
坑四:ERROR: permission denied for table xxx
场景:你创建了一个新用户app_user,也授权了,但一查表就报权限不足。
原因:PostgreSQL的权限体系比MySQL细得多。授权不仅要给表的权限,还要给Schema和数据库的权限。
正确的授权姿势:
sql
-- 1. 授予数据库连接权限 GRANT CONNECT ON DATABASE mydb TO app_user; -- 2. 授予Schema使用权限(public是默认schema) GRANT USAGE ON SCHEMA public TO app_user; -- 3. 授予表权限(这里给所有表的SELECT权限) GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_user; -- 4. 别忘了以后新建的表也要自动授权 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO app_user;
做完这四步,app_user才能愉快地查询。
坑五:ERROR: relation "xxx" does not exist
场景:表明明存在,\dt也能看到,但查询就报不存在。
最可能的原因:大小写问题。
PostgreSQL会把不加双引号的表名、列名自动转换成小写。
sql
-- 你建表时用了双引号,保留了大小写 CREATE TABLE "MyTable" (id int); -- 查询时必须加双引号,且大小写完全匹配 SELECT * FROM "MyTable"; -- 正确 SELECT * FROM MyTable; -- 错误,实际去查找mytable
建议:建表时尽量避免使用双引号,全部用小写加下划线命名(如my_table),省去无数麻烦。
写在最后:从填坑到系统化
上面这五个坑填平了,日常开发测试基本够用了。但如果你想系统地掌握PostgreSQL,不再每次遇到问题都临时百度,我建议你花一顿饭钱把基础打牢。
我自己带新人的时候会让他们先过一遍PGCCC的PCA认证课程。原因很简单:
-
体系完整:从安装配置、用户权限、SQL基础到备份恢复,覆盖了一个初级DBA/开发必须掌握的80%核心操作。
-
国家级证书:工业和信息化部教育与考试中心颁发,官网可查。对于学生。和刚入行的来说,简历上有这个比写“熟悉PostgreSQL”有说服力得多
#PostgreSQL报错 #PostgreSQL安装 #数据库学习 #PCA认证 #PGCCC #国家级证书 #程序员考证

1330

被折叠的 条评论
为什么被折叠?



