PostgreSQL 9.1 Hot Backup Error: ระบบฐานข้อมูลเริ่มต้นขึ้น


16

ฉันได้ทำงานกับการสำรองข้อมูลที่ร้อนแรงสำหรับ Postgres 9.1 มานานแล้วและพบปัญหาที่สอดคล้องกัน หลังจากรีสตาร์ท Postgres บนเซิร์ฟเวอร์ทาสไฟล์บันทึก pgstartup และไฟล์บันทึกประจำวันภายใต้ไดเร็กทอรี pg_log จะอ่านโดยไม่มีข้อผิดพลาด อย่างไรก็ตามเมื่อฉันพยายามเข้าสู่ฐานข้อมูลโดยใช้คำสั่ง psql ฉันได้รับข้อผิดพลาด:

FATAL: ระบบฐานข้อมูลเริ่มต้นขึ้นแล้ว

ไฟล์ recovery.conf จะไม่หันไปใช้ recovery.done ฉันค้นคว้าข้อผิดพลาดนี้อย่างครอบคลุมและพบคำตอบเดียวกัน: ฐานข้อมูลยังไม่ได้ปิดอย่างสมบูรณ์ก่อนที่ฉันจะพยายามเริ่ม Postgres ใหม่ วิธีเดียวที่ฉันรีสตาร์ท Postgres คือผ่านservice postgresql-9.1 restartหรือ/etc/init.d/postgresql-9.1 restartคำสั่ง หลังจากฉันได้รับข้อผิดพลาดนี้ฉันจะฆ่ากระบวนการทั้งหมดและลองรีสตาร์ทฐานข้อมูลอีกครั้งและยังคงได้รับข้อผิดพลาดเดิมอีกครั้ง ฉันกำลังสูญเสียที่จะไปจากที่นี่และวิธีการแก้ไขปัญหานี้ ด้านล่างเป็นกระบวนการที่แน่นอนที่ฉันได้ทำเพื่อให้การสำรองข้อมูลเสร็จสมบูรณ์

การกำหนดค่าเซิร์ฟเวอร์หลัก:

pg_hba.conf เพิ่มบรรทัด:

การจำลองแบบโฮสต์ postgres เชื่อถือ IPAddressOfSlaveServer

postgresql.conf:

wal_level = hot_standby
max_wal_senders = 5
Listen_address = '*'
พอร์ต = 5432
max_wal_senders = 5
wal_keep_segments = 32

การกำหนดค่าเซิร์ฟเวอร์ Slave:

postgresql.conf:

hot_standby = เปิด

recovery.conf:

standby_mode = เปิด
primary_conninfo = host = IPAddressOfMasterServer
พอร์ต = 5432
user = postgres
restore_command = 'cp /var/lib/pgsql/9.1/data/pg_xlog/%f "% p"'

หลังจากกำหนดค่าเซิร์ฟเวอร์ทั้งสอง

ฉันเปลี่ยนเป็นผู้ใช้ postgres บนเซิร์ฟเวอร์ต้นแบบและรันคำสั่ง:

psql -c "เลือก pg_start_backup ('ป้ายกำกับ', จริง);";
rsync -a -v -e ssh /var/lib/pgsql/9.1/data ทาส: /var/lib/pgsql/9.1/data \
        - ยกเว้น postmaster.pid
pgsql -c "select pg_stop_backup ();";

หลังจากซิงค์ฐานข้อมูลกับเซิร์ฟเวอร์ทาส

ฉันรีสตาร์ทเซิร์ฟเวอร์ทาสและการเริ่มต้นไม่ล้มเหลว pgstartup.log อ่าน:

ความสำเร็จ ตอนนี้คุณสามารถเริ่มเซิร์ฟเวอร์ฐานข้อมูลโดยใช้:

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
หรือ
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l logfile start

ไฟล์บันทึกวันปัจจุบัน postgresql-Thu.log อ่าน:

เข้าสู่ระบบ: ปิดตัวลง
เข้าสู่ระบบ: ระบบฐานข้อมูลปิดตัวลง
เข้าสู่ระบบ: ระบบฐานข้อมูลถูกปิดตัวลงในการกู้คืนที่ 2012-4-10
เข้าสู่ระบบ: เข้าสู่โหมดสแตนด์บาย
บันทึก: ไฟล์บันทึกที่เรียกคืน "logFileName" จากไฟล์เก็บถาวร
เข้าสู่ระบบ: สถานะการกู้คืนที่สอดคล้องถึง 0 / BF0000B0
บันทึก: ทำซ้ำเริ่มต้นที่ 0 / BF000020
บันทึก: ไฟล์บันทึกที่เรียกคืน "logFileName" จากไฟล์เก็บถาวร
บันทึก: pageaddr ที่ไม่คาดคิด 0/85000000 ในล็อกไฟล์ 0, เซ็กเมนต์ 192, offset 0
บันทึก: pageaddr ที่ไม่คาดคิด 0/85000000 ในล็อกไฟล์ 0, เซ็กเมนต์ 192, offset 0
เข้าสู่ระบบ: การจำลองแบบสตรีมมิ่งเชื่อมต่อกับหลักเรียบร้อยแล้ว

ฉันค้นคว้า pageaddr ที่ไม่คาดคิดและจากคลังเก็บ postgres ฉันเข้าใจว่ามันค่อนข้างปกติและเป็นหนึ่งในวิธีที่คาดหวังในการตรวจหาจุดสิ้นสุดของ WAL

คำแนะนำใด ๆ ที่จะได้รับการชื่นชมอย่างมาก

คำตอบ:


11

ข้อความ "ระบบฐานข้อมูลเริ่มต้นแล้ว" ไม่ได้ระบุข้อผิดพลาด เหตุผลที่อยู่ในระดับ FATAL คือเพื่อให้มันเสมอไปที่บันทึกโดยไม่คำนึงถึงการตั้งค่าของlog_min_messages:

http://www.postgresql.org/docs/9.1/interactive/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN

หลังจาก rsync คุณแสดงสิ่งที่คุณแสดงจริง ๆ หรือไม่:

pgsql -c "select pg_stop_backup ();";

เนื่องจากมีเท่าที่ฉันรู้ไม่มีpgsqlปฏิบัติการที่จะออกจากการสำรองข้อมูลที่ไม่สมบูรณ์และทาสจะไม่ออกมาจากโหมดการกู้คืน ในทางกลับกันบางทีคุณอาจทำงานจริง ๆpsqlเพราะมิฉะนั้นฉันไม่เห็นว่าทาสจะบันทึกข้อความความสำเร็จเช่น:

เข้าสู่ระบบ: สถานะการกู้คืนที่สอดคล้องถึง 0 / BF0000B0

และ:

เข้าสู่ระบบ: การจำลองแบบสตรีมมิ่งเชื่อมต่อกับหลักเรียบร้อยแล้ว

คุณลองเชื่อมต่อกับทาส ณ จุดนี้หรือไม่? เกิดอะไรขึ้น?

ข้อความ "สำเร็จตอนนี้คุณสามารถเริ่ม ... " ที่คุณพูดถึงนั้นสร้างขึ้นโดยinitdbไม่ควรเรียกใช้เป็นส่วนหนึ่งของการตั้งค่าทาส ดังนั้นฉันคิดว่าคุณอาจสับสนกับบางสิ่งที่นั่น ฉันยังกังวลเกี่ยวกับข้อความที่ขัดแย้งกันเหล่านี้อย่างชัดเจน:

วิธีเดียวที่ฉันรีสตาร์ท Postgres คือผ่านรีสตาร์ทเซอร์วิส postgresql-9.1 หรือ /etc/init.d/postgresql-9.1 รีสตาร์ท หลังจากฉันได้รับข้อผิดพลาดนี้ฉันจะฆ่ากระบวนการทั้งหมดและลองรีสตาร์ทฐานข้อมูลอีกครั้ง ...

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

log_line_prefix = '[%m] %p %q<%u %d %r> '

recovery.confสคริปต์มีลักษณะแปลก คุณกำลังคัดลอกจากไดเรกทอรี pg_xlog ของต้นแบบไดเรกทอรี pg_xlog ที่ใช้งานอยู่ของทาสหรือไดเรกทอรีเก็บถาวร?


8

ฉันมีปัญหาบางอย่างเกี่ยวกับเรื่องนี้เช่นกันยกเว้นเมื่อวันที่ 9.3 ไม่ใช่ 9.1 อย่างไรก็ตามการแก้ไขกลายเป็นเรื่องเล็กน้อย:

postgresql.confไฟล์ที่ถูกคัดลอกมาจากต้นแบบทาสและฉันถูกทิ้งไว้ไม่แปรบนทาส ฉันคิดว่าสิ่งที่คุณต้องทำคือเพิ่มrecovery.confไฟล์และทุกอย่างจะทำงานได้ (มันทำได้ แต่ฉันไม่สามารถลงชื่อเข้าใช้เซิร์ฟเวอร์ทาสที่จำลองแบบได้ แต่มันถูกทำซ้ำ)

ฉันแก้ไขpostgresql.confไฟล์ของ slave และ:

  • แสดงความคิดเห็นออก archive_mode=on
  • แสดงความคิดเห็นarchiveคำสั่ง; และ
  • แสดงความคิดเห็น hot_standby=on

นั่นแหละ: ฉันสามารถทำให้ฐานข้อมูลเป็นเซิร์ฟเวอร์แบบอ่านอย่างเดียวพร้อมที่จะตอบแบบสอบถามแบบอ่านอย่างเดียว

มีสคริปต์ที่เรียกpg_basebackupว่าจะสร้างไดเร็กทอรี bootstrap สำหรับสลาฟ นี่คือไดเรกทอรีข้อมูลพร้อมฐานข้อมูล คุณต้องแก้ไขpostgresql.confไฟล์ก่อนจึงจะสามารถใช้เป็นทาสได้ตามที่อธิบายไว้สิ่งที่ง่ายสำหรับpg_basebackupสคริปต์โพสต์


1
เมื่อคุณเขียน "commented out hot_standby = บน" ฉันคิดว่าคุณหมายถึง "ลบ # -comment-mark ก่อนเพื่อเปิดใช้งาน hot_standby" :) หากไม่ได้อยู่ใน hot_standby db จะเป็น "เริ่มต้น" โดยอบอุ่น สแตนด์บายพร้อมสำหรับการล้มเหลว แต่ไม่ต้องสอบถาม) โปรดทราบว่าถ้าคุณทำดัมพ์ฐานรองโดยไม่มี wal_level = hot_standby บนต้นแบบจากนั้นเปิด hot_stanby บนสเลฟคุณจะต้องดัมพ์อีกครั้งและเริ่มต้น db ฐานข้อมูลอีกครั้งสำหรับ hot_standby เพื่อให้ทำงานได้ มิฉะนั้นคุณจะได้รับข้อผิดพลาดร้ายแรง
Frederik Struck-Schøning

จำเป็นต้องมี hot_standby = เปิดคุณต้องอยู่ที่นั่น
Abhilash Mishra

7

น่าสนใจที่ฉันแก้ไขเรื่องนี้ในทางตรงกันข้ามที่เปาโลทำ

ฉันเพิ่ม:

hot_standby = on

หรือค่อนข้างเปลี่ยน#hot_standby = offไปด้านบน (สิ่งนี้ใช้ 9.5)


1

ฉันได้รับสิ่งนี้ในบันทึก:

MSK FATAL:  the database system is starting up

หากต้องการแก้ไขการเริ่มต้นเซิร์ฟเวอร์แบบไม่สิ้นสุดให้ทำดังนี้: หยุดบริการ (หากมีอยู่) ให้ฆ่ากระบวนการ 'postgres' (โดยปกติจะมีอยู่) รันสิ่งนี้ในคอนโซล:

pg_resetxlog.exe -D ../Data -f

ussue นี้ปรากฏขึ้นเนื่องจากไดเรกทอรี xLog มีข้อมูลซึ่งไม่สามารถเขียนได้ก่อนปิดการให้บริการ และเมื่อเริ่มบริการเขาพยายามแก้ไขข้อมูลนั้น บางครั้งก็หยุดการเริ่มต้นและไม่สิ้นสุด .. คำสั่งที่ล้างข้อมูลที่ไม่ได้รวมนี้ที่ใช้บริการเพื่อเริ่มต้นด้วยข้อมูลคงที่เท่านั้น อาจมีบางส่วนของข้อมูลที่ไม่รวมจะสูญหาย แต่เซิร์ฟเวอร์ฐานข้อมูลจะทำงานตามปกติและสามารถเข้าถึงได้โดยแอป

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