BẠC BẠC: khóa tập tin


68

Tôi vừa cài đặt lại postgres qua brew install postgres

Tôi đã chạy initdb /usr/local/var/postgres -E utf8nhưng đã nhận được điều này:

The files belonging to this database system will be owned by user "atal421".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default text search configuration will be set to "english".

initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".

Vì vậy, tôi rm -rfthư mục postgres và chạy lại nó:

 initdb /usr/local/var/postgres -E utf8

Nó nói mọi thứ đều ổn:

Success. You can now start the database server using:

    postgres -D /usr/local/var/postgres

Vì vậy, tôi đã chạy lệnh đó và nhận được:

postgres -D /usr/local/var/postgres


FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 13731) running in data directory "/usr/local/var/postgres"?

Bây giờ khi tôi nhìn vào Trình theo dõi hoạt động của mình, tôi có thể thấy 6 trường hợp bị hoãn.

Làm thế nào để tôi sửa lỗi này?


Bạn có thể thấy một ví dụ postgresvới một postmaster và năm phụ trợ tiện ích. PostgreSQL là một kiến ​​trúc đa quy trình.
Craig Ringer

Câu trả lời:


104

Thông báo dịch vụ công cộng: không bao giờ xóa postmaster.pid. Có thật không. Cách tuyệt vời để có được dữ liệu tham nhũng.

Bạn đã cài đặt PostgreSQL và bạn đã xóa thư mục dữ liệu mà không dừng máy chủ đang chạy. Vì vậy, bây giờ bạn có một số quy trình máy chủ PostgreSQL mồ côi đang quản lý các tệp dữ liệu đã bị xóa, do đó chúng không còn truy cập được trong hệ thống tệp và sẽ bị xóa hoàn toàn khi đóng tệp mở cuối cùng với chúng. Bạn không thể sử dụng pg_ctlđể tắt máy chủ như bình thường vì bạn đã xóa datadir cụm, vì vậy bạn chỉ cần giết các tiến trình. Giết người quản lý bưu điện ( không sử dụng kill -9, chỉ cần giết bình thường) và phần còn lại cũng sẽ tắt.

Sau đó, bạn sẽ có thể bắt đầu một máy chủ mới trong datadir dựa trên initdbdữ liệu mới.

Rất có khả năng bạn sẽ gặp phải xung đột trên đường đua trừ khi bạn gỡ cài đặt phiên bản cũ hơn của PostgreQuery.

Tóm lại:

cat /usr/local/var/postgres/postmaster.pid

Lưu ý số trên dòng đầu tiên, đó là pid của bưu điện.

Xác psnhận rằng pid là của một bưu tá bưu điện.

Giết quá trình postmaster bằng lệnh sau, thay thế 'PID' bằng số bạn đã ghi chú. Một lần nữa, không sử dụng kill -9hoặc kill -KILL, chỉ sử dụng một đồng bằng kill, tức làSIGTERM :

kill PID

Nếu pid không phải là của một postmaster, hãy thủ công killbất kỳ postgresphụ trợ nào vẫn có thể đang chạy, xác minh rằng chúng không còn chạy nữa và chỉ sau đó xóa postmaster.pid. (Bạn cũng phải xác minh rằng postmaster.pidkhông phải trên bộ nhớ chia sẻ nơi máy chủ có thể đang chạy trên một số máy chủ / máy chủ khác).


Điều này làm việc cho tôi!
Giai điệu

Những công việc này. Có một vấn đề trong đó tôi đã dọn sạch thùng rác của mình và có vẻ như một số tệp dữ liệu có thể ở đó ... không biết làm thế nào, nhưng chúng là như vậy. Một khi tôi giết quá trình cũ, nó hoạt động tốt.
Dan L

vâng đó là tại chỗ.
Amos Folarin

7
Cần phải đề cập rằng sau một sự cố nghiêm trọng, tệp PID có thể tồn tại, trong khi quá trình này chết. Trong trường hợp đó, PID trong tệp PID có thể chỉ ra một quy trình không liên quan gì đến Postgres. Xem câu trả lời thứ hai cho trường hợp đó.
febeling

2
Một đồng bằng kill PIDđã không làm việc cho tôi. Tôi cần thiết kill -3 PID. Trong trường hợp của tôi, tôi đã thực hiện tắt máy có thể đã giết chết các cửa sổ đầu cuối mà không dừng các quy trình đúng cách. Các kill -3 PIDgiết quá trình và con của nó để cho thành công tôi bắt đầu postgres một lần nữa.
Paul Masri-Stone

46

Một khả năng khác là bạn đã tắt máy và quá trình xử lý dữ liệu bị chết mà không dọn sạch tệp pid của nó. Điều này xảy ra với tôi khi pin máy tính xách tay của tôi chết.

Giải pháp này không dành cho hệ thống sản xuất và bạn thực sự cần đảm bảo rằng trình nền postgres không chạy , nhưng tôi sử dụng máy tính xách tay của mình để mã hóa và tôi không lo lắng về việc cần phải tạo lại cơ sở dữ liệu của mình.

Vì vậy, nếu một quá trình khác - hoặc không có gì cả - đang chạy trên cổng đó, chỉ cần xóa tệp pid, ví dụ:

rm /usr/local/var/postgres/postmaster.pid

và postgres sẽ sớm khởi động tốt.

Để tìm hiểu xem một quá trình khác đang chạy trên cổng đó, bạn có thể làm

ps wax | grep `head -1 /usr/local/var/postgres/postmaster.pid`

Sau đó chạy

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

để xem nếu nó làm việc Bạn nên thấy

FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 933) running in data directory "/usr/local/var/postgres"?
FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 933) running in data directory "/usr/local/var/postgres"?
LOG:  database system was interrupted; last known up at 2014-05-25 09:41:32 PDT
LOG:  database system was not properly shut down; automatic recovery in progress

(hoặc ít nhất đó là những gì tôi vừa thấy sau khi tôi làm như trên :-))

(Và thực sự, Postgres không đủ thông minh để nhận ra rằng không có quy trình nào với PID 933 và tự mình xóa tệp pid không có thật?)


1
Đây là trường hợp đối với tôi. Tôi đã có một quá trình khác tình cờ chạy trên cùng một PID khi postmaster.pidtệp được trỏ tới. Đây là vài ngày sau khi tắt máy ô uế (cài đặt máy tính xách tay của Postgres trên OSX thông qua homebrew).
Jesse Hội nguyên

1
Mac của tôi treo trên màn hình đăng nhập và tôi phải tắt nó. Điều đó đã kết thúc việc để lại một tập tin postmaster.pid xung quanh có tham chiếu một PID được sử dụng cho mục đích khác trong lần khởi động lại tiếp theo và các postgres sẽ không xuất hiện. Tôi đã cố gắng tiêu diệt PID (như bài viết của craig-ringer khuyến nghị), nhưng điều đó không có ích. Tuy nhiên, rm postmaster.pidlàm việc cho tôi. Tôi không thấy bất kỳ tham nhũng dữ liệu nào (nhưng trong mọi trường hợp, đây chỉ là một cỗ máy phát triển).
Steven Chanin

Điều tương tự đối với tôi. Tôi đã tắt máy mac của mình mà không dừng máy chủ Rails cục bộ.
Bruno Paulino

1
Tôi tiếp tục quay lại chủ đề này bất cứ khi nào điều này xảy ra - bởi vì tôi không bao giờ có thể nhớ tệp pid ở đâu, vì vậy tôi luôn phải tìm nó: P
haslo

Điều này đã xảy ra với tôi với Postgres.app. Sau khi xóa ~/Library/Application Support/Postgres/data/postmaster.pidtôi đã lên và chạy lại.
Rob Johansen

8

Tôi đã thử tất cả những điều này nhưng không có kết quả sau khi nâng cấp lên Yosemite đã phá vỡ các postgres của tôi (được cài đặt qua homebrew).

Sau đó, tôi tình cờ thấy bài đăng trên blog này: http://ruckus.tumblr.com/post/100355276496/yosemite-upTHER-breaks-homebrew-installed-postgres

Đầu tiên tôi cần tạo các thư mục còn thiếu rõ ràng đã bị xóa trong quá trình nâng cấp (cảm ơn Apple!).

$ cd /usr/local/var/postgres

$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}

Sau đó, chỉ cần bắt đầu postgres một lần nữa bằng cách sử dụng trình tự khởi chạy homebrew bình thường:

$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

Cảm ơn Ruckus Notes đã giúp giải quyết vấn đề của tôi. Hy vọng nó sẽ giúp bạn là tốt.


4

HƯỚNG DẪN CỨNG

Tôi đã có vấn đề tương tự sau khi khởi động lại cứng. Sau khi kiểm tra postmaster.pidpid của tập tin, tôi nhận thấy tôi không có quá trình chạy. Tôi không muốn xóa tệp .pid, thay vào đó tôi sử dụng pg-stopbí danh mà tôi đã tạo trong đó .bash_profile. bí danh này chỉ chạy

pg_ctl -D /usr/local/var/postgres stop -s -m fast

Để tham khảo

# psql
alias pg-start='pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start'
alias pg-stop='pg_ctl -D /usr/local/var/postgres stop -s -m fast'

đăng nhập đầu ra sau pg-stop

LOG:  database system was interrupted; last known up at 2016-04-25 10:51:08 PDT
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/274FA10
LOG:  redo is not required
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
LOG:  received smart shutdown request
LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down
LOG:  database system was shut down at 2016-04-25 13:11:04 PDT

pha

Tôi nghĩ tôi cũng nên đề cập ở đây rằng nếu bạn đã cài đặt postgres với homebrew, bạn nên brew servicesxem xét. Đó là cách tôi muốn bắt đầu / dừng cơ sở dữ liệu của mình.

XXXXX:~ chris$ brew services list
Name       Status  User  Plist
mongodb    stopped
postgresql started chris /Users/chris/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
redis      started chris /Users/chris/Library/LaunchAgents/homebrew.mxcl.redis.plist

Thông tin về bia là thứ tôi cần, cảm ơn!
dnatoli

1

Tôi nhận được lỗi này sau, tôi nghĩ rằng, máy tính của tôi bị hỏng. PostgreQuery thậm chí không thể bắt đầu vì lỗi này vì vậy việc giết quá trình không phải là giải pháp. Tôi chỉ cần sao lưu và sau đó xóa postmaster.pidtệp và sau đó lỗi dừng lại và PG đã có thể bắt đầu lại.


1

Đôi khi những người khiêm tốn pg_ctl -w restartcó thể thực hiện các mẹo :-)


Yêu khi câu trả lời hàng đầu là BẠN ĐANG LÀM! CHƯA TỪNG! và sau đó một lệnh nhỏ sẽ cho tôi chạy. (Trong trường hợp của tôi, pid in /usr/pgsql/9.3/data/postmaster.pidkhông có trong ps phụ.)
Noumenon

0

Xóa postmaster.pid thực sự là một việc thực sự tốt trong mỗi lần khởi động, một cách mù quáng. Đó là những gì hệ thống của tôi làm. Vì bạn vừa mới khởi động, bạn biết rằng không có quá trình Postgres nào đang chạy và nếu bạn đang phục hồi sau khi tắt máy không sạch sẽ, tệp này sẽ ở đó ngăn cản quá trình phục hồi của bạn.

Một thiết kế tốt hơn cho Postgres sẽ là đặt tệp postmaster.pid trong hệ thống tập tin / run, do đó nó được đảm bảo sẽ bị xóa trong mỗi lần khởi động lại. Nhiều máy chủ khác hoạt động theo cách đó.

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.