Hallo liebe PostgreSQL Experten,
ich habe ein Problem, an dem ich momentan fast am verzweifeln bin: Im Zuge der Installation der von mir entwickelten Software, ist es notwendig, eine lokal auf Windows 7 installierte PostgreSQL Datenbank von Version 9.1 auf 9.5 zu updaten. Für dieses Update habe ich ein Windows Powershell Skript geschrieben.
Mein Problem ist, dass der darin enthaltene “pg_upgrade.exe” Befehl innerhalb des Skriptes, aus mir unerklärlichen Gründen, fehlschlägt.
Es scheint sich um das gleiche Problem, wie hier
beschrieben zu handeln.
Das komische ist: Führe ich das Powershell Skript außerhalb des Installationsprozesses (z.B. über die Powershell ISE) aus, funktioniert das Upgrade problemlos. Nur während des Installationsvorganges, beim Start des Skriptes aus AdvancedInstaller heraus ergibt sich folgender Fehler:
Performing Consistency Checks
-----------------------------
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for reg* system OID user data types ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for invalid "line" user columns ok
Creating dump of global objects ok
Creating dump of database schemas
postgres
spaceserver
template1
ok
Checking for presence of required libraries ok
Checking database user is the install user ok
Checking for prepared transactions ok
If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.
Performing Upgrade
------------------
Analyzing all rows in the new cluster ok
Freezing all rows on the new cluster ok
Deleting files from new pg_clog ok
Copying old pg_clog to new server ok
Setting next transaction ID and epoch for new cluster ok
Deleting files from new pg_multixact/offsets ok
Copying old pg_multixact/offsets to new server ok
Deleting files from new pg_multixact/members ok
Copying old pg_multixact/members to new server ok
Setting next multixact ID and offset for new cluster ok
Resetting WAL archives ok
*failure*
Der oben verlinkte Beitrag aus der PostgreSQL Mailing Liste sagt etwas über unzureichende Rechte. Allerdings führe ich das Powershell Skript bereits mit Administrator Rechten aus. Dementsprechend müsste der “pg_upgrade.exe” Befehl diese Rechte erben. Im Falle der Ausführung aus der Powershell ISE tut er das scheinbar auch.
Im Logfile “pg_upgrade_server_start.log” steht dann das folgende:
-----------------------------------------------------------------
pg_upgrade run on Thu Oct 20 18:45:56 2016
-----------------------------------------------------------------
-----------------------------------------------------------------
pg_upgrade run on Thu Oct 20 18:45:56 2016
-----------------------------------------------------------------
command: "C:\Users\Test\AppData\Local\Temp\backup_os_20161020184439\postgresql-9.3\bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "C:\Users\Test\AppData\Local\Temp\backup_os_20161020184439\postgresql-9.3\data" -o "-p 50432 -c autovacuum=off -c autovacuum_freeze_max_age=2000000000 " start >> "pg_upgrade_server_start.log" 2>&1
waiting for server to start.... done
server started
command: "C:\Users\Test\AppData\Local\Temp\backup_os_20161020184439\postgresql-9.3\bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "C:\Users\Test\AppData\Local\Temp\backup_os_20161020184439\postgresql-9.3\data" -o "-p 50432 -b " start >> "pg_upgrade_server_start.log" 2>&1
waiting for server to start.... done
server started
command: "C:\B.Braun Space\OnlineSuite\pgsql\bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "C:\B.Braun Space\OnlineSuite\pgsql\data" -o "-p 50432 -b -c synchronous_commit=off -c fsync=off -c full_page_writes=off " start >> "pg_upgrade_server_start.log" 2>&1
waiting for server to start.... done
server started
command: "C:\B.Braun Space\OnlineSuite\pgsql\bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "C:\B.Braun Space\OnlineSuite\pgsql\data" -o "-p 50432 -b -c synchronous_commit=off -c fsync=off -c full_page_writes=off " start >> "pg_upgrade_server_start.log" 2>&1
waiting for server to start.... stopped waiting
Hier der Auszug aus dem Powershell Skript, mit dem ich den pg_upgrade.exe Befehl ausführe:
# Re-Write old pg_hba.conf file to allow all users to connect withot password
$pgHbaConfFileStr = Join-Path $oldPgDataFolder "pg_hba.conf"
$pgHbaConfFileBakStr = Join-Path $oldPgDataFolder "pg_hba.conf.bak"
if(-not (Test-Path $pgHbaConfFileStr)) {
Write-Output "Error: Unable to find pg_hba.conf in $oldPgDataFolder"
Exit 1
}
#Backup pg_hba.conf to pg_hba.conf.bak
Move-Item $pgHbaConfFileStr $pgHbaConfFileBakStr -Force
$hbaConfText = @("host all all 127.0.0.1/32 trust","host all all ::1/128 trust")
[IO.File]::WriteAllLines($pgHbaConfFileStr, $hbaConfText)
#Set environment variables for pg_upgrade.exe
$ENV:PGBINOLD=$oldPgBinFolder
$ENV:PGDATAOLD=$oldPgDataFolder
$ENV:PGBINNEW=$pgBinDir
$ENV:PGDATANEW=$pgDataDir
$ENV:PGUSER="postgres"
$ENV:PGPASSWORD=$postgreAdminPwd
Write-Output "Executing pg_upgrade command ..."
& $pgBinDir\pg_upgrade.exe --link
Ich hoffe wirklich, dass ihr mir weiterhelfen könnt, denn ich bin wirklich am Ende mit meinem Latein.
Grüße, André