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?


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.


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 ).


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.