Search code examples
postgresqlpsql

PostgreSQL: Why psql can't connect to server?


I typed psql and I get this:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

I used sudo netstat -nlp | grep 5432 to see the status but nothing showed. And I searched online, somebody told me to modify pg_hba.conf but I can't locate this file. And I also tried this command sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432. It can't work.


Solution

  • The error states that the psql utility can't find the socket to connect to your database server. Either you don't have the database service running in the background, or the socket is located elsewhere, or perhaps the pg_hba.conf needs to be fixed.

    Step 1: Verify that the database is running

    The command may vary depending on your operating system. But on most *ix systems the following would work, it will search for postgres among all running processes

    ps -ef | grep postgres
    

    On my system, mac osx, this spits out

    501   408     1   0  2Jul15 ??         0:21.63 /usr/local/opt/postgresql/bin/postgres -D /usr/local/var/postgres -r /usr/local/var/postgres/server.log
    

    The last column shows the command used to start the server, and the options.

    You can look at all the options available to start the postgres server using the following.

    man postgres
    

    From there, you'd see that the options -D and -r are respectively the datadir & the logfilename.

    Step 2: If the postgres service is running

    Use find to search for the location of the socket, which should be somewhere in the /tmp

    sudo find /tmp/ -name .s.PGSQL.5432
    

    If postgres is running and accepting socket connections, the above should tell you the location of the socket. On my machine, it turned out to be:

    /tmp/.s.PGSQL.5432
    

    Then, try connecting via psql using this file's location explicitly, eg.

    psql -h /tmp/ dbname
    

    Step 3: If the service is running but you don't see a socket

    If you can't find the socket, but see that the service is running, Verify that the pg_hba.conf file allows local sockets.

    Browse to the datadir and you should find the pg_hba.conf file.

    By default, near the bottom of the file you should see the following lines:

    # "local" is for Unix domain socket connections only
    local       all       all       trust
    

    If you don't see it, you can modify the file, and restart the postgres service.