ฉันจะส่งออกชุดย่อยของ tabledata จากฐานข้อมูล prodution ไปยังฐานข้อมูลการทดสอบในพื้นที่ได้อย่างไร


10

เรามีฐานข้อมูลการผลิต postgres ที่ค่อนข้างใหญ่: ~ 20GB ฐานข้อมูล PostgreSQL โฮสต์บน heroku

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

ฉันไม่ต้องการสร้างข้อมูลตัวอย่างด้วยตนเอง แต่ควรใช้ข้อมูลที่มีอยู่แล้วในสภาพแวดล้อมการผลิต

ประมาณ 100 แถวจากแต่ละตารางในฐานข้อมูลจะเพียงพอ มีวิธีง่ายๆในการทำสิ่งนี้หรือไม่?


1
เพิ่งออกมาจากความอยากรู้อยากเห็นทำไมพื้นที่ว่างในดิสก์มากเกินไปถึง 20GB ฉันได้จัดสรร 100GB บนดิสก์ทดสอบของฉันบน VM ของฉันสำหรับพื้นที่รอยขีดข่วนฐานข้อมูล
jcolebrand

เนื่องจากบางครั้งฉันไม่ได้พกพา hd ภายนอกของฉันกับฉัน ssd ของฉันจึงไม่มีพื้นที่เพียงพอ นอกจากนี้ฉันต้องการเพียงข้อมูลตัวอย่างจากฐานข้อมูลของฉันเท่านั้นไม่ใช่ฐานข้อมูลทั้งหมด
jottr

1
ยุติธรรมเพียงพอ แต่ฉันขอแนะนำให้คุณยังคงได้รับความคิดสร้างสรรค์ พิจารณาการ์ด SD ให้พอดีกับช่องเสียบ SD เนื่องจากฉันไม่เคยมีปัญหากับการมีข้อมูลเพิ่มเติม :-) แต่นั่นก็แย่มาก: - \ แล็ปท็อปส่วนตัวของฉันลงไปจนถึง 10GB ฟรีครั้งสุดท้าย
jcolebrand

คำตอบ:


3

ฉันไม่ได้ใช้เครื่องมือนี้ แต่ Jailer สัญญาว่าจะทำเช่นนั้น

เครื่องมือการจัดฐานข้อมูลและเรียกดูฐานข้อมูล ส่งออกชุดข้อมูลที่สอดคล้องอ้างอิงแถวจากฐานข้อมูลเชิงสัมพันธ์ (JDBC)

http://sourceforge.net/projects/jailer/


1

Jailer สามารถช่วยได้ในสถานการณ์นี้ ฉันกำลังทำงานกับระเบียนเดียวกับคุณ (พยายามรับ ~ 100 ระเบียนของแต่ละตาราง) และนี่คือขั้นตอนที่ฉันทำ: - ค้นหาเอนทิตีรูท (อันที่เกี่ยวข้องกับตารางเกือบ) และรับเซตย่อยของบันทึกของ แถว root (เช่น root คือคนจากนั้นฉันจะค้นหาระเบียนที่เกี่ยวข้องทั้งหมดให้กับ people.id = 1 ... ) - หลังจากเสร็จสิ้นขั้นตอนที่ 1 เริ่มต้นอีกครั้งด้วยตารางอื่น (ตารางที่คุณต้องการมี 100 บันทึก ) และรับเซตย่อยจากผลลัพธ์ด้านบน


1

อีกตัวเลือกหนึ่งคือสิ่งที่ฉันเพิ่งเจอ (รับผมยังไม่ได้ใช้ แต่แผนการที่จะเร็ว ๆ rdbms-subsetterนี้):

มันง่ายและเบากว่า Jailer นิดหน่อยโดยมีคุณสมบัติ / ประโยชน์ที่ดี:

  • CLI ง่ายมากที่จะต่อสายเครื่องมือที่มีอยู่
  • โอเพ่นซอร์ส
  • จะทำตามคีย์ต่างประเทศเพื่อดึงชุดย่อยของข้อมูลที่ สอดคล้องกัน
    • หากคุณไม่มีคีย์ต่างประเทศที่กำหนดชัดเจนคุณสามารถระบุความสัมพันธ์ผ่านไฟล์กำหนดค่า JSON ในกรณีของฉันฉันวางแผนที่จะสร้างการกำหนดค่านี้จาก schema metadata ที่เก็บไว้ที่อื่น (ขอบคุณ Rails: \)
  • คุณสามารถกำหนดเป้าหมายแถวที่เฉพาะเจาะจงและได้รับทั้งหมดระเบียนที่เกี่ยวข้อง (เช่นลูกค้าที่เฉพาะเจาะจงมีปัญหาเพื่อให้คุณสามารถดึงลงมาทุกอย่างเพื่อให้ข้อมูลการทำงานบัญชีของพวกเขาสามารถเข้าถึงได้ในประเทศ)
  • สามารถใช้จำนวนระเบียนต่อตารางคงที่หรือใช้ลอการิทึมเพื่อรับข้อมูลเพิ่มเติมจากตารางที่ใหญ่กว่าโดยไม่ต้องลงน้ำมากเกินไป

เป็นมูลค่าการกล่าวถึงตัวเลือกอื่นสำหรับฐานข้อมูล Heroku โดยเฉพาะซึ่งฉันได้ใช้บ่อยๆ (เหมือนที่เคยทำงานที่นั่น)

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

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

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

ในคำสั่งที่ข้างต้นถ้าคุณมีฐานข้อมูลสามารถเข้าถึงได้ด้วยDATABASE_URLในการyour-production-appที่คุณจะจบลงด้วยฐานข้อมูลสามารถเข้าถึงได้ด้วยPRODUCTION_SNAPSHOT_URL(ถ้าคุณระบุไว้--as) ใน app some-other-app-to-own-forked-databaseชื่อที่แตกต่างกัน


0

ในการรับชุดแถวแบบสุ่มคุณสามารถใช้LIMITเช่นนี้:

SELECT * FROM my_table LIMIT 100

นี่เป็นวิธีที่ง่ายที่สุดและจะเลือก 100 แถวแรกที่ PostreSQL เจอ มันอาจจะแทรก 100 ครั้งล่าสุดหรืออาจเป็น 100 ก่อน หากคุณต้องการสิ่งที่สุ่มจริงๆดูที่คำตอบ Stackoverflowนี้


ขอบคุณที่พยายามช่วย แต่นี่ไม่ได้ตอบคำถามของฉัน
jottr

ฉันรู้วิธี จำกัด การเลือกของฉัน ปัญหาของฉันคือฉันต้องการวิธีโคลนฐานข้อมูลจาก heroku ด้วยชุดย่อยของข้อมูล; การดัมพ์ db ทั้งหมดตามที่อธิบายในคู่มือ herokusไม่ใช่ตัวเลือก
jottr

1
@elementz - มีเหตุผลที่คุณไม่สามารถวนซ้ำตารางและคัดลอก (เลือก ... จำกัด 100) กับ 'ชื่อไฟล์' ... หรือไม่ คุณไม่คัดลอกไปที่ Heroku ได้ไหม?
rfusca

@rfusca - ฉันไม่รู้จัก COPY TO ฉันจะลองและรายงานกลับ
jottr

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