“ FATAL: lock file” postmaster.pid“ มีอยู่แล้ว”


68

ฉันเพิ่งติดตั้ง postgres ใหม่ brew install postgres

ฉันวิ่งinitdb /usr/local/var/postgres -E utf8แต่ได้รับสิ่งนี้:

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".

ดังนั้นฉันrm -rfเป็นโฟลเดอร์ postgres และรันอีกครั้ง:

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

มันบอกว่าทุกอย่างโอเค:

Success. You can now start the database server using:

    postgres -D /usr/local/var/postgres

ดังนั้นฉันจึงรันคำสั่งนั้นและได้รับ:

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"?

ตอนนี้เมื่อฉันดูที่ Activity Monitor ฉันสามารถเห็นอินสแตนซ์ของการโพสต์ 6 ครั้ง

ฉันจะแก้ไขได้อย่างไร


คุณอาจเห็นอินสแตนซ์หนึ่งของpostgresไปรษณีย์และห้าแบ็กเอนด์ยูทิลิตี้ PostgreSQL เป็นสถาปัตยกรรมแบบหลายกระบวนการ
Craig Ringer

คำตอบ:


104

ประกาศบริการสาธารณะ: postmaster.pidไม่เคยลบ จริงๆ. วิธีที่ดีในการรับข้อมูลที่เสียหาย

คุณได้ติดตั้ง PostgreSQL ไว้แล้วและคุณลบข้อมูล dir โดยไม่หยุดเซิร์ฟเวอร์ที่ทำงานอยู่ ดังนั้นตอนนี้คุณมีกระบวนการเซิร์ฟเวอร์ PostgreSQL เด็กกำพร้าที่จัดการไฟล์ข้อมูลที่ถูกลบไปแล้วดังนั้นพวกเขาจึงไม่สามารถเข้าถึงได้ในระบบไฟล์อีกต่อไปและจะถูกลบอย่างสมบูรณ์เมื่อปิดไฟล์จัดการไฟล์สุดท้ายที่เปิดไว้ คุณไม่สามารถใช้pg_ctlเพื่อปิดเซิร์ฟเวอร์ลงตามปกติเนื่องจากคุณลบ datadir ของคลัสเตอร์ดังนั้นคุณต้องฆ่ากระบวนการ ฆ่าไปรษณีย์ (ไม่ได้ใช้kill -9เพียงแค่ฆ่าสามัญจะทำ) และส่วนที่เหลือจะปิดตัวลงมากเกินไป

จากนั้นคุณจะสามารถเริ่มเซิร์ฟเวอร์ใหม่ใน datadir กับinitdbข้อมูลใหม่

มีความเป็นไปได้สูงมากที่คุณจะพบกับข้อขัดแย้งในการติดตามเว้นแต่ว่าคุณจะถอนการติดตั้ง PostgreSQL เวอร์ชันเก่ากว่า

โดยสังเขป:

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

จดตัวเลขในบรรทัดแรกซึ่งเป็นpidของ postmaster

ตรวจสอบpsว่า pid นั้นเป็นของ postgres postmaster

ฆ่าโพสต์มาสเตอร์ด้วยคำสั่งต่อไปนี้แทนที่ 'PID' ด้วยหมายเลขที่คุณจดไว้ อีกครั้งอย่าใช้kill -9หรือkill -KILLเพียงแค่ใช้ธรรมดาkillนั่นคือSIGTERM :

kill PID

หาก pid ไม่ใช่ของ postgres postmaster ให้แบ็กเอนด์killใด ๆpostgresที่อาจยังทำงานอยู่ตรวจสอบด้วยตนเองว่าไม่ได้ทำงานอีกต่อไปแล้วลบออกpostmaster.pidเท่านั้น (คุณต้องตรวจสอบด้วยpostmaster.pidว่าไม่ได้อยู่ในที่เก็บข้อมูลที่ใช้ร่วมกันซึ่งเซิร์ฟเวอร์อาจทำงานบน VM / โฮสต์อื่น ๆ )


มันใช้งานได้สำหรับฉัน!
เสียง

วิธีนี้ใช้ได้ผล มีปัญหาในการทำให้ถังขยะของฉันว่างเปล่าและดูเหมือนว่ามีไฟล์ข้อมูลบางไฟล์ที่อยู่ในนั้น ... ไม่แน่ใจ แต่พวกเขาเป็นอย่างไร เมื่อฉันฆ่ากระบวนการเก่ามันใช้งานได้ดี
Dan L

ใช่. นั่นคือจุดที่
Amos Folarin

7
ควรกล่าวถึงว่าหลังจากเกิดความผิดพลาดอย่างหนักไฟล์ PID อาจอยู่รอดได้ในขณะที่กระบวนการหยุดทำงาน ในกรณีนั้น PID ในไฟล์ PID สามารถชี้ไปที่กระบวนการที่ไม่เกี่ยวข้องกับ Postgres ดูคำตอบที่สองสำหรับกรณีนั้น
febeling

2
ที่ราบkill PIDไม่ทำงานสำหรับฉัน kill -3 PIDผมจำเป็นต้องมี ในกรณีของฉันฉันได้ทำการปิดซึ่งอาจมีการฆ่า windows terminal โดยไม่หยุดกระบวนการอย่างถูกต้อง กระบวนการที่kill -3 PIDถูกฆ่าและลูก ๆ ของมันทำให้ฉันเริ่มต้นใหม่ได้อีกครั้ง
Paul Masri-Stone

46

ความเป็นไปได้อีกอย่างก็คือคุณมีการปิดระบบอย่างหนักและกระบวนการ postgres เสียชีวิตโดยไม่ต้องล้างไฟล์ pid สิ่งนี้เกิดขึ้นกับฉันเมื่อแบตเตอรีแล็ปท็อปของฉันตาย

โซลูชันนี้ไม่ได้มีไว้สำหรับระบบการผลิตและคุณควรตรวจสอบให้แน่ใจว่า postgres daemon ไม่ทำงานแต่ฉันใช้แล็ปท็อปของฉันเพื่อเข้ารหัสและฉันไม่กังวลเกี่ยวกับการสร้างฐานข้อมูลของฉันใหม่

ดังนั้นหากกระบวนการอื่น - หรือไม่มีเลย - กำลังทำงานบนพอร์ตนั้นเพียงแค่ลบไฟล์ pid เช่น

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

และ postgres จะเริ่มต้นได้ดี

หากต้องการทราบว่ากระบวนการอื่นกำลังทำงานอยู่บนพอร์ตนั้นหรือไม่คุณสามารถทำได้

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

จากนั้นเรียกใช้

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

เพื่อดูว่ามันทำงาน คุณควรเห็น

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

(หรืออย่างน้อยนั่นคือสิ่งที่ฉันเห็นหลังจากทำตามด้านบน :-))

(และจริงๆแล้ว Postgres ไม่ควรฉลาดพอที่จะรู้ว่าไม่มีกระบวนการใดที่มี PID 933 และลบไฟล์ pid ปลอมด้วยตัวเอง)


1
นี่เป็นกรณีสำหรับฉัน ฉันมีกระบวนการอื่นที่บังเอิญทำงานบน PID เดียวกันกับpostmaster.pidไฟล์ที่ชี้ไป นี่เป็นเวลาหลายวันหลังจากการปิดที่ไม่สะอาด (การติดตั้งแล็ปท็อปของ Postgres บน OSX ผ่าน homebrew)
Jesse Buchanan

1
แม็คของฉันแขวนอยู่บนหน้าจอเข้าสู่ระบบและฉันต้องปิดเครื่อง ท้ายที่สุดก็ทิ้งไฟล์ postmaster.pid ไว้รอบ ๆ ซึ่งอ้างถึง PID ซึ่งใช้สำหรับอย่างอื่นในการรีบูทครั้งต่อไปและ postgres จะไม่เกิดขึ้น ฉันพยายามฆ่า PID (เช่นโพสต์โดย craig-ringer แนะนำ) แต่นั่นก็ไม่ได้ช่วย อย่างไรก็ตามrm postmaster.pidทำงานให้ฉัน ฉันไม่เห็นความเสียหายของข้อมูลใด ๆ (แต่ในกรณีใด ๆ นี่เป็นเพียงเครื่องพัฒนา)
Steven Chanin

สิ่งเดียวกันสำหรับฉัน ฉันปิดระบบแมคโดยไม่ต้องหยุดเซิร์ฟเวอร์ Rails ในพื้นที่
บรูโน่ Paulino

1
ฉันกลับมาที่กระทู้นี้ทุกครั้งที่เกิดขึ้น - เพราะฉันจำไม่ได้ว่าไฟล์ pid อยู่ที่ใดดังนั้นฉันจึงต้องค้นหามันเสมอ: P
haslo

เรื่องนี้เกิดขึ้นกับฉันด้วย Postgres.app หลังจากลบ~/Library/Application Support/Postgres/data/postmaster.pidฉันก็กลับมาทำงานได้อีกครั้ง
Rob Johansen

8

ฉันลองทั้งหมดนี้เพื่อประโยชน์ไม่หลังจากอัปเกรดเป็น Yosemite ที่ยากจน postgres ของฉัน (ติดตั้งผ่าน homebrew)

จากนั้นฉันก็สะดุดกับโพสต์บล็อกนี้: http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres

ก่อนอื่นฉันต้องสร้างไดเรกทอรีที่หายไปซึ่งเห็นได้ชัดว่าล้างออกระหว่างการอัปเกรด (ขอบคุณ Apple!)

$ cd /usr/local/var/postgres

$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}

จากนั้นเพียงแค่เริ่มต้น postgres อีกครั้งโดยใช้ลำดับการเปิด homebrew ปกติ:

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

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

ขอบคุณ Ruckus Notes ที่ช่วยแก้ปัญหาของฉัน หวังว่ามันจะช่วยคุณได้เช่นกัน


4

คำแนะนำในการรีบูตอย่างหนัก

ฉันมีปัญหาเดียวกันนี้หลังจากรีบูตอย่างหนัก หลังจากตรวจสอบpostmaster.pidpid ของไฟล์ฉันสังเกตว่าฉันไม่มีกระบวนการทำงาน ฉันไม่ต้องการลบไฟล์. pid อย่างหนัก แต่ฉันใช้pg-stopนามแฝงที่ฉันสร้างขึ้น.bash_profileแทน นามแฝงนี้เพิ่งทำงาน

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

สำหรับการอ้างอิง

# 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'

บันทึกเอาท์พุทหลังจาก 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

ชง

ฉันคิดว่าฉันควรพูดถึงที่นี่ด้วยเช่นกันว่าถ้าคุณติดตั้ง postgres ด้วย homebrew คุณควรbrew servicesมอง นี่คือวิธีที่ฉันต้องการเริ่ม / หยุดฐานข้อมูลของฉัน

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

ข้อมูลการชงเป็นเพียงสิ่งที่ฉันต้องการขอบคุณ!
dnatoli

1

ฉันได้รับข้อผิดพลาดนี้หลังจากนั้นฉันคิดว่าคอมพิวเตอร์ของฉันล้มเหลว PostgreSQL ไม่สามารถเริ่มต้นได้เนื่องจากข้อผิดพลาดนี้ดังนั้นการฆ่ากระบวนการจึงไม่ใช่วิธีแก้ปัญหา ฉันสำรองข้อมูลไว้แล้วลบpostmaster.pidไฟล์จากนั้นข้อผิดพลาดก็หยุดลงและ PG ก็สามารถเริ่มต้นได้อีกครั้ง


1

บางครั้งคนที่อ่อนน้อมถ่อมตนpg_ctl -w restartสามารถทำเคล็ดลับ :-)


รักเมื่อคำตอบสูงสุดคือคุณถึงวาระ! สัมผัสอะไร! จากนั้นหนึ่งคำสั่งเล็ก ๆ น้อย ๆ ทำให้ฉันทำงานได้ (ในกรณีของฉัน pid ใน/usr/pgsql/9.3/data/postmaster.pidไม่ได้อยู่ใน ps aux.)
Noumenon

0

การลบ postmaster.pid จริง ๆ แล้วเป็นสิ่งที่ดีมากในการบู๊ตทุกครั้ง นั่นคือสิ่งที่ระบบของฉันทำ เนื่องจากคุณเพิ่งบูทขึ้นคุณจึงรู้ว่าไม่มีกระบวนการ Postgres ทำงานและหากคุณกู้คืนจากการปิดระบบที่ไม่สะอาดไฟล์นี้จะป้องกันการกู้คืนของคุณ

การออกแบบที่ดีกว่าสำหรับ Postgres คือการวางไฟล์ postmaster.pid ในระบบไฟล์ / run ดังนั้นจึงรับประกันได้ว่าจะถูกลบทุกครั้งที่รีบูต เซิร์ฟเวอร์อื่น ๆ ทำงานเช่นนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.