Today I ran into another strange issue with PostgreSQL installation on Windows. It turned out not to be a problem with the installer; instead it was a form of broken Windows installation that I hadn’t seen before, so I thought I’d write it up.
The installer already contains checks for several kinds of broken Windows install. For example, it tests to make sure that %TEMP%
is writeable, and to makes sure the vbscript interpreter actually works. These were both the cause of frequent problem reports to the mailing lists in the past.
This is a less common issue, though it’s clearly turned up in the wild before. It turns out that some – probably rare – Windows installs have an incorrect %COMSPEC%
environment variable. This causes popen
to fail with the wonderfully useful error message: "No error"
when initdb
tries to execute the PostgreSQL backend. The message displayed to the user is:
Problem running post-install step. Installation may not complete correctly. The database cluster initialisation failed.
… which can be caused by several different issues, of which this is only one.
If this is your issue, when you examine the installer log file, %TEMP%\postgresql-installer.log
, you’ll find that it contains:
Executing cscript //NoLogo "C:\Program Files\PostgreSQL\9.2/installer/server/initcluster.vbs" "NT AUTHORITY\NetworkService" "postgres" "****" "C:\Program Files\PostgreSQL\9.2" "C:\Program Files\PostgreSQL\9.2\data" 5432 "DEFAULT"
Script exit code: 1
then a bit further down in the log you’ll see:
creating template1 database in C:/Program Files/PostgreSQL/9.2/data/base/1 ... initdb: could not execute command ""C:/Program Files/PostgreSQL/9.2/bin/postgres.exe" --boot -x1 -F ": No error
If so, check to make sure your ComSpec
environment variable is valid. Open a command prompt and run:
"%COMSPEC%" /C "echo test ok"
If it prints “test ok” then it’s likely fine and the issue is probably something else. If it fails, you’ve found the problem. Either way, check the value with:
echo %COMSPEC%
It should print something like:
C:\Windows\system32\cmd.exe
where C:\Windows
is the location of your Windows install as shown by echo %WINDIR%
or echo %SYSTEMROOT%
.
In the case of the issue I was investigating it was instead:
%SystemRoot%\system32\cmd.exe;
It’s valid, though not standard, to have %SYSTEMROOT%
instead of C:\Windows
, so that wasn’t the issue. The problem is the trailing semicolon (‘;’). This single extra character was causing initdb
to fail to launch postgres.exe
during database cluster creation because the popen(...)
call was failing. The popen
call requires that ComSpec
point to a valid shell.
The error was fixed by correcting the COMSPEC
environment variable. We opened the System control panel, opened Advanced system settings, and in the Environment Variables section under System variables edited ComSpec
to remove the trailing semicolon.
One character.