`pg_tblspc` หายไปหลังจากติดตั้ง OS X เวอร์ชันล่าสุด (Yosemite หรือ El Capitan)


464

ผมใช้ postgres จาก homebrew ใน OS X ของฉัน แต่เมื่อฉันรีบูตระบบของฉันบางครั้ง postgres ไม่เริ่มหลังจากรีบูตและเพื่อให้ฉันเองพยายามที่จะเริ่มต้นด้วยแต่แล้วความผิดพลาดที่เกิดขึ้นกับข้อความต่อไปนี้:postgres -D /usr/local/var/postgresFATAL: could not open directory "pg_tblspc": No such file or directory

ครั้งสุดท้ายที่มันเกิดขึ้นฉันไม่สามารถกลับสู่สถานะเดิมได้ดังนั้นฉันจึงตัดสินใจถอนการติดตั้งระบบ postgres ทั้งหมดแล้วติดตั้งใหม่และสร้างผู้ใช้ตารางชุดข้อมูลและอื่น ๆ ... มันน่าขยะแขยง แต่ มันมักจะเกิดขึ้นในระบบของฉันพูดครั้งเดียวในไม่กี่เดือน

เหตุใดpg_tblspcไฟล์ดังกล่าวจึงสูญหายบ่อยครั้ง และมีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อหลีกเลี่ยงการสูญหายของไฟล์?

ฉันไม่ได้อัปเกรด homebrew และ postgres เป็นเวอร์ชันล่าสุด (เช่นฉันใช้เวอร์ชั่นเดียวกัน) นอกจากนี้ทุกสิ่งที่ฉันทำในฐานข้อมูล postgres ก็คือลบตารางและเติมข้อมูลใหม่ทุกวัน ฉันไม่ได้เปลี่ยนผู้ใช้รหัสผ่าน ฯลฯ ...

แก้ไข (mbannert): ฉันรู้สึกว่าจำเป็นต้องเพิ่มสิ่งนี้เนื่องจากเธรดเป็นที่นิยมสูงสุดใน google สำหรับปัญหานี้และสำหรับอาการหลายอย่างก็แตกต่างกัน Homebrewers น่าจะพบข้อความแสดงข้อผิดพลาดนี้:

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

ดังนั้นหากคุณเพิ่งประสบปัญหานี้หลังจากอัพเกรดโยเซมิตีคุณตอนนี้คุณจะได้รับความคุ้มครองจากการอ่านกระทู้นี้


ใช่มันไม่ควรจริง ๆ ! เมื่อคุณพูดว่า "รุ่นล่าสุด" โปรดแสดงหมายเลขรุ่นที่ถูกต้อง นอกจากนี้คุณได้วางพื้นที่ตารางบนที่จัดเก็บข้อมูลภายนอกหรือไม่ ไดเร็กทอรีข้อมูล PostgreSQL อยู่ที่ไหน
Craig Ringer

นอกจากนี้ยังpg_tblspcเป็นไดเรกทอรี วิธีเดียวที่ฉันสามารถดูไดเรกทอรีนี้และไดเรกทอรีนี้แบบสุ่มหายไปคือความเสียหายของระบบแฟ้มหรือสแกนเนอร์ไวรัสประพฤติตัวไม่ดีหรือเครื่องมือซิงค์ไฟล์
Craig Ringer

ฉันไม่มีเครื่องสแกนไวรัส ฉันไม่รู้ว่าอะไรtablespacesคืออะไรฉันจึงไม่คิดว่าจะใส่ไว้ในที่จัดเก็บข้อมูลภายนอก
Blaszard

ฮึ่ม ฉันบอกได้เลยว่ามีบางอย่างผิดปกติ pg_tblspcไม่เพียง แต่หายไปในระบบใด ๆ ที่ฉันเคยพบมาและไม่สามารถจินตนาการถึงเหตุผลที่มีเหตุผลได้ มันจะยากมากที่จะพูดว่าอะไรทำให้ระบบของคุณแตกต่างโดยไม่มีรายละเอียดเพิ่มเติม
Craig Ringer

2
คุณสามารถหาวิธีแก้ปัญหาสำหรับ @Gardecolo นี้ได้หรือไม่? ฉันมีปัญหาเดียวกันหลังจากอัปเกรดเป็น Yosemite
โดโนแวน

คำตอบ:


928

แก้ไขแล้ว ... ในบางส่วน

เห็นได้ชัดว่าการติดตั้งเวอร์ชั่นล่าสุดของ OS X (เช่น Yosemite หรือ El Capitan) จะลบบางไดเรกทอรี/usr/local/var/postgresออก

ในการแก้ไขปัญหานี้คุณเพียงแค่สร้างไดเรกทอรีที่หายไปใหม่:

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

หรือกระชับมากขึ้น ( ขอบคุณNate ):

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

เรียกใช้ใหม่pg_ctl start -D /usr/local/var/postgresตอนนี้เริ่มต้นเซิร์ฟเวอร์ตามปกติและอย่างน้อยก็สำหรับฉันโดยไม่สูญเสียข้อมูลใด ๆ

UPDATE

ในระบบของฉันไดเร็กทอรีเหล่านั้นบางอันว่างเปล่าแม้ว่า Postgres กำลังทำงานอยู่ อาจเป็นส่วนหนึ่งของการดำเนินการ "ล้าง" โยเซมิตีลบไดเรกทอรีที่ว่างเปล่า? ไม่ว่าในกรณีใดฉันไปข้างหน้าและสร้างไฟล์ '.keep' ในแต่ละไดเรกทอรีเพื่อป้องกันการลบในอนาคต

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

หมายเหตุ : การสร้าง.keepไฟล์ในไดเรกทอรีเหล่านั้นจะสร้างเสียงรบกวนใน logfile ของคุณ แต่จะไม่ส่งผลเสียต่อสิ่งอื่น


53
เพียงข้อเสนอแนะสำหรับคำสั่งที่กระชับยิ่งขึ้น: 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
เนท

26
ไฟล์. keep จริงๆทำให้ฉันรู้สึกเศร้าใจในบันทึกเซิร์ฟเวอร์:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost

13
ฉันยังขาดไดเรกทอรี pg_snapshots และ pg_stat
Jon Stevens

8
ฉันต้องสร้างไดเรกทอรีพิเศษ 'pg_replslot' ด้วย ยกเว้นว่ามันใช้งานได้ดี ขอบคุณ!
ลูคัส

6
มีประสบการณ์เช่นเดียวกับ @Lucas สำหรับ postgres ขวด 9.4.0 ฉันต้อง mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell

9

คำตอบของDonavanเป็นจุดที่ฉันต้องการเพิ่มที่ฉันทำสิ่งต่าง ๆ กับฐานข้อมูล (เช่นrake db:test) มันไปหาไดเรกทอรีต่าง ๆ ที่ไม่ได้กล่าวถึงข้างต้นและจะสำลักเมื่อพวกเขาไม่อยู่ใน เคสของฉันpg_logical/mappingsดังนั้นคุณอาจต้องการตั้งค่าเทอร์มินัลที่ทำงานอยู่:

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

และดูมันสำหรับโฟลเดอร์ที่หายไปในขณะที่คุณไปถึงกิจกรรมฐานข้อมูลทั่วไปของคุณ


3
จำเป็นต้องเพิ่ม mkdir -p / usr / local / var / postgres / pg_logical / {snapshots, การแมป}
peter_v

6

นี่เป็นหัวข้อนอกเล็กน้อย แต่น่าสังเกตว่านี่เป็นส่วนหนึ่งของกระบวนการกู้คืน PostgreSQL Yosemite ฉันมีปัญหาเดียวกันกับข้างบนและฉันมีปัญหากับ PostgreSQL "ดูเหมือน" กำลังทำงานในพื้นหลังดังนั้นแม้หลังจากเพิ่มไดเรกทอรีแล้วฉันไม่สามารถรีสตาร์ทได้ ฉันพยายามใช้pg_ctl stop -m fastเพื่อฆ่าเซิร์ฟเวอร์ PostgreSQL แต่ก็ไม่มีโชค ฉันยังลองไปตามกระบวนการโดยตรงด้วยkill PIDแต่ทันทีที่ฉันทำกระบวนการ PostgreSQL จะปรากฏขึ้นอีกครั้งด้วย PID ที่แตกต่างกัน

รหัสถูกลงทะเบียนเป็น.plistไฟล์ที่ Homebrew โหลด ... การแก้ไขสำหรับฉันคือ:

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

หลังจากนั้นฉันก็สามารถเริ่ม PostgreSQL ได้ตามปกติ


นักประดิษฐ์ของฉันได้รับการตั้งชื่อแตกต่างกันเล็กน้อย: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistแต่โดยทั่วไปนั่นก็เป็นปัญหาเดียวกันสำหรับฉันและวิธีแก้ปัญหาเดียวกัน
onekiloparsec

4

ไดเรกทอรีที่ขาดหายไปจะต้องมีอยู่ในไดเรกทอรีข้อมูล PostgreSQL ของคุณ /usr/local/var/postgres/ไดเรกทอรีข้อมูลเริ่มต้นคือ หากคุณตั้งค่าไดเรกทอรีข้อมูลอื่นคุณจะต้องสร้างไดเรกทอรีที่หายไปใหม่อีกครั้ง หากคุณแก้ไข.plistไฟล์ที่แนะนำ homebrew ซึ่งเริ่มต้น PostgreSQL คุณสามารถค้นหาไดเรกทอรีข้อมูลที่นั่น:

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

(เป็น-Dตัวเลือกที่คุณเริ่ม postgres ด้วย :)

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

ในตัวอย่างด้านบนคุณจะต้องสร้างไดเรกทอรีที่ขาดหายไป/usr/local/pgsql/dataเช่น:

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

การสร้างไดเรกทอรีที่หายไปนั้นใช้งานได้ แต่ฉันแก้ไขโดยเริ่มต้นฐานข้อมูล postgres ใหม่นี่เป็นวิธีที่สะอาดกว่าเพื่อหลีกเลี่ยงปัญหาในอนาคต

หมายเหตุ: วิธีการนี้จะลบฐานข้อมูลที่มีอยู่

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

19
แน่นอนการลบฐานข้อมูลที่มีอยู่ไม่ใช่ข้อยกเว้นเล็กน้อยที่นี่ นี่เป็นการพูดว่า "ฉันหา / var / tmp ไม่ได้ดังนั้นฉันจึงติดตั้งระบบปฏิบัติการใหม่"
Adam Donahue

4
โอ้คนนี้คือ "ทำความสะอาด" กว่าสิ่งที่ฉันสามารถคิด :) เพียงแค่หวังว่าบางสุ่มคัดลอก paster จาก interwebz ไม่ได้ถ่ายภาพนี้โดยตรงลงในคอนโซลของพวกเขาโดยไม่ได้มองไปที่มัน :)
Halil Özgür

2
ขออภัยสำหรับการลงคะแนน Greg แต่ฉันขอแนะนำ rewording โซลูชันของคุณเพื่อให้ชัดเจนว่าวิธีนี้ควรใช้ในการพัฒนาเท่านั้นหรือหากผู้ใช้สามารถล้าง DB ได้
hraynaud

1
ทำไม downvote นี้มากเหลือเกิน บนเซิร์ฟเวอร์ dev นี่เป็นวิธีที่ถูกต้อง
Jordon Bedwell

@JordonBedwell แม้กระทั่งบนเซิร์ฟเวอร์ dev เป็นความคิดที่ไม่ดีเว้นแต่คุณจะเล่นกับแอพเดียวโดยใช้ db บนคอมพิวเตอร์ของคุณ .. มันก็เหมือนกับ "ฉันไม่สามารถเริ่มโปรแกรมแก้ไขรหัสที่ชื่นชอบได้ลองติดตั้งระบบปฏิบัติการใหม่"
Andre Figueiredo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.