Macos – “FATAL: lock file “” already exists”


I just reinstalled postgres via brew install postgres

I ran initdb /usr/local/var/postgres -E utf8 but got this:

The files belonging to this database system will be owned by user "atal421".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default text search configuration will be set to "english".

initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".

so, I rm -rf the postgres folder and ran it again:

 initdb /usr/local/var/postgres -E utf8

it said everything was okay:

Success. You can now start the database server using:

    postgres -D /usr/local/var/postgres

so, I ran that command and got:

postgres -D /usr/local/var/postgres

FATAL:  lock file "" already exists
HINT:  Is another postmaster (PID 13731) running in data directory "/usr/local/var/postgres"?

Now when I look at my Activity Monitor I can see 6 instances of postgress.

How do I fix this?

Best Answer

Public service announcement: never delete Really. Great way to get data corruption.

You already had PostgreSQL installed, and you deleted the data dir without stopping the running server. So you now have some orphan PostgreSQL server processes that are managing data files that've been deleted, so they're no longer accessible in the file system and will be fully deleted when the last open file handle to them is closed. You can't use pg_ctl to shut the server down like normal because you've deleted the cluster datadir, so you must simply kill the processes. Kill the postmaster (do not use kill -9, just an ordinary kill will do) and the rest will shut down too.

You will then be able to start a new server in the datadir against the freshly initdb'd data.

It is highly likely that you will experience conflicts down the track unless you uninstall the other older version of PostgreSQL.

In a nutshell:

cat /usr/local/var/postgres/

Note down the number on the first line, which is the pid of the postmaster.

Verify with ps that the pid is that of a postgres postmaster.

Kill the postmaster process with the following command, replacing 'PID' with the number you have noted down. Again, do not use kill -9 or kill -KILL, just use a plain kill, i.e. a SIGTERM:

kill PID

If the pid is not that of a postgres postmaster, manually kill any postgres backends that may still be running, verify that they are no longer running, and only then remove (You must also verify that the is not on shared storage where the server could be running on some other VM/host).

Related Question