mysqldump กับ INSERT …เมื่อทำซ้ำ


21

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

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

ฉันสามารถสร้าง mysqldump ด้วยตัวเลือก ON DUPLICATE ได้หรือไม่ หรือฉันอาจผสานการถ่ายโอนข้อมูลที่แทรกข้อมูลใหม่และอัปเดตข้อมูลที่แก้ไขแล้วได้หรือไม่

แน่นอนว่าฉันสามารถแทรกการON DUPLICATEถ่ายโอนข้อมูลได้ด้วยตนเอง แต่ฉันต้องการทำให้กระบวนการผสานเป็นไปโดยอัตโนมัติ

คำตอบ:


34

มีตัวเลือกที่จะช่วยคุณในเรื่องนี้:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

เก็บกระบวนทัศน์นี้ไว้ในใจ

  • mysqldump ทุกอย่างจาก DB1 เป็น DUMP1
  • โหลด DUMP1 ลงใน DB3
  • mysqldump ทุกอย่างจาก DB2 โดยใช้ - แทนที่ (หรือ - แทรก - ไม่สนใจ) และ - ไม่สร้างข้อมูลลงใน DUMP2
  • โหลด DUMP2 เป็น DB3

1
รอสักครู่: การใช้ --replace หมายถึงว่าข้อมูล DB2 จะเขียนทับข้อมูล DB1 และการใช้ --insert-ละเว้นหมายความว่าข้อมูล DB1 มีชัย คำถามดูเหมือนว่าจะถามวิธีการปรับปรุงในกรณีของคีย์ที่ซ้ำกัน ไม่ว่าในกรณีใดฉันก็อยากจะรู้
Edward Newell

@EdwardNewell โปรดทราบว่า--replaceเทียบเท่ากับการทำON DUPLICATE UPDATEในทุกคอลัมน์ น่าเสียดายที่ mysqldump ไม่ได้ออกแบบมาเพื่ออัปเดตคอลัมน์ที่เฉพาะเจาะจงเนื่องจากการโหลดจำนวนมากและการทุ่มตลาดธรรมชาติของ mysqldump คำตอบของฉันเพียงเปิดเผยว่า mysqldump สามารถทำอะไรได้บ้าง คุณจะต้องเขียนโค้ดที่กำหนดเองนอกเหนือจาก mysqldump ON DUPLICATE UPDATEที่จะทำ
RolandoMySQLDBA

ตราบใดที่ DB1 และ 2 มีโครงสร้างเดียวกันคุณก็พูดถูก แต่สมมติว่า DB1 มีเขตข้อมูลเพิ่มเติม จากนั้น - แทนที่จะทำให้เขตข้อมูลพิเศษกลับไปใช้ค่าเริ่มต้น (หรือข้อผิดพลาดหากไม่มีค่าเริ่มต้น) แทนที่จะเป็นเพียงการปรับปรุงเขตข้อมูลที่ใช้ร่วมกัน ผมทราบดีว่าสถานการณ์ของ OP สำหรับสองฐานข้อมูลที่มีสกีมาเหมือนกัน แต่เพียงแค่ชี้ให้เห็นว่ามีคือความแตกต่างและมันจะเป็นประโยชน์ที่จะมีการถ่ายโอนข้อมูลการปรับปรุงจริงชนิดในบางกรณี (ฉันหันหน้าไปทางหนึ่งในขณะนี้!)
Edward Newell

1
โปรดทราบว่าหากมีคีย์ต่างประเทศที่ชี้ไปยังระเบียนที่กำลังอัปเดตการใช้REPLACE INTOอาจล้มเหลวเนื่องจากไม่สามารถลบบันทึกได้โดยแยกความสัมพันธ์เหล่านั้นออก หากคุณมีON DELETE CASCADEแล้วคุณจะลบตารางเหล่านั้นที่ขึ้นอยู่กับการปรับปรุง REPLACE INTOเป็นการดำเนินการที่ค่อนข้างอันตราย
Christopher Schultz

1
@RolandoMySQLDBA เห็นด้วย ฉันแค่ต้องการแสดงความคิดเห็นเพื่อให้ทุกคนที่อ่านคำตอบนี้เข้าใจว่าตัวเลือกเหล่านี้ (โดยเฉพาะREPLACE INTO) อาจเป็นอันตรายและมีผลกระทบ "น่าประหลาดใจ" คำตอบที่ดี - แค่ต้องการเพิ่มข้อแม้
Christopher Schultz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.