pg_upgrade พารามิเตอร์การกำหนดค่าที่ไม่รู้จัก“ unix_socket_directory”


13

ฉันพยายามอัพเกรด Postgresql จาก 9.2 เป็น 9.3 ใน Fedora 18 โดยใช้คำสั่งนี้เป็นผู้ใช้ 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

ข้อผิดพลาดในบันทึก

คำสั่ง: "/ 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 กำลังรอให้เซิร์ฟเวอร์เริ่ม .... FATAL: พารามิเตอร์การตั้งค่าที่ไม่รู้จัก" unix_socket_directory ".... หยุดรอ pg_ctl: ไม่สามารถเริ่มได้ เซิร์ฟเวอร์

ตามที่ชี้โดยa_horseในความคิดเห็นที่พารามิเตอร์ถูกแทนที่ด้วยunix_socket_directories(พหูพจน์) ใน 9.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 ตรวจสอบคำถามล่าสุด
Clodoaldo

หากต้องการดูพารามิเตอร์ที่ใช้ในการแจกจ่ายของคุณอย่างชัดเจนคุณสามารถเรียกใช้postgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

คำตอบ:


25

ฉันแฮ็คปัญหาโดยการทำงาน (เป็น 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

ทำงานpg_upgradeตามที่ต้องการแล้วเลิกทำการแฮ็ก:

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

ปัญหาคือ pg_upgrade เรียกใช้งานโปรแกรม pg_ctrl พร้อมอาร์กิวเมนต์ที่ระบุไฟล์ใน "unix_socket_directory" เก่ามากกว่า "unix_socket_directories" ใหม่ (หมายเหตุที่สองคือพหูพจน์) แฮ็คนี้จะเปลี่ยนชื่อต้นฉบับ/usr/bin/pg_ctlเป็น/usr/bin/pg_ctl-origจากนั้นสร้างเชลล์สคริปต์ในตำแหน่งที่เรียกโปรแกรม pg_ctl ดั้งเดิมโดยส่งอาร์กิวเมนต์ทั้งหมดด้วยสตริงใด ๆ "unix_socket_directory" เปลี่ยนเป็น "unix_socket_directories"

ในทุบตีหนึ่งสามารถเปลี่ยนส่วนหนึ่งของสตริงพูดจากbarไปbazในตัวแปร$fooโดยใช้${foo/bar/baz}(หมายเหตุนี้จะไม่เปลี่ยนแปลงตัวแปร แต่ผลตอบแทนที่ได้มีการปรับเปลี่ยนเนื้อหาของตัวแปร) นอกจากนี้ยังสามารถใช้${x/y/z}อาร์เรย์เพื่อดึงข้อมูลอาเรย์ที่มีการแทนที่เนื้อหาทั้งหมดได้ในคราวเดียว ตัวแปร$@คืออาร์เรย์ที่มีอาร์กิวเมนต์ทั้งหมดที่ส่งผ่านไปยังโปรแกรม / สคริปต์ / ฟังก์ชั่นดังนั้นสคริปต์ pg_ctl ใหม่จะเรียกใช้งานไฟล์เก่าโดยที่อาร์กิวเมนต์ทั้งหมดเปลี่ยนจากชื่อไดเรกทอรีเก่าไปเป็นชื่อใหม่


3
นี่ทำให้ฉันสามารถอัพเกรด postgres 9.2 เป็น 9.6 บน Centos 7! ขอบคุณ!
sunsetjunks

2
ทำงานได้ดีมากสำหรับฉันจาก 9.2 เป็น 9.6 ขอบคุณมาก! ไม่รู้จะทำยังไงถ้าไม่มีคำตอบ!
SebK

ทำงานให้ฉันด้วยเช่นกันจาก 9.2 เป็น 9.6 ใน Centos 7
Gabriel Theron

1
อาจอธิบายการใช้กลอุบายของแฮ็คทุบตีอาจช่วยให้ผู้อื่นจัดการกับปัญหาที่คล้ายกันในอนาคต นี่คือการบิดทุบตีอย่างจริงจัง :-)
xor007

ทางออกที่ยอดเยี่ยมและสง่างามทำงานได้อย่างไร้ที่ติสำหรับการเปลี่ยนจาก PostgreSQL 9.2 ถึง 10.7 บน CentOS 7
wfgeo

5

ฉันมีปัญหาเดียวกัน ฉันกำลังอัปเกรดจาก Fedora Repo ของ 9.2.4 เป็น PGDG 9.3 แหล่งที่มาของปัญหาคือ Fedora สนับสนุนการเปลี่ยนแปลงพารามิเตอร์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 ข้างบน upg PostSQL ได้เปลี่ยนพารามิเตอร์unix_socket_directoryเป็นunix_socket_directoriesเวอร์ชัน 9.3 แต่ผู้ดูแล Fedora กลับไปเป็นรุ่นที่ต่ำกว่า ดังนั้นpg_upgradeจาก PGDG (PostgreSQL กลุ่มพัฒนาทั่วโลก) YUM Repository คาดว่ารุ่น 9.2.4 ยอมรับunix_socket_directoryแต่จริง 9.2.4 จาก Fedora YUM Repository unix_socket_directoriesยอมรับ ในกรณีนี้เนื่องจาก Fedora ทำการแบ็กอัปเป็นเวอร์ชัน 9.0 เป็นต้นไปฉันจึงเปลี่ยนเป็นunix_socket_directoriesเวอร์ชัน> = 9.0
Ali Akbar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.