使用psql无法连接数据库,并报错 FATAL:53300

本文详细解析了使用psql连接数据库时出现的FATAL:53300错误,包括错误产生的两种情况:普通用户连接已满和数据库连接总数已满。文章提供了检查数据库剩余连接数和超级用户保留连接数的方法,以及关闭空闲连接和调整最大连接数的解决方案。

012269101

使用psql无法连接数据库,并报错 FATAL:53300

目录

环境

症状

问题原因

解决方案

相关文档

报错编码

环境

系统平台:N/A

版本:4.1.1

症状

1)

psql: FATAL:  53300: remaining connection slots are reserved for non-replication superuser connections

 

2)

psql: FATAL:  53300: sorry, too many clients already    

问题原因

1)

普通用户的连接已满,保留用于非复制的超级用户连接。

当数据库剩余连接数<=为超级用户保留的连接数时,使用非超级用户连接数据库报错如上,此时只能使用超级用户连接数据库。

 

2)

数据库连接已满,无法建立新的连接。

 

 

解决方案

如何查看数据库剩余连接数:

select max_conn-now_conn as resi_conn from (select setting::int8 as max_conn,(select count(*) from pg_stat_activity) as now_conn from pg_settings where name = 'max_connections') t;

 

如何查看为超级用户保留的连接数:

show superuser_reserved_connections;

 

1、 关闭空闲连接。

select datname,pid,application_name,state from pg_stat_activity;

--查看目前所有的连接的进程id、应用名称、状态。

 

select pg_terminate_backend(pid) from pg_stat_activity;

--通过pid终止空闲连接

 

2、调整数据库最大连接数,并重启生效。

<think> 我们正在解决CentOS系统中切换为xx系统用户(pgsql中存在同名用户xx)执行psql报错的问题。错误信息为: psql: error: connection to server on socket "/run/postgresql/.s.PGSQL.5432" failed: FATAL: database "xx" does not exist 同时,我们还关心为什么在pgsql中用户xx没有任何权限。 ### 问题分析 #### 1. 错误原因分析 - 当使用系统用户`xx`执行`psql`命令时,`psql`默认尝试连接以下信息: - 数据库名:与当前系统用户名相同(即`xx`) - 用户名:与当前系统用户名相同(即`xx`) - 使用默认的Unix域套接字(如`/run/postgresql/.s.PGSQL.5432`)连接 错误信息`FATAL: database "xx" does not exist`表明,PostgreSQL服务器中不存在名为`xx`的数据库。 #### 2. 用户权限问题 - 在PostgreSQL中,用户(角色)和数据库是独立的实体。创建用户不会自动创建同名的数据库。 - 用户`xx`在PostgreSQL中是否存在?如果存在,可能没有被授予任何权限,或者没有被赋予登录权限。 ### 解决步骤 #### 步骤1:验证PostgreSQL服务状态 首先确保PostgreSQL服务正在运行: ```bash sudo systemctl status postgresql ``` 如果未运行,启动服务: ```bash sudo systemctl start postgresql ``` #### 步骤2:以超级用户身份连接PostgreSQL 使用`postgres`系统用户(通常具有超级用户权限)连接数据库: ```bash sudo -u postgres psql ``` #### 步骤3:检查是否存在名为`xx`的数据库psql命令行中执行: ```sql \l ``` 查看数据库列表,确认是否存在名为`xx`的数据库。 #### 步骤4:检查用户`xx`是否存在及其权限 在psql命令行中执行: ```sql \du ``` 查看用户`xx`是否存在,以及其属性(如是否可以登录、是否有超级用户权限等)。 #### 步骤5:创建数据库(如果不存在) 如果数据库`xx`不存在,需要创建: ```sql CREATE DATABASE xx; ``` #### 步骤6:授予用户`xx`权限 确保用户`xx`拥有连接数据库`xx`的权限: ```sql GRANT ALL PRIVILEGES ON DATABASE xx TO xx; ``` 如果需要,也可以将用户设置为数据库的所有者: ```sql ALTER DATABASE xx OWNER TO xx; ``` #### 步骤7:设置用户`xx`的登录权限(如果尚未设置) 如果用户`xx`不能登录,需要修改其属性: ```sql ALTER ROLE xx WITH LOGIN; ``` ### 连接测试 完成上述步骤后,切换回系统用户`xx`,再次尝试连接: ```bash psql ``` 或者显式指定数据库(如果不想创建数据库`xx`,可以连接到默认数据库`postgres`): ```bash psql -d postgres -U xx ``` ### 关于用户xx在PostgreSQL中没有权限的原因 - 默认情况下,新创建的用户没有任何权限(除了连接数据库的权限,如果被授予的话)。 - 必须显式授予用户对数据库的权限(如步骤6)。 - 如果没有将用户设置为数据库的所有者或者没有授予权限,则该用户无法数据库中执行任何操作。 ### 相关问题 §§相关问题§§ 1. 如何在PostgreSQL中创建新用户设置密码? 2. 如何配置PostgreSQL以允许远程连接? 3. PostgreSQL中角色(用户)和数据库的关系是什么? 4. 如何备份和恢复PostgreSQL数据库? 通过以上步骤,应该可以解决数据库不存在和用户权限的问题。如果问题仍然存在,请检查PostgreSQL的日志文件以获取更多信息(通常位于`/var/log/postgresql/`或`/var/lib/pgsql/data/pg_log/`目录下)[^1][^2][^3]。 </think> ### 问题分析:PostgreSQL连接错误与权限问题 #### 1. **错误原因:"database 'xx' does not exist"** 当您以系统用户`xx`身份执行`psql`时,PostgreSQL会尝试连接以下默认配置: - **数据库名**:默认与当前系统用户名相同(即`xx`) - **用户名**:默认与当前系统用户名相同(即`xx`) - **连接方式**:通过Unix域套接字`/run/postgresql/.s.PGSQL.5432` 错误提示表明: 1. PostgreSQL服务器中**不存在名为`xx`的数据库** 2. 但可能存在名为`xx`的用户(否则会提示用户不存在) $$\text{连接流程} = \begin{cases} \text{系统用户} \rightarrow \text{自动匹配同名数据库} \\ \text{失败} \rightarrow \text{FATAL: database "xx" does not exist} \end{cases}$$ #### 2. **用户权限缺失原因** 即使用户`xx`存在于PostgreSQL中,也可能没有权限: - **未分配权限**:新建用户默认无任何权限 - **未设置LOGIN属性**:用户可能被创建为角色而非可登录用户 - **密码认证问题**:如果配置了密码认证但未设置密码 - **连接限制**:可能被`pg_hba.conf`限制连接权限[^2] ### 完整解决方案 #### 步骤1:创建同名数据库 ```bash # 以postgres用户登录 sudo -u postgres psql # 创建与系统用户同名的数据库 CREATE DATABASE xx OWNER xx; ``` #### 步骤2:验证用户权限 ```sql -- 检查用户属性 SELECT rolname, rolcanlogin, rolcreatedb FROM pg_roles WHERE rolname = 'xx'; -- 授予基础权限(示例) GRANT CONNECT ON DATABASE xx TO xx; GRANT USAGE ON SCHEMA public TO xx; GRANT SELECT ON ALL TABLES IN SCHEMA public TO xx; ``` #### 步骤3:修复连接配置 ```diff # 修改pg_hba.conf sudo nano /var/lib/pgsql/data/pg_hba.conf # 添加本地套接字连接权限 + local all xx peer ``` #### 步骤4:重启服务使配置生效 ```bash sudo systemctl restart postgresql ``` #### 步骤5:测试连接 ```bash # 切换系统用户 su - xx # 现在应能正常连接 psql ``` ### 关键配置说明 | 配置项 | 作用 | 典型值 | |--------|------|--------| | `OWNER` | 数据库所有者 | `CREATE DATABASE xx OWNER xx;` | | `peer`认证 | 系统用户映射 | `pg_hba.conf`中的`local ... peer`[^2] | | `rolcanlogin` | 登录权限 | `ALTER ROLE xx WITH LOGIN;` | | 默认数据库 | 自动匹配规则 | 与系统用户名相同 | ### 常见问题排查 1. **用户存在但无法登录** ```sql ALTER ROLE xx WITH LOGIN; -- 启用登录权限 ALTER ROLE xx WITH PASSWORD 'new_password'; -- 设置密码 ``` 2. **套接字文件缺失** ```bash # 检查套接字是否存在 ls -l /run/postgresql/.s.PGSQL.5432 # 重启服务重建套接字 sudo systemctl restart postgresql ``` 3. **连接被拒绝** ```bash # 检查pg_hba.conf权限配置 grep 'local.*xx' /var/lib/pgsql/data/pg_hba.conf ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值