pg_upgrad अनारक्षित कॉन्फ़िगरेशन पैरामीटर "unix_socket_directory"


13

मैं Postgresql को Fedora 18 में 9.2 से 9.3 तक अपग्रेड करने की कोशिश कर रहा हूं, इस कमांड को पोस्टग्रेज उपयोगकर्ता के रूप में उपयोग कर रहा है

$ 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

लॉग में त्रुटि

कमांड: "/ bin / pg_ctl" -w "-l" pg_upgrade_server.log "-D" / var / lib / pgsql / data "-o" -p 50432 -b -c सुनो -addresses = '' -c unix_socket_permissions = 0700 -c unix_socket_directory = '/ var / lib / pgsql' "start >>" pg_upgrad_server.log "2> और 1 को सर्वर के शुरू होने का इंतज़ार .... FATAL: अपरिचित कॉन्फ़िगरेशन पैरामीटर" unix_socket_directory ".... प्रतीक्षा कर रहा pg_ctl: प्रारंभ नहीं कर सका। सर्वर

जैसा कि टिप्पणी में a_horse द्वारा बताया गया था कि पैरामीटर को unix_socket_directories9.3 में (बहुवचन) द्वारा प्रतिस्थापित किया गया था । लेकिन सर्वर संस्करण शुरू किया जा रहा है पुराने 9.2:

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

कोई विचार?


2
उस पैरामीटर का नाम बदल दिया गया है unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_with_no_name

@a_horse यह आदेश 9.2 संस्करण शुरू करने का प्रयास करता है। अद्यतित प्रश्न की जाँच करें
क्लोडोल्डो

स्पष्ट रूप से देखने के लिए जो पैरामीटर अपने वितरण में इस्तेमाल किया जा रहा है, तो आप चला सकते हैंpostgres --describe-config | grep -o 'unix_socket_director\w*'
रान्डेल

जवाबों:


25

मैंने समस्या को हैक करके (रूट के रूप में):

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

pg_upgradeइरादा के अनुसार चलाएं , फिर हैक को पूर्ववत करें:

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

समस्या यह है कि pg_upgrad नए "unix_socket_directories" (नोट बहुवचन है) के बजाय पुराने "unix_socket_directory" के बजाय फ़ाइलों को निर्दिष्ट करने वाले तर्कों के साथ प्रोग्राम pg_ctrl निष्पादित करता है। यह हैक मूल /usr/bin/pg_ctlका नाम बदल देता है /usr/bin/pg_ctl-orig, और फिर इसके स्थान पर एक शेल स्क्रिप्ट बनाता है जो मूल pg_ctl प्रोग्राम को कॉल करता है, सभी तर्कों को "unix_socket_directories" में बदलकर "unix_socket_directory" में बदल जाता है।

बैश में, एक एक स्ट्रिंग के एक हिस्से को बदल सकते हैं, से कहते हैं कि barकरने के लिए bazएक चर में $foo, का उपयोग करके ${foo/bar/baz}(ध्यान दें कि यह चर परिवर्तन नहीं होता है, बल्कि वेरिएबल का संशोधित सामग्री देता है)। Arrays का उपयोग ${x/y/z}एक सरणी को पुनः प्राप्त करने के लिए किया जा सकता है , इसकी सभी सामग्रियों को एक साथ, एक बार में। चर $@वह सरणी है जिसमें प्रोग्राम / स्क्रिप्ट / फंक्शन में पास की गई सभी दलीलें होती हैं, इसलिए नई pg_ctl स्क्रिप्ट पुरानी को सभी निर्देशिकाओं के साथ पुराने निर्देशिका नाम से बदलकर नया निष्पादित करती है।


3
यह वास्तव में मुझे Centos 7 पर 9.2 से 9.6 पोस्टग्रेड अपग्रेड करने की अनुमति देता है! धन्यवाद!
सूर्यास्तजंक

2
मेरे लिए 9.2 से 9.6 के बीच काम करना बहुत अच्छा रहा। बहुत बहुत धन्यवाद! इस जवाब के बिना मैंने क्या किया होगा, इसका कोई अंदाजा नहीं है!
SebK

मेरे लिए भी काम किया, Centos 7 पर 9.2 से 9.6 तक
गैब्रियल थेरॉन

1
हो सकता है कि बैश हैक की चालाकी समझाने से भविष्य में इसी तरह की समस्याओं से निपटने में दूसरों की मदद की जा सके। यह कुछ गंभीर बैश घुमा है :-)
xor007

उत्कृष्ट और सुरुचिपूर्ण समाधान, PostgreSQL 9.2 से 10.7 पर CentOS 7
wfgeo

5

मुझे भी यही समस्या हुई है। मैं फेडोरा रेपो के 9.2.4 से पीजीडीजी 9.3 में अपग्रेड कर रहा था। समस्या का स्रोत यह है कि फेडोरा ने मापदंडों में परिवर्तन unix_socket_directoryकिया है unix_socket_directories( https://bugzilla.redhat.com/show_bug.cgi?id=853353 देखें )।

मेरा समाधान pg_upgradeस्रोतों से पुनर्निर्माण करना है, फ़ाइल के लिए अद्यतन के साथ contrib/pg_upgrade/server.c:199जहां pg_upgradeसर्वर संस्करण की जांच होती है:

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

, मेरे मामले में मैं इसे बदलने के लिए:

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

(मेरी पैच फ़ाइल यहाँ देखें )।


क्या आप कृपया बता सकते हैं कि यह समस्या को क्यों ठीक करता है (खुद की पसंद के लिए, जो स्रोतों से अधिक परिचित नहीं हैं (समझ से सावधान रहें!))।
dezso

4
ऊपर @a_horse टिप्पणी के अनुसार, नदी के ऊपर PostgreSQL पैरामीटर बदल दिया है unix_socket_directoryकरने के लिए unix_socket_directoriesसंस्करण 9.3 में। लेकिन फेडोरा मेंटेनर ने इसे कम वर्जन पर वापस ला दिया। इसलिए, pg_upgradePGDG (PostgreSQL ग्लोबल डेवलपमेंट ग्रुप) YUM रिपॉजिटरी से उम्मीद है कि 9.2.4 संस्करण स्वीकार करता है unix_socket_directory, लेकिन वास्तव में फेडोरा YUM रिपॉजिटरी से 9.2.4 संस्करण स्वीकार करता है unix_socket_directories। इस मामले में, क्योंकि Fedora इसे संस्करण 9.0 में आगे पीछे करता है, मैंने इसे unix_socket_directoriesसंस्करण> = 9.0 के लिए उपयोग करने के लिए बदल दिया ।
अली अकबर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.