You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-contrib
    
    重新创建edix用户和数据库后再测试连接。

内容的提问来源于stack exchange,提问作者Zkittlez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:35:00