ส่งออกเฉพาะ schema (โครงสร้าง) จาก SQL dump

คุณมี dump แบบเต็มอยู่บนดิสก์ แต่ต้องการแค่ โครงสร้าง — CREATE TABLE, index, foreign key — โดยไม่เอาตาราง log ที่มี 89 ล้านแถว หรือในทางกลับกัน: เอาแค่ ข้อมูล ไม่เอาคำสั่ง CREATE นี่คือเหตุผลที่แฟล็ก dump ทั่วไปช่วยไฟล์ที่มีอยู่แล้วไม่ได้ และวิธีแยกโครงสร้างออกจากข้อมูลในคลิกเดียว

มีสามสถานการณ์ที่เกิดขึ้นซ้ำๆ:

ทำไม mysqldump --no-data จึงไม่พอ

คำแนะนำคลาสสิกคือ mysqldump --no-data (เฉพาะโครงสร้าง) หรือ mysqldump --no-create-info (เฉพาะข้อมูล) ทั้งคู่เป็น แฟล็กสำหรับส่งออก: มันเปลี่ยนสิ่งที่ dump ใหม่ จากฐานข้อมูลที่กำลังทำงาน จะมี พวกมันไม่ช่วยอะไรกับ dump ที่คุณมีอยู่แล้วเป็นไฟล์ .sql บนดิสก์

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

วิธีทำด้วยมือ

ทางที่เห็นได้ชัดคือตัดบรรทัดออกด้วย grep หรือ sed เพื่อเก็บโครงสร้างและตัดข้อมูลออก:

# เก็บทุกอย่างยกเว้นแถว INSERT
grep -v '^INSERT INTO' dump.sql > schema.sql

# หรือเก็บเฉพาะแถว INSERT สำหรับไฟล์ที่มีแต่ข้อมูล
grep '^INSERT INTO' dump.sql > data.sql

มันดูดีบน dump เล็กๆ ที่เรียบร้อย แล้วก็พังบนของจริง:

คุณลงเอยด้วยการดีบักตัวกรองของคุณเอง แทนที่จะได้ schema ของคุณ

เฉพาะโครงสร้างหรือเฉพาะข้อมูลด้วย DumpCleaner

DumpCleaner เข้าใจคำสั่ง SQL แทนที่จะจับคู่ทีละบรรทัด มันจึงแยกโครงสร้างออกจากข้อมูลได้อย่างน่าเชื่อถือ บนไฟล์ทุกขนาด:

  1. ลาก .sql dump ของคุณเข้าไปใน DumpCleaner (MySQL, MariaDB หรือ PostgreSQL) มัน parse ไฟล์แบบสตรีม dump หลายกิกะไบต์จึงโหลดด้วยหน่วยความจำคงที่
  2. สลับ ชนิดคำสั่ง ที่คุณต้องการ: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET เอาติ๊กออกจาก INSERT INTO แล้วคุณจะได้เฉพาะโครงสร้าง เอาติ๊กออกจาก CREATE TABLE / CREATE INDEX แล้วคุณจะได้เฉพาะข้อมูล
  3. หรือเลือกพรีเซ็ต — เฉพาะโครงสร้าง หรือ เฉพาะข้อมูล — เพื่อตั้งค่าสวิตช์ทุกตัวในขั้นตอนเดียว แล้วปรับละเอียดรายตารางได้ถ้าต้องการ
  4. ส่งออก คุณจะได้ไฟล์ schema ที่กระชับสำหรับ staging หรือ CI หรือ dump เฉพาะข้อมูลที่สะอาดสำหรับ seeding

เพราะตัวกรองตระหนักถึงคำสั่ง extended INSERT แบบหลายบรรทัดจึงถูกเก็บหรือทิ้งทั้งก้อน ไม่มีการตัดกลางคัน

พลังที่แท้จริงคือการกรองทำงาน รายชนิดคำสั่ง และ รายตาราง และทั้งสองผสานกันได้ คุณสามารถเก็บโครงสร้างของ ทุก ตาราง แต่รวมข้อมูล INSERT เฉพาะสามตารางที่คุณต้องการจริง โดยปล่อยให้ตาราง logs ที่มี 89 ล้านแถวเป็นเปลือกเปล่า นั่นคือสิ่งที่ไม่มีแฟล็ก --no-data ใดแสดงออกได้

แยกโครงสร้างออกจากข้อมูลในไม่กี่วินาที

DumpCleaner กรอง dump ที่มีอยู่ตามชนิดคำสั่งและตามตาราง — เฉพาะโครงสร้าง เฉพาะข้อมูล หรือผสมผสานแบบใดก็ได้ — แบบสตรีมมิ่ง ด้วยหน่วยความจำคงที่ แอปเนทีฟสำหรับ macOS & iPadOS ซื้อครั้งเดียวจบ

ดาวน์โหลดบน App Store

คำถามที่พบบ่อย

ฉันส่งออกข้อมูลโดยไม่เอา schema ได้ไหม?

ได้ ปิด CREATE TABLE และ CREATE INDEX (หรือเลือกพรีเซ็ตเฉพาะข้อมูล) และเก็บ INSERT INTO ไว้ DumpCleaner ส่งออกเฉพาะแถว พร้อมโหลดเข้า schema ที่มีอยู่แล้ว

การส่งออกเฉพาะโครงสร้างเก็บ index และ foreign key ไว้หรือไม่?

เก็บ เฉพาะโครงสร้างจะเก็บ CREATE TABLE, CREATE INDEX, ALTER TABLE และนิยาม foreign key — ทุกอย่างที่กำหนดฐานข้อมูล มีเพียงแถวข้อมูล INSERT เท่านั้นที่ถูกลบออก

ฉันผสมได้ไหม — โครงสร้างสำหรับทุกตาราง ข้อมูลสำหรับบางตาราง?

ได้ การกรองทำงานรายชนิดคำสั่งและรายตาราง และทั้งสองผสานกันได้ เก็บโครงสร้างของทุกตาราง แต่รวมข้อมูล INSERT เฉพาะไม่กี่ตารางที่คุณต้องการจริง

วิธีนี้ใช้กับ PostgreSQL ได้ไหม?

ได้ DumpCleaner อ่าน dump ของ MySQL, MariaDB และ PostgreSQL และตรวจจับรูปแบบอัตโนมัติ การส่งออกเฉพาะโครงสร้างและเฉพาะข้อมูลจึงทำงานเหมือนกันกับไฟล์ pg_dump

schema โดยไม่มีข้อมูล — หรือข้อมูลโดยไม่มี schema

ลาก สลับชนิดคำสั่ง ส่งออก DumpCleaner แยก dump ใดก็ได้ออกเป็นเฉพาะส่วนที่คุณต้องการ

ดาวน์โหลดบน App Store