`pg_tblspc` bị thiếu sau khi cài đặt phiên bản OS X mới nhất (Yosemite hoặc El Capitan)


464

Tôi sử dụng postgres từ homebrew trong OS X của mình, nhưng khi tôi khởi động lại hệ thống của mình, đôi khi các postgres không khởi động sau khi khởi động lại, và vì vậy tôi đã cố gắng khởi động bằng tay postgres -D /usr/local/var/postgres, nhưng sau đó đã xảy ra lỗi với thông báo sau : FATAL: could not open directory "pg_tblspc": No such file or directory.

Lần cuối cùng xảy ra, tôi không thể đưa nó về trạng thái ban đầu, vì vậy tôi quyết định gỡ cài đặt toàn bộ hệ thống postgres và sau đó cài đặt lại và tạo người dùng, bảng, bộ dữ liệu, v.v ... Thật kinh tởm, nhưng nó thường xuyên xảy ra trên hệ thống của tôi, nói một lần trong một vài tháng.

Vậy tại sao nó mất pg_tblspctập tin thường xuyên? Và tôi có thể làm gì để tránh mất tập tin không?

Tôi chưa nâng cấp homebrew và postgres của mình lên phiên bản mới nhất (tức là tôi đã sử dụng cùng một phiên bản). Ngoài ra, tất cả những điều tôi đã làm trên cơ sở dữ liệu postgres là xóa bảng và điền dữ liệu mới mỗi ngày. Tôi đã không thay đổi người dùng, mật khẩu, v.v ...

EDIT (mbannert): Tôi cảm thấy cần phải thêm điều này, vì chủ đề là điểm nhấn hàng đầu trên google cho vấn đề này và đối với nhiều triệu chứng thì khác. Người mua nhà có thể sẽ gặp thông báo lỗi này:

No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

Vì vậy, nếu bạn vừa trải nghiệm điều này sau khi nâng cấp Yosemite thì bây giờ bạn đã được bảo vệ để đọc chủ đề này.


Eep, nó thực sự, thực sự không nên! Khi bạn nói "phiên bản mới nhất", vui lòng hiển thị số phiên bản chính xác. Ngoài ra, bạn đã đặt bất kỳ không gian bảng trên bộ nhớ ngoài? thư mục dữ liệu PostgreSQL nằm ở đâu?
Craig Ringer

Ngoài ra, pg_tblspclà một thư mục . Cách duy nhất tôi có thể thấy thư mục này và chỉ thư mục này biến mất ngẫu nhiên là tham nhũng hệ thống tệp hoặc một công cụ quét vi-rút hoặc công cụ đồng bộ hóa tệp đặc biệt xấu.
Craig Ringer

Tôi không có máy quét virus. Tôi không biết nó tablespaceslà gì , vì vậy tôi không nghĩ rằng tôi đã đưa nó vào bộ lưu trữ ngoài.
Blaszard

Hừm. Tất cả tôi có thể nói bạn là một cái gì đó nặng nề sai. pg_tblspckhông chỉ biến mất trên bất kỳ hệ thống nào tôi từng gặp, tôi cũng không thể tưởng tượng được lý do lành mạnh như thế nào. Sẽ rất khó để nói điều gì làm cho hệ thống của bạn khác biệt mà không có nhiều chi tiết hơn.
Craig Ringer

2
Bạn có thể tìm ra giải pháp cho @Gardecolo này không? Tôi đang gặp vấn đề tương tự sau khi nâng cấp lên Yosemite.
Donovan

Câu trả lời:


928

Đã giải quyết ... một phần.

Rõ ràng, Cài đặt các phiên bản mới nhất của OS X (ví dụ Yosemite hoặc El Capitan) sẽ xóa một số thư mục trong /usr/local/var/postgres.

Để khắc phục điều này, bạn chỉ cần tạo lại các thư mục bị thiếu:

mkdir /usr/local/var/postgres/pg_tblspc
mkdir /usr/local/var/postgres/pg_twophase
mkdir /usr/local/var/postgres/pg_stat
mkdir /usr/local/var/postgres/pg_stat_tmp
mkdir /usr/local/var/postgres/pg_replslot
mkdir /usr/local/var/postgres/pg_snapshots

Hoặc, chính xác hơn ( nhờ Nate ):

mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/

Chạy lại pg_ctl start -D /usr/local/var/postgres bây giờ khởi động máy chủ bình thường và, ít nhất là đối với tôi, mà không mất dữ liệu.

CẬP NHẬT

Trên hệ thống của tôi, một số thư mục đó trống ngay cả khi Postgres đang chạy. Có lẽ, như một phần của hoạt động "dọn dẹp", Yosemite xóa bất kỳ thư mục trống nào? Trong mọi trường hợp, tôi đã tiếp tục và tạo một tệp '.keep' trong mỗi thư mục để ngăn chặn việc xóa trong tương lai.

touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep

Lưu ý : Tạo .keeptệp trong các thư mục đó sẽ tạo ra một số nhiễu trong tệp logfile của bạn, nhưng dường như không ảnh hưởng tiêu cực đến bất kỳ thứ gì khác.


53
Chỉ là một gợi ý cho một lệnh ngắn gọn hơn: mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Nate

26
Những tệp .keep đó thực sự gây cho tôi một số đau buồn trong nhật ký máy chủ:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost

13
Tôi cũng bị thiếu các thư mục pg_snapshots và pg_stat.
Jon Stevens

8
Tôi cũng phải tạo thêm một thư mục 'pg numplslot'. Ngoại trừ việc nó hoạt động tốt. Cảm ơn!
Lucas

6
có kinh nghiệm giống như @Lucas cho các postgres đóng chai 9.4.0. Tôi đã phải mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell

9

Câu trả lời của Donavan là tại chỗ, tôi chỉ muốn thêm rằng khi tôi làm những việc khác với cơ sở dữ liệu (ví dụ rake db:test), nó đã tìm kiếm các thư mục khác nhau chưa được đề cập ở trên và sẽ bị nghẹt thở khi chúng không có mặt, trong trường hợp của tôi pg_logical/mappings, vì vậy bạn có thể muốn thiết lập một thiết bị đầu cuối đang chạy:

tail -f /usr/local/var/postgres/server.log

và xem nó cho các thư mục bị thiếu trong khi bạn đi qua các hoạt động cơ sở dữ liệu điển hình của bạn.


3
Cần thêm mkdir -p / usr / local / var / postgres / pg_logical / {snapshots, mappings}
peter_v

6

Điều này hơi lạc đề nhưng đáng chú ý ở đây là một phần của quá trình phục hồi PostgreSQL Yosemite. Tôi gặp vấn đề tương tự như trên VÀ tôi gặp vấn đề với PostgreSQL "dường như" đang chạy trong nền nên ngay cả sau khi thêm thư mục tôi cũng không thể khởi động lại. Tôi đã thử sử dụng pg_ctl stop -m fastđể giết máy chủ PostgreSQL nhưng không gặp may. Tôi cũng đã cố gắng thực hiện theo quy trình trực tiếp với kill PIDnhưng ngay sau khi tôi thực hiện thì quy trình PostgreQuery lại xuất hiện với một bộ vi xử lý khác.

Khóa cuối cùng là một .plisttệp mà Homebrew đã tải ... Bản sửa lỗi cho tôi cuối cùng là:

launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist

Sau đó tôi đã có thể khởi động PostgreSQL một cách bình thường.


Plist của tôi được đặt tên hơi khác nhau: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistnhưng về cơ bản đó cũng là vấn đề tương tự đối với tôi và cùng một giải pháp.
onekiloparsec

4

Các thư mục bị thiếu cần phải có trong thư mục dữ liệu PostgreSQL của bạn. Thư mục dữ liệu mặc định là /usr/local/var/postgres/. Nếu bạn đã thiết lập một thư mục dữ liệu khác, bạn cần tạo lại các thư mục bị thiếu ở đó. Nếu bạn đã sửa đổi .plisttệp được đề xuất homebrew bắt đầu PostgreSQL, bạn có thể tìm thấy thư mục dữ liệu ở đó:

cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

(đó là -Dtùy chọn bạn bắt đầu postgres với :)

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/postgres</string>
    <string>-D</string>
    <string>/usr/local/pgsql/data</string>

Trong ví dụ trên, bạn sẽ tạo các thư mục bị thiếu trong /usr/local/pgsql/data, như vậy:

cd /usr/local/pgsql/data
mkdir {pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots,pg_logical}
mkdir pg_logical/{snapshots,mappings}

-20

Tạo các thư mục bị thiếu chắc chắn hoạt động nhưng tôi đã sửa nó bằng cách khởi tạo lại postgres db, đây là một cách tiếp cận sạch hơn để tránh các vấn đề trong tương lai.

LƯU Ý: Cách tiếp cận này sẽ xóa cơ sở dữ liệu hiện có

$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres

19
Rõ ràng xóa cơ sở dữ liệu hiện tại không phải là một ngoại lệ nhỏ ở đây. Điều này hơi giống như nói "Tôi không thể tìm thấy / var / tmp vì vậy tôi đã cài đặt lại hệ điều hành."
Adam Donahue

4
Oh, người đàn ông, đây là "sạch" hơn bất cứ điều gì tôi có thể nghĩ ra :) Chỉ cần hy vọng một số ngẫu nhiên sao chép paster từ interwebz không bắn này trực tiếp vào giao diện điều khiển của họ mà không nhìn vào nó :)
Halil Özgür

2
Xin lỗi vì đã bỏ phiếu Greg nhưng tôi khuyên bạn nên viết lại giải pháp của bạn để làm rõ rằng phương pháp này chỉ nên được sử dụng trong quá trình phát triển hoặc nếu người dùng có thể đủ khả năng xóa sạch DB của họ.
hraynaud

1
Tại sao điều này bị hạ thấp rất nhiều? Trên một máy chủ dev đây là cách đúng đắn.
Jordon Bedwell

@JordonBedwell ngay cả trên máy chủ dev là ý tưởng tồi, trừ khi bạn đang chơi với một ứng dụng duy nhất sử dụng db trên máy tính của mình .. Giống như "Tôi không thể khởi động trình chỉnh sửa mã yêu thích của mình, hãy cài đặt lại HĐH"
Andre Figueiredo
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.