Postgres ดัมพ์เฉพาะบางส่วนของตารางสำหรับ dev snapshot


97

ในการผลิตฐานข้อมูลของเรามีขนาดไม่กี่ร้อยกิกะไบต์ สำหรับการพัฒนาและการทดสอบเราจำเป็นต้องสร้างสแนปชอตของฐานข้อมูลนี้ที่มีฟังก์ชันเทียบเท่ากัน แต่มีขนาดเพียง 10 หรือ 20 กิ๊กเท่านั้น

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

ตัวอย่างเช่นสมมติว่าเรามีเอนทิตีที่มีความสัมพันธ์แบบกลุ่มต่อกลุ่มเหล่านี้:

  • บริษัท มีแผนก N
  • แผนกมีพนักงาน N
  • พนักงานมีประวัติผู้เข้าร่วม N

อาจมี บริษัท 1,000 แห่งแผนก 2,500 คนพนักงาน 175,000 คนและประวัติการเข้าร่วมงานหลายสิบล้านคน เราต้องการวิธีที่จำลองแบบเพื่อดึงพูด, 100 บริษัท แรกและทุกหน่วยงานที่เป็นส่วนประกอบพนักงานและการเข้าร่วมของมัน

ปัจจุบันเราใช้ pg_dump สำหรับสคีมาจากนั้นเรียกใช้ pg_dump ด้วย --disable-trigger และ --data-only เพื่อดึงข้อมูลทั้งหมดออกจากตารางขนาดเล็ก เราไม่ต้องการที่จะต้องเขียนสคริปต์ที่กำหนดเองเพื่อดึงข้อมูลบางส่วนออกมาเนื่องจากเรามีวงจรการพัฒนาที่รวดเร็วและกังวลว่าสคริปต์ที่กำหนดเองจะเปราะบางและมีแนวโน้มที่จะล้าสมัย

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

คำแนะนำทั่วไปใด ๆ ที่ชื่นชม!

คำตอบ:


108

บนโต๊ะขนาดใหญ่ของคุณคุณสามารถใช้คำสั่ง COPY เพื่อดึงเซตย่อย ...

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

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


1
ฉันใช้เทคนิคนี้จนประสบความสำเร็จอย่างมากในการทำสิ่งเดียวกันกับ OP สำหรับการทดสอบการทำงานฉันโหลด COPY (SELECT .. ) TO .. ​​ข้อมูลที่ถูก จำกัด ลงในฐานข้อมูล "template" และใช้ CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX แน่นอนว่าฉันรวบรวมข้อมูลให้เหลือน้อยที่สุดดังนั้นสแนปชอตของผลิตภัณฑ์ที่โหลดและทดสอบการดำเนินการสร้างฐานข้อมูลนั้นเร็วพอที่จะไม่เป็นอุปสรรคของทีม
Trey

5
มีวิธีใดบ้างที่จะทำให้มันใช้งานได้หากคุณมีตารางที่เข้าร่วมหลายตารางที่คุณต้องการสแนปชอต COPY FROM ไม่รองรับการนำเข้าหลายตาราง
mlissner

1
คุณคือผู้ชาย ... สิ่งนี้ทำให้ฉันง่ายมาก แต่มีจุดประสงค์อื่น ฉันใช้เพื่อย้ายข้อมูลจากสคีมาสาธารณะไปยังสคีมาเฉพาะของผู้ใช้ในแอปที่มีผู้เช่าหลายราย ขอบคุณ!
Jeremy F.

5
โปรดทราบว่าวิธีนี้ไม่ได้อัพเดตลำดับบนตารางที่คัดลอกดังนั้นการแทรกเพิ่มเติมอาจละเมิดข้อ จำกัด ของคีย์หลัก
user2859458

1
ฉันต้องใช้\copyแทนCOPYเช่นกันเพราะตัวหลังเป็น superuser-only โชคดีที่ทุกอย่างทำงานได้อย่างสมบูรณ์โดยไม่มีการเปลี่ยนแปลงอื่น ๆ ใน 9.1
PJSCopeland

8

ฉันไม่รู้เกี่ยวกับซอฟต์แวร์ใด ๆ ที่ทำสิ่งนี้อยู่แล้ว แต่ฉันคิดวิธีแก้ปัญหาทางเลือกได้ 3 ทาง น่าเสียดายที่พวกเขาทั้งหมดต้องการการเข้ารหัสที่กำหนดเอง

  1. สร้างตารางทั้งหมดใหม่ในสคีมาแยกจากนั้นคัดลอกลงในตารางเหล่านั้นเฉพาะส่วนย่อยของข้อมูลที่คุณต้องการถ่ายโอนข้อมูลโดยใช้INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...และถ่ายโอนข้อมูลนั้น

  2. เขียนสคริปต์ของคุณเองสำหรับการถ่ายโอนข้อมูลเป็นคำสั่ง SQL ฉันเคยใช้วิธีนี้ในอดีตและใช้เวลาเพียง 20-30 บรรทัดของ PHP

  3. แก้ไข pg_dump เพื่อให้ยอมรับเงื่อนไขพร้อมกับสวิตช์ -t เมื่อดัมพ์ตารางเดียว


6

http://jailer.sourceforge.net/ทำสิ่งนี้


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

3
นั่นไม่สมเหตุสมผลที่นี่ OP ขอโดยเฉพาะสำหรับชื่อของเครื่องมือของบุคคลที่สามที่ทำสิ่งนี้ สาระสำคัญของคำตอบจึงมีเพียง "มีเครื่องมือของบุคคลที่สามที่เรียกว่า" Jailer "ที่ทำสิ่งนี้ที่ URL นี้" ลิงก์นั้นให้ข้อมูลที่จำเป็นทั้งหมด ไม่มีอะไรจะเพิ่มอีก หากลิงก์นั้นหยุดทำงานก็สามารถอนุมานได้ง่ายจาก URL ว่า "โปรแกรมเรียกว่า Jailer" ดังนั้นการเพิ่มสิ่งนั้นจะซ้ำซ้อน
Paul Legato

2
แน่นอนว่าตอนนี้ลิงค์เสียและ google ก็ไม่มีทางเลือกอื่น
owensmartin

1
ขณะนี้ลิงก์ใช้งานได้สำหรับฉันและ Google สำหรับ "ผู้คุม postgres" ก็เปิดใช้github.com/Wisser/Jailerด้วย
Paul Legato

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