เป็นไปได้หรือไม่ที่จะสร้าง / กู้คืนสแน็ปช็อตฐานข้อมูลด้วย PostgreSQL อย่างรวดเร็ว


51

ก่อนอื่นฉันเป็นนักพัฒนาไม่ใช่ DBA หรือดูแลระบบ กรุณาอ่อนโยน :)

ฉันกำลังทำงานกับเวิร์กโฟลว์แอปพลิเคชันซึ่งการกระทำของผู้ใช้เพียงคนเดียวจะทำให้เกิดการเปลี่ยนแปลงที่ซับซ้อนในฐานข้อมูล - สร้างหลายร้อยระเบียนในบางตารางปรับปรุงหลายร้อยระเบียนในที่อื่น ๆ ฯลฯ ทั้งหมดในทั้งหมดประมาณ 12 ตาราง (จาก ~ 100 ) ได้รับการสัมผัสจากการกระทำนี้ เนื่องจากความซับซ้อนมันยากมากสำหรับฉันที่จะย้อนกลับการเปลี่ยนแปลงทั้งหมดด้วยตนเองก่อนที่ฉันจะสามารถทำการทดสอบอื่นได้ ในช่วงเวลาส่วนใหญ่ของฉันฉันสามารถแทรกคำสั่ง "ย้อนกลับ" ใกล้ถึงจุดสิ้นสุดของเวิร์กโฟลว์ แต่เมื่อฉันเข้าใกล้การยอมรับการเปลี่ยนแปลงของฉันฉันต้องทดสอบของจริง

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

ฉันรับประกันว่าจะเป็นผู้ใช้คนเดียวในระบบและฉันมีสิทธิ์เข้าถึงรูต ดัมพ์ฐานข้อมูลคือ ~ 100MB เมื่อ tar'ed และ gzip'ed เวอร์ชัน PostgreSQL คือ 8.3

ขอบคุณล่วงหน้าสำหรับความคิดที่เป็นประโยชน์


คุณบอกว่าคุณมีการถ่ายโอนข้อมูลฐานข้อมูลไม่เพียงพอหรือไม่ ทดสอบระบบของคุณหากมีสิ่งผิดปกติใช้ดัมพ์เพื่อรับ DB กลับสู่สถานะดั้งเดิมและพัฒนาต่อไป
DrColossos

1
คุณกำลังกู้คืนเฉพาะตารางที่มีการเปลี่ยนแปลงหรือไม่?
แจ็คดักลาส

1
@ แจ็คดักลาส: ฉันกู้คืนฐานข้อมูลที่สมบูรณ์จากการถ่ายโอนข้อมูล ตารางที่เป็นปัญหาประกอบด้วยข้อมูลประมาณ 2/3 ของข้อมูลและฉันยังคงต้องกังวลเกี่ยวกับลำดับการเรียกคืนที่ถูกต้องและข้อ จำกัด ของรหัสต่างประเทศ
Zilk

1
@DrColossus: ใช่การถ่ายโอนข้อมูลเพียงพอที่จะกู้คืนสถานะก่อนหน้า แต่การสร้างและใช้งานจะช้ามาก
Zilk

คำตอบ:


35

คุณสามารถใช้สแน็ปช็อตระดับระบบไฟล์ แต่มักจะค่อนข้างยุ่งยากต้องการระบบไฟล์พิเศษและไม่สามารถใช้งานได้ตลอดเวลาโดยเฉพาะกับแล็ปท็อปที่มีอายุมาก ;-)

วิธีการเกี่ยวกับคุณสร้างสถานะฐานของคุณเป็นฐานข้อมูลแล้วสร้างฐานข้อมูลใหม่จากนั้นสำหรับการทดสอบการทำงานของคุณโดยใช้CREATE DATABASE ... TEMPLATEฟังก์ชั่น หลังจากการทดสอบคุณทิ้งฐานข้อมูลนั้นไป จากนั้นข้อ จำกัด ความเร็วของคุณจะใช้เวลาเพียงcp -Rไดเรกทอรีฐานข้อมูล มันเร็วพอ ๆ กับที่คุณจะไม่มีระบบสแนปชอตของไฟล์


นั่นเป็นความคิดที่ดีมาก ฉันไม่ได้คิดถึงแม่แบบฐานข้อมูลเลย ขอขอบคุณ!
Zilk

1
นี่เป็นทางออกที่ดีเยี่ยมเร็วกว่าการกู้คืนแบบหล่น 5 เท่า แต่มีข้อเสียเดียว: คุณต้องทำการเชื่อมต่อปัจจุบันก่อนที่จะทำสิ่งนี้มิฉะนั้นจะไม่สามารถทำงานได้
sorin

อัปเดต: สิ่งนี้จะไม่ทำงานในการผลิตเพราะฐานข้อมูลต้นทางจะมีการเชื่อมต่อกับมัน เราต้องการทางออกอื่น
sorin

11

ใช้Stellarเหมือนgitสำหรับฐานข้อมูล:

Stellar ช่วยให้คุณสามารถกู้คืนฐานข้อมูลได้อย่างรวดเร็วเมื่อคุณกำลังเขียนการย้ายฐานข้อมูลการสลับสาขาหรือการยุ่งกับ SQL รองรับ PostgreSQL และ MySQL (บางส่วน)



liquibase ไม่รองรับเช่น Stellar ซึ่งคุณอาจทำงานกับฐานข้อมูล (เช่นในการทดสอบหน่วย) และอาจต้องย้อนกลับไปยังสถานะหรือเวลาที่ติดแท็กก่อนหน้านี้
Andreas Dietrich

ดาวฤกษ์ฟังดูเหมือนเป็นความคิดที่ดี แต่ไม่ได้ผลสำหรับฉัน
ออร์แลนโด

5

หากฐานข้อมูลของคุณทำงานในVirtualboxคุณสามารถบันทึกสแน็ปช็อตและกู้คืนสแน็ปช็อตทั้งสถานะฐานข้อมูลและระบบปฏิบัติการเองได้ในไม่กี่วินาที (หรือ 1-2 นาทีหากคุณมีข้อมูลจำนวนมากในฐานข้อมูลหรือระบบปฏิบัติการหรือ หน่วยความจำเล็ก ๆ ที่จัดสรรให้กับเครื่องเสมือน) ฟรี

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


บนไซต์ที่ใช้งานจริงฉันใช้การสำรองข้อมูลสแน็ปช็อตของMediaTempleเพื่อให้ได้ผลลัพธ์เดียวกัน (แต่จะเป็น 20 $ ต่อสล็อตสำรองและเฉพาะสำหรับบริการโฮสต์เว็บนั้นดังนั้นจึงอาจไม่เหมาะกับคุณ)


อาไม่เป็นไรฉันไม่เห็นความคิดเห็นของคุณที่กล่าวถึงคุณรู้เกี่ยวกับกล่องเสมือน
wildpeaks

3

อาจไม่ใช่คำตอบที่คุณคาดหวัง แต่คุณคิดว่าจะมีระดับต่ำกว่าสำหรับการถ่ายภาพสแนปชอต - LVM หรือไม่?


ใช่นั่นเป็นสิ่งที่นึกขึ้นได้ น่าเสียดายที่ FS ที่ฉันใช้อยู่ในปัจจุบันไม่รองรับสแน็ปช็อตระบบไฟล์ (ext3) อีกทางเลือกหนึ่งคือการตั้งค่า VM เช่น Virtualbox สำหรับการทดสอบการทำงาน
Zilk

2

พบคำถามนี้เมื่อพยายามทำสิ่งเดียวกันและจบลงด้วยการใช้ git ในไดเรกทอรีข้อมูล postgresql การยกเลิกการเปลี่ยนแปลงนั้นง่ายเหมือน:

git reset --hard

6
นี่คือไม่ใช้สำหรับฐานข้อมูลขนาดใหญ่ นอกจากนี้ทำไมการทรมานคอมไพล์ด้วยไฟล์ไบนารีที่มีขนาดต่างกัน?
RolandoMySQLDBA

0

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


0

แม้ว่าฉันจะต้องพูดStellarและgit reset --hardเป็นทางออกที่น่าสนใจ แต่ฉันจะมีปัญหากับฐานข้อมูลและการทดสอบที่ใหญ่ขึ้นและฉันจะใช้Virtualboxวิธีแก้ไขปัญหาอื่น ๆ ไม่ว่าในการทดสอบที่ใหญ่กว่านี้จะกลายเป็น "ปัญหา" เมื่อคุณ กำลังใช้โซลูชั่นโลหะเปลือย ฯลฯ

ดังนั้นฉันต้องพูดถึงZFSว่าเป็นระบบไฟล์ที่ต้องพิจารณาสิ่งเหล่านี้ในอนาคตด้วยเหตุผลต่อไปนี้ที่ @Peter Eisentraut ยังกล่าวถึง:

  1. Snapshots - โดยเฉพาะอย่างยิ่งเมื่อคุณทำการเรพลิเคทจาก Prod ถึง QA / DR คุณสามารถใช้ "filesystem" เดียวกันสำหรับการทดสอบ:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. เพื่อทำการทดสอบก่อนที่การทดสอบจะหยุด postgresql ดังกล่าวข้างzfs snapshot $SNAPSHOTต้นเริ่มต้น postgresql จากนั้นจึงย้อนกลับหยุดการ postgresql และเพียงแค่zfs rollback $SNAPSHOT

  2. การบีบอัด - Postgresql ได้รับการบีบอัด 3: 1 ตามปกติในฐานข้อมูลของฉันเพื่อให้คุณสามารถทำการทดสอบได้มากขึ้น;)

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