pg_upTHER tham số cấu hình không được nhận dạng, unix_socket_directory,


13

Tôi đang cố gắng nâng cấp Postgresql từ 9.2 lên 9.3 trong Fedora 18 bằng cách sử dụng lệnh này với tư cách là người dùng 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

Lỗi trong nhật ký

lệnh: "/ bin / pg_ctl" -w -l "pg_upTHER_server.log" -D "/ var / lib / pssql / data" -o "-p 50432 -b -c lắng_addresses = '' -c unix_socket_permissions = 0700 -c unix_socket_directory = '/ var / lib / pssql' "start >>" pg_upTHER_server.log "2> & 1 đang chờ máy chủ khởi động .... FATAL: tham số cấu hình không được nhận dạng" unix_socket_directory ".... đã dừng chờ pg_ctl: người phục vụ

Như được chỉ ra bởi a_horse trong các bình luận rằng tham số đã được thay thế bằng unix_socket_directories(số nhiều) trong 9.3. Nhưng phiên bản máy chủ đang được khởi động là phiên bản cũ 9.2:

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

Có ý kiến ​​gì không?


2
Tham số đó đã được đổi tên thành unix_socket_directories: postgresql.org/docs/civerse/static/release-9-3.html#AEN114343
a_horse_with_no_name

@a_horse Lệnh đó cố gắng bắt đầu phiên bản 9.2. Kiểm tra câu hỏi cập nhật
Clodoaldo

Để xem rõ ràng tham số nào đang được sử dụng trong bản phân phối của bạn, bạn có thể chạypostgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

Câu trả lời:


25

Tôi đã hack vấn đề bằng cách chạy (với quyền 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

Chạy pg_upgradenhư dự định, sau đó hoàn tác hack:

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

Vấn đề là pg_upTHER thực thi chương trình pg_ctrl với các đối số chỉ định các tệp trong "unix_socket_directory" cũ thay vì "unix_socket_directories" mới (lưu ý thứ hai là số nhiều). Hack này đổi tên ban đầu /usr/bin/pg_ctlthành /usr/bin/pg_ctl-origvà sau đó tạo một tập lệnh shell ở vị trí đơn giản gọi chương trình pg_ctl ban đầu, chuyển tất cả các đối số với bất kỳ chuỗi nào "unix_socket_directory" đã đổi thành "unix_socket_directories".

Trong bash, người ta có thể thay đổi một phần của chuỗi, nói từ barthành bazmột biến $foo, bằng cách sử dụng ${foo/bar/baz}(lưu ý điều này không thay đổi biến, mà trả về nội dung đã sửa đổi của biến). Mảng cũng có thể được sử dụng ${x/y/z}để lấy một mảng với tất cả nội dung của nó được thay thế, tất cả cùng một lúc. Biến $@là một mảng chứa tất cả các đối số được truyền cho chương trình / script / hàm, vì vậy tập lệnh pg_ctl mới thực thi cái cũ với tất cả các đối số được thay đổi từ tên thư mục cũ sang tên mới.


3
điều này thực sự cho phép tôi nâng cấp postgres 9.2 lên 9.6 trên Centos 7! Cảm ơn!
Sunsetjunks

2
Làm việc tuyệt vời cho tôi đi từ 9,2 đến 9,6. Cám ơn rất nhiều! Không biết tôi sẽ làm gì nếu không có câu trả lời này!
18:00

Tôi cũng làm việc cho tôi, đi từ 9,2 đến 9,6 trên Centos 7
Gabriel Theron

1
Có lẽ giải thích mánh khóe của bash hack có thể giúp người khác giải quyết các vấn đề tương tự trong tương lai. Đây là một số bash xoắn nghiêm trọng :-)
xor007

Giải pháp tuyệt vời và thanh lịch, hoạt động hoàn hảo khi đi từ PostgreSQL 9.2 đến 10.7 trên CentOS 7
wfgeo

5

Tôi đã có cùng một vấn đề. Tôi đã nâng cấp từ Fedora 9.2.4 lên PGDG 9.3. Nguồn gốc của vấn đề là Fedora sao lưu các thay đổi của tham số unix_socket_directorythành unix_socket_directories(xem https://ormszilla.redhat.com/show_orms.cgi?id=853353 ).

Giải pháp của tôi là xây dựng lại pg_upgradetừ các nguồn, với bản cập nhật thành tệp contrib/pg_upgrade/server.c:199nơi pg_upgradekiểm tra phiên bản máy chủ:

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

, trong trường hợp của tôi, tôi thay đổi nó thành:

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

(xem tập tin vá của tôi ở đây ).


Bạn có thể vui lòng giải thích lý do tại sao điều này khắc phục vấn đề (theo ý thích của bản thân tôi, những người không quá quen thuộc với các nguồn (hãy cẩn thận với phần dưới!))?
dezso

4
Theo nhận xét @a_horse ở trên, PostgreSQL ngược dòng đã thay đổi tham số unix_socket_directorythành unix_socket_directoriesphiên bản 9.3. Nhưng nhà bảo trì Fedora đưa nó vào phiên bản thấp hơn. Vì vậy, pg_upgradetừ Kho lưu trữ YUM của PGDG (Nhóm phát triển toàn cầu PostgreQuery) hy vọng rằng phiên bản 9.2.4 chấp nhận unix_socket_directory, nhưng thực tế phiên bản 9.2.4 từ Kho lưu trữ Fedora YUM chấp nhận unix_socket_directories. Trong trường hợp này, do Fedora đưa nó vào phiên bản 9.0 trở đi, tôi đã thay đổi nó để sử dụng unix_socket_directoriescho phiên bản> = 9.0.
Ali Akbar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.