มีสามสถานการณ์ที่เกิดขึ้นซ้ำๆ:
- ตั้ง schema สำหรับ staging หรือ CI — คุณต้องการโครงสร้างตารางเปล่าเพื่อให้เทสต์รันกับคอลัมน์ index และ constraint จริงได้ แต่คุณไม่อยากส่งข้อมูล production หลายกิกะไบต์เข้าไปในสภาพแวดล้อมแบบใช้แล้วทิ้งเด็ดขาด
- เอาแค่ข้อมูล seed — schema มีอยู่แล้วในฐานข้อมูลปลายทาง และคุณแค่ต้องการแถว INSERT มาเติมข้อมูล โดยไม่มีคำสั่ง CREATE ที่จะชนกับสิ่งที่มีอยู่
- กำจัดสิ่งรกรุงรัง — dump บวมด้วยตาราง
logs,sessions,audit_trailหรือcacheที่มีแถวหลายสิบล้านแถวที่คุณไม่เคยอยากนำเข้าเลย
ทำไม 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 เล็กๆ ที่เรียบร้อย แล้วก็พังบนของจริง:
- INSERT แบบหลายบรรทัด คำสั่ง
INSERT INTO … VALUESเดียวสามารถกินพื้นที่หลายพันบรรทัดgrepจับคู่บรรทัดแรกและทิ้งค่าที่เหลือให้ลอยเคว้ง สร้างไฟล์ที่เสีย - extended insert mysqldump รวมหลายแถวเข้าเป็นคำสั่งยักษ์เดียว ตัวกรองแบบทีละบรรทัดบอกไม่ได้ว่าคำสั่งแบบนั้นจบตรงไหน
- คอมเมนต์และบล็อก บล็อกเงื่อนไข
/*! … */,LOCK TABLESและคอมเมนต์--แทรกสลับกับข้อมูล ตัวกรองแบบง่ายๆ จึงเก็บขยะไว้ หรือไม่ก็ตัดสิ่งที่การนำเข้าจำเป็นต้องใช้ทิ้งไป - เฉพาะข้อมูลยิ่งแย่กว่า
grep '^INSERT'ล้วนๆ โยนคำสั่งSETและLOCKที่แถวต้องพึ่งพาทิ้งไป และ INSERT ใดที่ไม่ได้เริ่มตรงตำแหน่งคอลัมน์ศูนย์พอดีก็หายไปอย่างเงียบๆ
คุณลงเอยด้วยการดีบักตัวกรองของคุณเอง แทนที่จะได้ schema ของคุณ
เฉพาะโครงสร้างหรือเฉพาะข้อมูลด้วย DumpCleaner
DumpCleaner เข้าใจคำสั่ง SQL แทนที่จะจับคู่ทีละบรรทัด มันจึงแยกโครงสร้างออกจากข้อมูลได้อย่างน่าเชื่อถือ บนไฟล์ทุกขนาด:
- ลาก
.sqldump ของคุณเข้าไปใน DumpCleaner (MySQL, MariaDB หรือ PostgreSQL) มัน parse ไฟล์แบบสตรีม dump หลายกิกะไบต์จึงโหลดด้วยหน่วยความจำคงที่ - สลับ ชนิดคำสั่ง ที่คุณต้องการ: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET เอาติ๊กออกจาก INSERT INTO แล้วคุณจะได้เฉพาะโครงสร้าง เอาติ๊กออกจาก CREATE TABLE / CREATE INDEX แล้วคุณจะได้เฉพาะข้อมูล
- หรือเลือกพรีเซ็ต — เฉพาะโครงสร้าง หรือ เฉพาะข้อมูล — เพื่อตั้งค่าสวิตช์ทุกตัวในขั้นตอนเดียว แล้วปรับละเอียดรายตารางได้ถ้าต้องการ
- ส่งออก คุณจะได้ไฟล์ 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