=============================================================
宝塔PostgreSQL管理器报错解决方案
问题现象:“请求过程发现错误” & 数据库名连字符陷阱
=============================================================
一、问题现象
在宝塔面板的“数据库”管理界面创建 PostgreSQL 数据库时,使用带连字符的数据库名(例如 joypal-prod):
- 创建时提示错误,但宝塔数据库列表中仍显示该数据库。
- 后续访问 PostgreSQL 管理器,点击“数据库列表”等操作提示:
“请求过程发现错误!”
查看请求日志显示 500 错误:
POST /plugin?action=a&name=pgsql_manager&s=get_database_list
状态码: 500
二、问题原因分析
1. 宝塔面板的Bug
- 核心问题:宝塔面板在创建 PostgreSQL 数据库时,没有正确处理 PostgreSQL 的错误响应。
- 错误流程:
① 用户输入数据库名 "joypal-prod"
② 宝塔发送创建请求给 PostgreSQL
③ PostgreSQL 因命名规则(不允许连字符)拒绝并返回错误
④ 宝塔面板未正确处理错误,仍然执行了后续操作:
- 在 /www/server/panel/data/db/database.db 中插入记录
- 在 /www/server/panel/plugin/pgsql_manager_dbuser_info.json 中追加记录
⑤ 实际 PostgreSQL 中数据库创建失败
2. PostgreSQL 命名规则(与 MySQL 对比)
+------------------+----------------------+----------------------+
| 特性 | PostgreSQL | MySQL |
+------------------+----------------------+----------------------+
| 允许的字符 | 字母、数字、下划线 _ | 字母、数字、下划线 _、连字符 - |
| 正确示例 | joypal_prod ✅ | joypal-prod ✅ |
| 错误示例 | joypal-prod ❌ | (通常都支持) |
+------------------+----------------------+----------------------+
3. 数据不一致导致的问题
由于宝塔面板的 Bug,造成了数据不一致:
- PostgreSQL 实际数据库: ❌ 不存在(被拒绝创建)
- 宝塔数据库记录(database.db): ✅ 存在(错误插入)
- 宝塔用户信息文件(json): ✅ 存在(错误追加)
当 PostgreSQL 管理器读取用户信息文件时,由于文件格式问题(例如两行 JSON 对象连在一起缺少换行)或其他原因,导致解析失败,返回 500 错误。
三、解决方法
【步骤1】删除宝塔面板中的错误记录
运行以下命令删除 database.db 中的错误记录(将 joypal-prod 替换为您的实际问题数据库名): |
|