我试图在Windows 2008R2上运行pg_upgrade,但我收到了错误:
无法写入日志文件pg_upgrade_internal.log失败,退出
我在23216734看到了一个类似的Linux问题,它解释了问题与权限有关,但它对Windows没有帮助,因为我没有名为postgres
的用户
同样适用于提及postgres
用户的pg_upgrade docs:
RUNAS / USER:postgres" CMD.EXE"
但同样,我没有这样的用户,并且我正在尝试以管理员身份运行此命令,所以我不明白为什么我没有权限。我甚至试图做
RUNAS /USER:Administrator "CMD.EXE"
在新的命令提示符下运行pg_upgrade,但收到同样的错误。
另外,我不确定哪个目录需要权限?尝试将pg_upgrade_internal.log
写入?
更多详情:
我正在运行的命令是:
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
在提供错误的同一命令提示符下,我运行了以下命令并且它们都工作,在相应的目录中创建一个空文件,因此允许对传递给pg_upgrade的目录的写权限:
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
所以现在我比以前更加困惑......
更多细节:
我看到创建内部日志文件的命令是/src/bin/pg_upgrade/option.c#L101
定义了fopen_priv(INTERNAL_LOG_FILE, "a")
的调用
/src/bin/pg_upgrade/file.c#L243
但我不确定它要写的目录。如果我知道那么我可以检查该目录的权限。
有什么想法吗?
答案 0 :(得分:15)
因此/src/bin/pg_upgrade/file.c#L243 /* fopen() file with no group/other permissions */
上的源代码评论给了我一个想法。
我在C:\ temp创建了一个临时文件夹,并为 Everyone 提供了 Write 权限,然后从该目录运行了pg_upgrade,即
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
在我尝试从工作目录%PGSQL%\bin
运行pg_upgrade之前,该工作目录没有对Everyone的写入权限。
现在我不再收到cannot write to log file pg_upgrade_internal.log
错误了。
docs实际上说pg_upgrade requires write permission in the current directory.