การเริ่มต้นเซิร์ฟเวอร์ PostgreSQL หลังจาก HDD ขัดข้องจะส่งผลให้เกิดสถานะล้มเหลว


10

ฉันใช้กับFedora 15 PostgreSQL 9.1.4Fedora ล้มเหลวเมื่อเร็ว ๆ นี้หลังจากนั้น:

ความพยายามเริ่มต้นเซิร์ฟเวอร์ PostgreSQL:

service postgresql-9.1 start

จะช่วยให้

Starting postgresql-9.1 (via systemctl):  Job failed. See system logs and 'systemctl status' for details.
                                                       [FAILED]

แม้ว่าเซิร์ฟเวอร์เริ่มทำงานตามปกติเมื่อฉันเริ่มต้นเซิร์ฟเวอร์เป็นครั้งแรกหลังจากรีบูตระบบ
แต่ความพยายามในการใช้psqlทำให้เกิดข้อผิดพลาดนี้:

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

.s.PGSQL.5432ไฟล์ไม่ปรากฏที่ใดก็ได้ในระบบ ไม่มีlocate .s.PGSQL.5432ผลอะไร


บันทึกระบบมี:

Aug 14 17:31:58 localhost systemd[1]: postgresql-9.1.service: control process exited, code=exited status=1
Aug 14 17:31:58 localhost systemd[1]: Unit postgresql-9.1.service entered failed state.

A

systemctl status postgresql-9.1.service

จะช่วยให้

postgresql-9.1.service - SYSV: PostgreSQL database server.
          Loaded: loaded (/etc/rc.d/init.d/postgresql-9.1)
      Active: failed since Tue, 14 Aug 2012 17:31:58 +0530; 58s ago
     Process: 2811 ExecStop=/etc/rc.d/init.d/postgresql-9.1 stop (code=exited, status=1/FAILURE)
     Process: 12423 ExecStart=/etc/rc.d/init.d/postgresql-9.1 start (code=exited, status=1/FAILURE)
    Main PID: 2551 (code=exited, status=1/FAILURE)
      CGroup: name=systemd:/system/postgresql-9.1.service

ผมไม่ได้มีการเปลี่ยนแปลงการตั้งค่าของ fsync onเริ่มต้นดังนั้นผมเดาว่ามันถูกกำหนดให้ ฉันอยู่บน HDD HDD ขัดข้อง

HDD ขัดข้อง

ความผิดพลาดของ HDD ส่งผลให้เกิดการเรียกใช้คู่มือfsckบนพรอมต์และไม่ใช่ gui กับมันซ่อม gazillion inodes ฯลฯ .. หลังจากที่ฉันเริ่มต้นใหม่ระบบด้วยCtrl+ +AltDelete

บันทึกของ PostgreSQL มีสิ่งนี้:

LOG:  database system was interrupted; last known up at 2012-08-14 17:31:57 IST
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/41A4E58
LOG:  redo is not required
FATAL:  could not access status of transaction 1
DETAIL:  Could not open file "pg_multixact/offsets/0000": No such file or directory.
LOG:  startup process (PID 13016) exited with exit code 1
LOG:  aborting startup due to startup process failure

ปรับปรุง

พยายามเริ่มต้นเซิร์ฟเวอร์หลังจากทำการคัดลอกระดับระบบไฟล์ของ/var/lib/pgsqlไดเรกทอรีและทำงาน./pg_resetxlog -f /var/lib/pgsql/9.1/data/ด้วยผลxlog -f /var/lib/pgsql/9.1/data/ยังคงให้ผลใน:

LOG:  database system was interrupted; last known up at 2012-08-14 18:46:36 IST
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/6000078
LOG:  redo is not required
FATAL:  could not access status of transaction 1
DETAIL:  Could not open file "pg_multixact/offsets/0000": No such file or directory.
LOG:  startup process (PID 13766) exited with exit code 1
LOG:  aborting startup due to startup process failure

และบันทึกของ Postgres เหรอ?
Milen A. Radev

@ MilenA.Radev ได้อัปเดตคำถามด้วยบันทึกของ postgres ..
ThinkingMonkey

pg_resetxlogไม่ได้ทำอะไรดีเลยคุณอยู่ในดินแดนที่สนุกสนาน คุณมีการสำรองข้อมูลของฐานข้อมูลนี้ก่อนที่จะเกิดความผิดพลาดหรือไม่?
Craig Ringer

@CraigRinger ใช่ฉันมีการสำรองข้อมูล ฉันสนุกกับการนั่งนี้จริง ๆ แล้ว
ThinkingMonkey

@ คิดว่าน่ากลัว! คุณเป็นหนึ่งในไม่กี่คนที่เลือกด้วยการสำรองข้อมูลที่ดี :-) สุจริตอาจเป็นไปได้ที่ฐานข้อมูลของคุณจะสามารถซ่อมแซมได้ แต่เนื่องจากความเสียหายของระบบไฟล์ของคุณทำลายไฟล์สำคัญคุณอาจต้องมีคนที่รู้ว่ากล้าดีของ Pg ใช้เวลาในการดึงข้อมูลออกมา บริการมีให้ที่นี่: postgresql.org/support/professional_support บางทีถ้าคุณสามารถคิดเนื้อหาจำลองสำหรับpg_multixact/offsets/0000Pg นั้นจะยอมรับ ...
Craig Ringer

คำตอบ:


15

คำตอบที่แท้จริงจะอยู่ในบันทึก PostgreSQL /var/lib/pgsql/data/pg_logใน

แต่ก่อนที่จะดำเนินการใด ๆ : มันมีความสำคัญที่คุณใช้สำเนาระดับระบบไฟล์ฐานข้อมูลของคุณก่อนที่จะพยายามซ่อมแซมถ้าใด ๆ ของข้อมูลของคุณมีค่ากับคุณ ดูhttp://wiki.postgresql.org/wiki/Corruption คุณต้องคัดลอกไดเรกทอรีข้อมูลทั้งหมด ใน Fedora นั้นเป็น/var/lib/pgsql/dataค่าเริ่มต้น แต่ยืนยันว่าถูกต้องสำหรับการติดตั้งของคุณ

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

เฉพาะเมื่อคุณทำสำเนาไฟล์ระดับระบบของไดเรกทอรีข้อมูลของคุณแล้วให้ลองใช้pg_resetxlogเพื่อล้างบันทึกธุรกรรมที่เสียหายและเริ่มฐานข้อมูลของคุณ แม้ว่ามันจะเริ่มต้น แต่ก็มีโอกาสสูงที่จะเกิดความเสียหายได้ คุณควรpg_dumpมันแล้ว re- initdbมันและคืนค่าการถ่ายโอนข้อมูลไปยังอินสแตนซ์ใหม่

หากคุณยังคงไม่สามารถเริ่มได้หลังจากpg_resetxlogบันทึกการอัปเดตแล้วของความพยายามในการเริ่มต้นหลังจาก resetxlog เป็นไปได้ที่คุณจะต้องเริ่มต้น Pg ในโหมดสแตนด์อะโลนด้วย:

sudo -u postgres postgres --single -D /var/lib/pgsql/data -P -f i postgres

หากใช้งานได้ให้backend>พรอมต์ให้ลองอีกครั้งหลังจากแทนที่ "postgres" ล่าสุดด้วยชื่อของฐานข้อมูลที่คุณต้องการเชื่อมต่อ คุณควรจะสามารถSELECT, COPYข้อมูลจากตาราง ฯลฯ

หากนั่นไม่ได้ผลนั่นคือคุณไม่สามารถเริ่มแบ็กเอนด์แบบสแตนด์อโลนได้อาจถึงเวลาที่ต้องกู้คืนจากการสำรองข้อมูล - เนื่องจากคุณมีเหตุผลเพียงพอที่จะมีแบ็กเอนด์ หากใครที่อ่านข้อความนี้อยู่ในตำแหน่งเดียวกันให้ติดต่อที่ปรึกษาที่มีประสบการณ์ของ PostgreSQLเพื่อดูว่าพวกเขาสามารถกู้คืนข้อมูลจากฐานข้อมูลของคุณได้หรือไม่ เตรียมพร้อมที่จะจ่ายสำหรับเวลาและความเชี่ยวชาญของพวกเขา

ระบบไฟล์ของคุณอาจเสียหาย

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

ฉันจะไม่ไว้วางใจระบบไฟล์นี้หรือไม่fsckfsck

สมาร์ท - ทดสอบไดรฟ์ของคุณ

ฉันยังแนะนำให้คุณเรียกใช้การSMARTตรวจสอบฮาร์ดไดรฟ์ของคุณด้วยsmartctlจาก smartmontools สมมติว่ามัน/dev/hdaเป็นsmartctl -d ata -a /dev/sda | lessอย่างนั้น ค้นหาการทดสอบสุขภาพที่ล้มเหลวuncorrectable_sectorsอัตราการอ่านผิดพลาดสูง reallocated_sector_count มากกว่า 2 หรือ 3 หรือ current_pending_sector ที่ไม่ใช่ศูนย์ เรียกใช้smartctl -d ata -t long /dev/sdaการทดสอบด้วยตนเองแบบไม่ทำลายบน HDD ของคุณ มันจะไม่ขัดจังหวะการทำงานปกติของระบบ เมื่อเวลาที่ประมาณได้ผ่านไปให้เรียกใช้smartctl -d ata /dev/sdaอีกครั้งและดูที่บันทึกการทดสอบตัวเองเพื่อดูว่าผ่านไปแล้วหรือไม่

หากมีสิ่งใดที่ดูไม่สมบูรณ์แบบให้เปลี่ยนไดรฟ์

ในอนาคตพิจารณาการทดสอบนี้โดยอัตโนมัติผ่านทางsmartdสำหรับการเตือนล่วงหน้าของความล้มเหลวของไดรฟ์

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


ฉันได้เพิ่มบันทึกของ postgres ในคำถาม ผมไม่ได้มีการเปลี่ยนแปลงการตั้งค่าของการเริ่มต้นเพื่อให้ฉันเดามันถูกกำหนดให้fsync onฉันอยู่บน HDD ใช่ HDD ขัดข้อง ฉันไม่ได้ใช้พื้นที่ดิสก์หมด ไม่มีข้อผิดพลาดของหน่วยความจำ / ความร้อนสูงเกินไป / สะดุดผ่านสายเคเบิล / Kerpanic
ThinkingMonkey

@ThinkingMonkey "HDD crash" ประเภทใด คุณต้องกู้คืนข้อมูลในฮาร์ดไดรฟ์เพื่อคัดลอกไฟล์ไปยังไดรฟ์ใหม่หรือไม่? คุณต้องทำงานfsckและซ่อมแซมระบบไฟล์หรือไม่? รายละเอียดโปรด เขียนเรื่องราวความผิดพลาดของคุณ
Craig Ringer

ความผิดพลาดของ HDD ทำให้เกิดการเรียกใช้คู่มือfsckสำหรับ ด้วยการซ่อม inodes gazillion ฯลฯ หลังจากนั้นระบบเริ่มต้นใหม่ มีการปรับปรุงข้างต้นในคำถามเช่นกัน
ThinkingMonkey

@ThinkingMonkey ตกลงตอบรับการอัปเดต TL; DR: ทำสำเนาระดับระบบไฟล์ที่สมบูรณ์ของ / var / lib / pgsqlจากนั้นเรียกใช้pg_resetxlog
Craig Ringer

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