Linux虚拟机中PostgreSQL内存不足致连接失败问题求助
PostgreSQL连接失败(CONNECTION_BAD)排查方案
我正在开发一款支持多工作区的大学图像编辑器项目,创建工作区时触发addProject函数,出现PostgreSQL连接失败问题,conn状态为CONNECTION_BAD。此前程序首次启动时已成功创建edix用户和数据库,且连接无异常,当前运行环境为M1 Mac上的Parallels Kali Linux 2023.2 ARM64,怀疑是虚拟机内存管理或PostgreSQL配置问题,已检查配置文件未发现异常。
出问题的addProject函数代码如下:
int addProject(char *name, char *path, char *comp, char *TPP, char *TUP, char *modEx, uint TTS, bool Backup) { PGconn *conn = PQconnectdb("host=localhost dbname=edix user=edix password="); if (PQstatus(conn) != CONNECTION_OK) { PQfinish(conn); handle_error("Errore di connessione a postgres: %s\n", PQerrorMessage(conn)); } char query[1024]; sprintf(query, "BEGIN;\n" "DO $$\n" "DECLARE\n" "settingsId INT;\n" "BEGIN\n" "INSERT INTO Project (Name, CDate, MDate, Path, Settings) VALUES ('%s', NOW(), NOW(), '%s', -1);\n" "INSERT INTO Settings (TUP, Mode, Comp, TTS, TPP, Backup, Project) VALUES ('%s', '%s', '%s', %d, '%s', %s, '%s') RETURNING Id INTO settingsId;\n" "UPDATE Project SET Settings = settingsId WHERE Name = '%s';\n" "END $$;\n" "COMMIT;\n", name, path, TUP, modEx, comp, TTS, TPP, Backup ? "TRUE" : "FALSE", name, name); D_PRINT("Adding project to Postgres...\n"); PGresult *res = PQexec(conn, query); if (PQresultStatus(res) != PGRES_COMMAND_OK) { const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE); if (strcmp(sqlstate, "23505") == 0) fprintf(stderr, RED "POSTGRES Error:" RESET " Questo progetto già esiste!\n"); else fprintf(stderr, "Errore nell'esecuzione della query: %s\n", PQerrorMessage(conn)); PQclear(res); PQfinish(conn); return 1; } PQclear(res); PQfinish(conn); return 0; }
排查步骤
- 验证PostgreSQL服务状态:
在虚拟机终端执行sudo systemctl status postgresql,确认服务是否正常运行。若未启动,执行sudo systemctl start postgresql,并设置开机自启sudo systemctl enable postgresql。 - 手动测试数据库连接:
执行psql -h localhost -U edix -d edix,直接测试连接是否成功。若失败,根据报错定位问题(比如密码验证、权限)。注意连接字符串密码为空,需确认edix用户允许无密码本地登录——检查/etc/postgresql/{版本号}/main/pg_hba.conf,本地连接的认证方式是否为trust或peer。 - 检查虚拟机内存限制:
打开Parallels虚拟机设置,确认分配给Kali Linux的内存至少2GB(PostgreSQL运行需要基础内存)。若不足,调高后重启虚拟机和PostgreSQL服务。 - 查看PostgreSQL日志:
日志路径通常为/var/log/postgresql/postgresql-{版本号}-main.log,查看最近的连接失败记录,里面会有详细错误原因(如拒绝连接、认证失败),这是最直接的排查依据。 - 调整连接字符串:
尝试将localhost替换为127.0.0.1,避免DNS解析问题。同时执行psql -U postgres -c "SELECT datname FROM pg_database;",确认edix数据库存在。 - 排查ARM64兼容性:
若上述步骤无效,尝试重新安装PostgreSQL:
重新创建sudo apt purge postgresql* sudo apt update && sudo apt install postgresql postgresql-contribedix用户和数据库后再测试连接。
内容的提问来源于stack exchange,提问作者Zkittlez
相关产品推荐
相关产品推荐

