Τρεις καταστάσεις εμφανίζονται ξανά και ξανά:
- Στήσιμο σχήματος για staging ή CI — θέλετε την κενή δομή πινάκων ώστε τα tests να τρέχουν σε πραγματικές στήλες, indexes και περιορισμούς, αλλά σε καμία περίπτωση δεν θέλετε να στείλετε gigabyte γραμμών παραγωγής σε ένα προσωρινό περιβάλλον.
- Μόνο δεδομένα seed — το σχήμα υπάρχει ήδη στη βάση δεδομένων προορισμού, και χρειάζεστε απλώς τις γραμμές INSERT για να το γεμίσετε, χωρίς εντολές CREATE που θα συγκρούονταν με ό,τι υπάρχει ήδη.
- Απαλλαγή από τον θόρυβο — το dump είναι φουσκωμένο από πίνακες
logs,sessions,audit_trailήcacheμε δεκάδες εκατομμύρια γραμμές που δεν θέλετε ποτέ να εισάγετε.
Γιατί το mysqldump --no-data δεν αρκεί
Η κλασική συμβουλή είναι mysqldump --no-data (μόνο δομή) ή mysqldump --no-create-info (μόνο δεδομένα). Και τα δύο είναι σημαίες εξαγωγής: αλλάζουν το τι περιέχει ένα νέο dump από μια βάση δεδομένων που τρέχει. Δεν κάνουν τίποτα για ένα dump που έχετε ήδη στον δίσκο ως αρχείο .sql.
Στην πράξη το αρχείο συχνά φτάνει από κάποιον άλλον, ή από μια εργασία backup, ή από έναν server στον οποίο δεν έχετε πλέον ζωντανή πρόσβαση. Δεν μπορείτε να ξανατρέξετε το mysqldump σε μια βάση δεδομένων που δεν είναι προσβάσιμη — τα διαπιστευτήρια χάθηκαν, ο server αποσύρθηκε, ή το αρχείο είναι απλώς το μόνο που σας δόθηκε. Σε αυτό το σημείο οι σημαίες είναι άχρηστες, και σας μένει να επεξεργαστείτε το ίδιο το αρχείο.
Ο χειροκίνητος τρόπος
Η προφανής κίνηση είναι να αφαιρέσετε γραμμές με 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 inserts. Το mysqldump ομαδοποιεί πολλές γραμμές σε μια γιγαντιαία εντολή. Τα φίλτρα ανά γραμμή δεν μπορούν να καταλάβουν πού τελειώνει μια τέτοια εντολή.
- Σχόλια και μπλοκ. Τα υπό συνθήκη μπλοκ
/*! … */, ταLOCK TABLES, και τα σχόλια--εναλλάσσονται με τα δεδομένα, οπότε ένα αφελές φίλτρο είτε κρατάει σκουπίδια είτε κόβει κάτι που χρειάζεται η εισαγωγή. - Το μόνο-δεδομένα είναι χειρότερο. Ένα σκέτο
grep '^INSERT'πετάει τις εντολέςSETκαιLOCKαπό τις οποίες εξαρτώνται οι γραμμές, και κάθε INSERT που δεν ξεκινά ακριβώς στη στήλη μηδέν εξαφανίζεται σιωπηλά.
Καταλήγετε να κάνετε debugging στο ίδιο σας το φίλτρο αντί να παίρνετε το σχήμα σας.
Μόνο δομή ή μόνο δεδομένα με το DumpCleaner
Το DumpCleaner κατανοεί τις εντολές SQL αντί να ταιριάζει γραμμές, οπότε διαχωρίζει τη δομή από τα δεδομένα αξιόπιστα — σε αρχεία οποιουδήποτε μεγέθους:
- Σύρετε το
.sqldump σας μέσα στο DumpCleaner (MySQL, MariaDB ή PostgreSQL). Αναλύει το αρχείο με streaming, οπότε ένα dump πολλών gigabyte φορτώνεται με σταθερή μνήμη. - Εναλλάξτε τους τύπους εντολών που θέλετε: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET. Ξετσεκάρετε το INSERT INTO και παίρνετε μόνο τη δομή· ξετσεκάρετε τα CREATE TABLE / CREATE INDEX και παίρνετε μόνο τα δεδομένα.
- Ή επιλέξτε μια προεπιλογή — Μόνο δομή ή Μόνο δεδομένα — για να ρυθμίσετε κάθε εναλλαγή με ένα βήμα, και μετά προσαρμόστε ανά πίνακα αν θέλετε.
- Εξαγωγή. Παίρνετε ένα λιτό αρχείο σχήματος για staging ή CI, ή ένα καθαρό dump μόνο δεδομένων για seeding.
Επειδή το φίλτρο έχει επίγνωση των εντολών, ένα πολυγραμμικό extended INSERT κρατιέται ή αφαιρείται ως σύνολο — ποτέ δεν κόβεται στη μέση.
Η πραγματική δύναμη είναι ότι το φιλτράρισμα λειτουργεί ανά τύπο εντολής και ανά πίνακα, και τα δύο συνδυάζονται. Μπορείτε να κρατήσετε τη δομή κάθε πίνακα αλλά να συμπεριλάβετε δεδομένα INSERT μόνο για τους τρεις πίνακες που πραγματικά χρειάζεστε — αφήνοντας τον πίνακα logs με τις 89 εκατομμύρια γραμμές ως ένα άδειο κέλυφος. Αυτό είναι κάτι που καμία σημαία --no-data δεν μπορεί να εκφράσει.
Διαχωρίστε τη δομή από τα δεδομένα σε δευτερόλεπτα
Το DumpCleaner φιλτράρει ένα υπάρχον dump ανά τύπο εντολής και ανά πίνακα — μόνο δομή, μόνο δεδομένα, ή οποιονδήποτε συνδυασμό — με streaming, με σταθερή μνήμη. Εγγενής εφαρμογή macOS & iPadOS, εφάπαξ αγορά.
Κατεβάστε το από το App StoreΣυχνές ερωτήσεις
Μπορώ να εξάγω τα δεδομένα χωρίς το σχήμα;
Ναι. Απενεργοποιήστε τα CREATE TABLE και CREATE INDEX (ή επιλέξτε την προεπιλογή Μόνο δεδομένα) και κρατήστε το INSERT INTO. Το DumpCleaner εξάγει μόνο τις γραμμές, έτοιμες να φορτωθούν σε ένα σχήμα που υπάρχει ήδη.
Διατηρεί μια εξαγωγή μόνο-δομής τα indexes και τα ξένα κλειδιά;
Ναι. Η επιλογή Μόνο δομή κρατά τα CREATE TABLE, CREATE INDEX, ALTER TABLE και τους ορισμούς ξένων κλειδιών — όλα όσα ορίζουν τη βάση δεδομένων. Μόνο οι γραμμές δεδομένων INSERT αφαιρούνται.
Μπορώ να συνδυάσω — δομή για όλους τους πίνακες, δεδομένα για μερικούς;
Ναι. Το φιλτράρισμα γίνεται ανά τύπο εντολής και ανά πίνακα, και τα δύο συνδυάζονται. Κρατήστε τη δομή κάθε πίνακα αλλά συμπεριλάβετε δεδομένα INSERT μόνο για τους λίγους πίνακες που πραγματικά χρειάζεστε.
Λειτουργεί με PostgreSQL;
Ναι. Το DumpCleaner διαβάζει dumps MySQL, MariaDB και PostgreSQL και εντοπίζει τη μορφή αυτόματα, οπότε οι εξαγωγές μόνο-δομής και μόνο-δεδομένων λειτουργούν με τον ίδιο τρόπο για αρχεία pg_dump.
Σχήμα χωρίς τα δεδομένα — ή δεδομένα χωρίς το σχήμα
Σύρετε, εναλλάξτε τους τύπους εντολών, εξάγετε. Το DumpCleaner διαχωρίζει οποιοδήποτε dump ακριβώς στο μέρος που χρειάζεστε.
Κατεβάστε το από το App Store