万维IIP通栏广告位当云伯乐 CDN华纳云
Sub2API2026-07-26文案编辑:好主机测评12 阅读

Sub2API部署记录:PostgreSQL数据库连接异常与主动断开问题解决

本文摘要Sub2API部署过程中遇到PostgreSQL数据库异常,Navicat可以访问5432端口但连接被服务器关闭。本文整理PostgreSQL监听配置、pg_hba.conf权限、数据库授权等排查方法。
丽萨主机
AD:
【广告招商】文章正文文字广告位开放合作

在宝塔面板里面先安装pgsql的管理器,然后在配置里面增加:

listen_addresses = '*'

file

file

增加下面一行:

host    all    all    0.0.0.0/0    md5

如果连接上pgsql数据库之后,报错:

ERROR:  permission denied for table channel_monitor_histories

这个报错已经说明 PostgreSQL 连接问题解决了,现在进入了数据库权限问题

ERROR: permission denied for table channel_monitor_histories

意思是:

当前连接的 PostgreSQL 用户没有 channel_monitor_histories 这个表的访问权限。

你现在登录的用户应该是:

sub2api

但是这个表可能属于另一个用户(例如 postgres 或其他 owner)。

1. 先查看表属于谁

进入 PostgreSQL:

/www/server/pgsql/bin/psql -U postgres -d sub2api

执行:

\dt channel_monitor_histories

你会看到类似:

 Schema |          Name          | Type  | Owner
--------+------------------------+-------+--------
 public | channel_monitor_histories | table | postgres

如果 Owner 是:

postgres

而你程序使用:

sub2api

就会没有权限。

2. 直接给 sub2api 全库权限(推荐)

进入数据库:

/www/server/pgsql/bin/psql -U postgres

执行:

GRANT ALL PRIVILEGES ON DATABASE sub2api TO sub2api;

然后:

\c sub2api

执行:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sub2api;

再执行:

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO sub2api;

3. 如果是 Sub2API 项目,建议直接改 owner

因为这类 Laravel / ThinkPHP 项目经常需要:

  • select
  • insert
  • update
  • delete
  • sequence 自增

执行:

ALTER TABLE channel_monitor_histories OWNER TO sub2api;

如果很多表都是 postgres:

可以一次性:

REASSIGN OWNED BY postgres TO sub2api;

4. 新建表以后自动继承权限

避免以后迁移再次报错:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON TABLES TO sub2api;

以及:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON SEQUENCES TO sub2api;

5. 如果是宝塔导入数据库导致

宝塔导入 .sql 很容易出现:

表 owner = postgres
应用用户 = sub2api

然后运行时报:

permission denied

最简单修复:

/www/server/pgsql/bin/psql -U postgres -d sub2api

执行:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sub2api;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO sub2api;

你现在可以先执行:

\dt channel_monitor_histories

把输出贴一下,我可以确认是不是 owner 不一致。这个和你刚才 Navicat 连接已经没有关系了,属于数据库权限。

postgres=# GRANT ALL PRIVILEGES ON DATABASE sub2api TO sub2api;
GRANT
postgres=# \c sub2api
You are now connected to database "sub2api" as user "postgres".

很好,现在已经进入正确方向了。

你执行:

GRANT ALL PRIVILEGES ON DATABASE sub2api TO sub2api;

成功:

GRANT

说明数据库级权限已经给了。

但是注意:

PostgreSQL 的数据库权限 ≠ 表权限

你现在还需要给 sub2api 用户下面这些权限,否则之前的:

permission denied for table channel_monitor_histories

还会继续出现。

你现在已经在:

sub2api=# 

执行下面:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sub2api;

然后:

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO sub2api;

再执行:

GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO sub2api;

然后建议直接修复 owner(Sub2API 这种项目更推荐):

查看当前表 owner:

\dt channel_monitor_histories

大概率你会看到:

Owner
------
postgres

如果是 postgres,执行:

ALTER TABLE channel_monitor_histories OWNER TO sub2api;

如果这是整个 Sub2API 数据库都是 postgres 导入的,可以一次性改:

REASSIGN OWNED BY postgres TO sub2api;

然后:

ALTER SCHEMA public OWNER TO sub2api;

最后退出:

\q

重启你的 Sub2API 服务。

为了确认权限是否完全正常,可以切换用户测试:

/www/server/pgsql/bin/psql -U sub2api -d sub2api

进入后执行:

SELECT * FROM channel_monitor_histories LIMIT 1;

如果能返回数据,权限问题就彻底解决。

另外提醒一下:如果这是宝塔迁移/恢复出来的 PostgreSQL,后续可能还会遇到:

permission denied for sequence xxx_id_seq

所以 SEQUENCES 那条一定要执行。你现在直接把三条 GRANT 执行即可。


广告招商文章内容详情页下 · 优质席位开放中合作咨询
咨询1 位在线

广告投放、资源交换、友情链接