windowspostgresqlwindows-server-2008-r2pg-upgrade

pg_upgrade on Windows cannot write to log file pg_upgrade_internal.log


I'm trying to run pg_upgrade on Windows 2008R2, but I'm getting the error:

cannot write to log file pg_upgrade_internal.log Failure, exiting

I saw a similar question for Linux at 23216734 which explains that the issue is with permissions, but it doesn't help with Windows as I do not have a user named postgres

Same goes for the pg_upgrade docs, which mention a postgres user:

RUNAS /USER:postgres "CMD.EXE"

But again, I do not have such a user, and am trying to run this command as Administrator so I don't understand why I would have no permission. I even tried to do

RUNAS /USER:Administrator "CMD.EXE"

And run pg_upgrade in the new command prompt, but am getting the same error.

Also, I am not sure which directory needs permissions? Where is the process trying to write pg_upgrade_internal.log to?


More details:

The command I'm running is:

C:\Apps\postgresql\pgsql-9.5.0\bin>pg_upgrade.exe --old-datadir=E:\PGSQL_data --new-datadir=E:\PGSQLData\pgsql-9.5 --old-bindir=C:\Apps\postgresql\pgsql-9.4.5.3\bin --new-bindir=C:\Apps\postgresql\pgsql-9.5.0\bin

From the same command prompt that gives the error I ran the following commands and they all worked, creating an empty file in the respective directories, so write permissions to the directories that are passed to pg_upgrade are allowed:

C:\Apps\postgresql\pgsql-9.5.0\bin>type nul > E:\PGSQL_data\_test_write_permission.txt
C:\Apps\postgresql\pgsql-9.5.0\bin>type nul > E:\PGSQLData\pgsql-9.5\_test_write_permission.txt
C:\Apps\postgresql\pgsql-9.5.0\bin>type nul > C:\Apps\postgresql\pgsql-9.4.5.3\bin\_test_write_permission.txt
C:\Apps\postgresql\pgsql-9.5.0\bin>type nul > C:\Apps\postgresql\pgsql-9.5.0\bin\_test_write_permission.txt

So now I'm even more puzzled than before...


Even more details:

I see that the command to create the internal log file is at /src/bin/pg_upgrade/option.c#L101

Which calls fopen_priv(INTERNAL_LOG_FILE, "a") defined at /src/bin/pg_upgrade/file.c#L243

But I'm not sure to which directory it is trying to write. If I would know that then I can check the permissions on that directory.

Any ideas?


Solution

  • So the source code comment at /src/bin/pg_upgrade/file.c#L243 /* fopen() file with no group/other permissions */ gave me an idea.

    I created a temp folder at C:\temp and gave Write permissions to Everyone, and then ran pg_upgrade from that directory, i.e.

    C:\temp>C:\Apps\postgresql\pgsql-9.5.0\bin\pg_upgrade.exe --old-datadir=E:\PGSQL_data --new-datadir=E:\PGSQLData\pgsql-9.5 --old-bindir=C:\Apps\postgresql\pgsql-9.4.5.3\bin --new-bindir=C:\Apps\postgresql\pgsql-9.5.0\bin

    Whereas before I was trying to run pg_upgrade from the working directory %PGSQL%\bin which did not have a Write permissions to Everyone.

    Now I don't get the cannot write to log file pg_upgrade_internal.log error anymore.

    The docs actually say pg_upgrade requires write permission in the current directory.