pg_upgrade parameter konfigurasi yang tidak dikenal "unix_socket_directory"

13

Saya mencoba untuk mengupgrade Postgresql dari 9.2 ke 9.3 di Fedora 18 menggunakan perintah ini sebagai pengguna postgres

$ pg_upgrade -b /bin -B /usr/pgsql-9.3/bin -d /var/lib/pgsql/data -D /var/lib/pgsql/9.3/data/ -j 2 -u postgres

Kesalahan dalam log

perintah: "/ bin / pg_ctl" -w -l "pg_upgrade_server.log" -D "/ var / lib / pgsql / data" -o "-p 50432 -b -c listen_addresses = '' -c unix_socket_permissions = 0700 -c unix_socket_directory = '/ var / lib / pgsql' "start >>" pg_upgrade_server.log "2> & 1 menunggu server untuk memulai .... FATAL: parameter konfigurasi yang tidak dikenal" unix_socket_directory ".... berhenti menunggu pg_ctl: tidak dapat memulai server

Seperti yang ditunjukkan oleh a_horse di komentar bahwa parameter digantikan oleh unix_socket_directories(jamak) di 9.3. Tetapi versi server yang dimulai adalah versi lama 9.2:

$ /bin/pg_ctl --version
pg_ctl (PostgreSQL) 9.2.4

Ada ide?

Clodoaldo
sumber
2
Parameter itu telah diubah namanya menjadi unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_with_no_name
@a_horse Perintah itu mencoba memulai versi 9.2. Periksa pertanyaan yang diperbarui
Clodoaldo
Untuk secara eksplisit melihat parameter mana yang digunakan dalam distribusi Anda, Anda dapat menjalankanpostgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

Jawaban:

25

Saya meretas masalah dengan menjalankan (sebagai root):

mv /usr/bin/pg_ctl{,-orig}
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> 
     /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl

Jalankan pg_upgradesebagaimana dimaksud, lalu urungkan retasan:

mv -f /usr/bin/pg_ctl{-orig,}

Masalahnya adalah bahwa pg_upgrade mengeksekusi program pg_ctrl dengan argumen yang menentukan file dalam "unix_socket_directory" lama daripada "unix_socket_directories" yang baru (perhatikan yang kedua adalah jamak). Retas ini mengubah nama asli /usr/bin/pg_ctlmenjadi /usr/bin/pg_ctl-orig, dan kemudian membuat skrip shell di tempatnya yang hanya memanggil program pg_ctl asli, meneruskan semua argumen dengan string "unix_socket_directory" yang diubah menjadi "unix_socket_directories".

Dalam bash, seseorang dapat mengubah bagian string, katakan dari barmenjadi bazdalam variabel $foo, dengan menggunakan ${foo/bar/baz}(perhatikan ini tidak mengubah variabel, tetapi mengembalikan konten yang dimodifikasi variabel). Array juga dapat digunakan ${x/y/z}untuk mengambil array dengan semua isinya diganti, sekaligus. Variabel $@adalah array yang berisi semua argumen yang diteruskan ke program / skrip / fungsi, sehingga skrip pg_ctl baru mengeksekusi yang lama dengan semua argumen berubah dari nama direktori lama ke yang baru.

Ziggy Crueltyfree Zeitgeister
sumber
3
ini benar-benar memungkinkan saya untuk meningkatkan postgres 9,2 ke 9,6 di Centos 7! Terima kasih!
sunsetjunks
2
Bekerja dengan baik untuk saya mulai dari 9,2 ke 9,6. Terima kasih banyak! Tidak tahu apa yang akan saya lakukan tanpa jawaban ini!
SebK
Bekerja untuk saya juga, mulai dari 9,2 menjadi 9,6 pada Centos 7
Gabriel Theron
1
Mungkin menjelaskan tipu daya bash hack dapat membantu orang lain mengatasi masalah serupa di masa mendatang. Ini adalah beberapa bash twisting yang serius :-)
xor007
Solusi luar biasa & elegan, bekerja dengan sempurna untuk
beralih
5

Saya punya masalah yang sama. Saya meningkatkan dari Fedora Repo 9.2.4 ke PGDG 9.3. Sumber masalahnya adalah Fedora mendukung perubahan parameter unix_socket_directoryke unix_socket_directories(lihat https://bugzilla.redhat.com/show_bug.cgi?id=853353 ).

Solusi saya adalah membangun kembali pg_upgradedari sumber, dengan pembaruan ke file contrib/pg_upgrade/server.c:199tempat pg_upgradememeriksa versi server:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 903) ?

, dalam kasus saya, saya mengubahnya ke:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 900) ?

(lihat file tambalan saya di sini ).

Ali Akbar
sumber
Bisakah Anda jelaskan mengapa ini memperbaiki masalah (untuk orang-orang seperti saya, yang tidak terlalu akrab dengan sumber-sumber (waspada terhadap pernyataan!))?
dezso
4
Sebagai per komentar @a_horse atas, PostgreSQL hulu telah berubah parameter unix_socket_directoryuntuk unix_socket_directoriesdi versi 9.3. Namun pengelola Fedora mendukungnya ke versi yang lebih rendah. Jadi, pg_upgradedari PGDG (PostgreSQL Global Development Group) YUM Repository mengharapkan versi 9.2.4 menerima unix_socket_directory, tetapi sebenarnya 9.2.4 dari Fedora YUM Repository menerima unix_socket_directories. Dalam hal ini, karena Fedora memundurkannya ke versi 9.0 dan seterusnya, saya mengubahnya untuk digunakan unix_socket_directoriesuntuk versi> = 9.0.
Ali Akbar