จำกัด จำนวนระเบียนจาก mysqldump หรือไม่


137

ฉันกำลังพยายามโหลดตัวอย่างข้อมูลขนาดเล็กจากฐานข้อมูลขนาดใหญ่ไปยังฐานข้อมูลทดสอบ

คุณจะบอก mysqldump เพียงเพื่อให้คุณบันทึก n จาก 8 ล้านเท่านั้น?

ขอบคุณ

คำตอบ:


212

ตามที่ skaffman พูดให้ใช้ตัวเลือก--where :

mysqldump --opt --where="1 limit 1000000" database

แน่นอนว่าจะให้คุณล้านแถวแรกจากทุกตาราง


15
"1" ก่อนถึงขีด จำกัด จะทำอย่างไร
Phob

31
@Phob: ตัวเลือก --where ถูกผนวกโดยทั่วไปในการสืบค้นข้อมูลของรูปแบบดังนั้นในกรณีนี้คุณจะได้รับSELECT * from table WHERE SELECT * from table WHERE 1 limit 1000000หากไม่มี 1 คุณจะมีข้อความค้นหาไม่ถูกต้อง การระบุ 1 สำหรับส่วนคำสั่ง (ตั้งแต่ 1 เป็นจริงเสมอ) เพียงเลือกระเบียนทั้งหมด
Adam Bellaire

24
ว้าวแฮ็คอะไรกัน ดังนั้นคุณสามารถ SQL ฉีดเองด้วยวิธีนี้
Phob

6
สิ่งนี้จะรักษาอินทิกรัลคีย์ต่างประเทศทั้งหมดหรือไม่ ถ้าไม่มีวิธีทำเช่นนั้นหรือไม่?
keithxm23

4
ขอบคุณ! นอกจากนี้คุณสามารถใช้: mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database เพื่อรับหน้าที่สองของ 1 ล้านบันทึก ตรวจสอบให้แน่ใจว่าใช้แฟล็ก --no-create-infoบนเพจอื่นที่ไม่ใช่เพจแรกเพื่อถ่ายโอนข้อมูลเท่านั้นและไม่ต้องสร้างสิ่งตาราง
pfuri

59

หากคุณต้องการรับnบันทึกจากตารางที่ระบุคุณสามารถทำสิ่งนี้:

mysqldump --opt --where="1 limit 1000000" database table > dump.sql

นี้จะถ่ายโอนข้อมูลครั้งแรก1000000แถวจากตารางที่มีชื่อลงในแฟ้มtabledump.sql


9

mysqldump สามารถให้แบบสอบถาม SQL เพื่อดำเนินการจากนั้นจะใช้ข้อมูลสำหรับการถ่ายโอนข้อมูล จากนั้นคุณสามารถใช้ส่วน "จำกัด X" ในแบบสอบถามของคุณเพื่อ จำกัด จำนวนแถว


7

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

mysqldump --opt --where="1 ORDER BY id DESC limit 1000000" --all-databases > dump.sql

นี่คือเหตุผลที่สมบูรณ์แบบว่าทำไมคุณควรตั้งชื่อIDของคุณ PK และหลีกเลี่ยงการรวม PK ของแม้ในตารางการเชื่อมโยง (ใช้คีย์ตัวแทนแทน)


1
ทำสิ่งนี้ (ชื่อ ID และหลีกเลี่ยงการคอมโพสิตของ PK) และคุณจะต้องละเว้นทฤษฎีฐานข้อมูลเชิงสัมพันธ์
mpoletto ถึง

1
ที่จริงแล้วถ้าคุณออกแบบฐานข้อมูลของคุณตามแนวทางปฏิบัติที่ดีที่สุดของฐานข้อมูลเชิงสัมพันธ์การกำหนด PK ของคุณตามข้อมูลและเอนทิตีคุณสามารถใช้ --option --where = "1 LIMIT 10000" ตัวอย่างเช่น หากไม่มีคำสั่งซื้อสิ่งนี้จะทำงานได้เนื่องจาก MySQL จะเรียงลำดับตามธรรมชาติสิ่งที่เทียบเท่ากับที่บอกว่าจะเป็นไปตามลำดับดัชนีของ PK จากนั้น FK ทั้งหมดของตารางที่เกี่ยวข้องจะมีเฉพาะข้อมูลที่มีอยู่ในตารางการอ้างอิงของพวกเขาเพราะคำสั่งจะเหมือนกัน
mpoletto ถึง

การใช้ ID เป็นภัยพิบัติที่แท้จริงของนักพัฒนาจำนวนมาก การมี ID เหมือนของ PK นั้นก็คือการที่ไม่มี PK ความถูกต้องของคุณเป็นเรื่องสำคัญเพราะในกรณีส่วนใหญ่หมายเลขเพิ่มอัตโนมัติไม่มีส่วนเกี่ยวข้องกับข้อมูลเอนทิตี
mpoletto ถึง

@mpoletto --where = "1 LIMIT 10000" จะเลือก 10,000 รายการแรกเท่านั้น จุดทั้งหมดของคำตอบของฉันคือการแสดงว่าคุณจะแก้ปัญหาอย่างไรในการรับรายการ X ล่าสุดซึ่งมักเป็นสิ่งที่คุณต้องการ ฉันยังไม่เข้าใจว่าอนุสัญญาการตั้งชื่อเกี่ยวข้องกับ "การละเว้นทฤษฎีฐานข้อมูลเชิงสัมพันธ์" ฉันคิดว่าคุณคิดถึงคำตอบของฉัน ORM ที่นิยมมากที่สุดเช่น EF, Django ORM เป็นต้นเป็นค่าเริ่มต้นและแนะนำ "id" สำหรับคอลัมน์ PK เนื่องจากเป็นการซ้ำซ้อนในการพูด users.user_id แทนที่จะเป็นแค่ users.id
Andreas Bergström

เมื่อคุณพูดว่ามี "เหตุผลที่สมบูรณ์แบบสำหรับเหตุผลที่คุณควรตั้งชื่อ ID ของคุณ PK และหลีกเลี่ยงการรวมของ PK" คุณไม่สนใจทฤษฎีฐานข้อมูลเชิงสัมพันธ์ อาร์กิวเมนต์ของคุณเกี่ยวกับ "ORM ที่นิยมมากที่สุด" ไม่ถูกต้องเนื่องจาก ORM นี้ต้องการตารางที่มี ID ในการทำงาน
mpoletto ถึง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.