Δεν χρειάζεται κάθε εργασία ολόκληρη τη βάση δεδομένων. Όταν χτίζετε μια λειτουργία τοπικά, σπάνια θέλετε ένα πλήρες dump παραγωγής να γεμίζει τον δίσκο σας και να χρειάζεται μια ώρα για να εισαχθεί. Θέλετε τους λίγους πίνακες που πραγματικά αφορά η λειτουργία.
Το ίδιο ισχύει όταν κάνετε debugging σε έναν μόνο πίνακα — η αναπαραγωγή ενός προβλήματος δεδομένων στο orders δεν απαιτεί τους άλλους 126 πίνακες — ή όταν κάνετε μερική μετεγκατάσταση, όπου μόνο λίγοι πίνακες μετακινούνται σε μια νέα υπηρεσία. Σε όλες αυτές τις περιπτώσεις το ερώτημα είναι το ίδιο: πώς παίρνω μόνο αυτούς τους πίνακες από ένα τεράστιο dump, καθαρά και γρήγορα;
Η προσέγγιση sed/grep και γιατί σπάει
Η κλασική απάντηση είναι να κόψετε το αρχείο με sed ανάμεσα στις κεφαλίδες ενοτήτων που γράφει το mysqldump για κάθε πίνακα:
# απομόνωση του πίνακα users από ένα αρχείο mysqldump
sed -n '/-- Table structure for table `users`/,/-- Table structure for table/p' dump.sql > users.sql
Φαίνεται έξυπνο, και σε ένα μικρό, τακτοποιημένο dump μπορεί ακόμη και να λειτουργήσει μία φορά. Σε ένα πραγματικό αρχείο 7 GB καταρρέει με πολλούς λεπτούς τρόπους:
- Πολυγραμμικά INSERT. Ένα μόνο
INSERT INTO ... VALUESμπορεί να εκτείνεται σε χιλιάδες γραμμές. Εργαλεία που δουλεύουν ανά γραμμή όπως τοsedκαι τοgrepκόβουν αυτές τις γραμμές στη μέση και παράγουν ένα αρχείο που δεν αναλύεται. - Backticks και ειδικοί χαρακτήρες. Οι τιμές στηλών περιέχουν
--, ερωτηματικά, backticks, εισαγωγικά και αλλαγές γραμμής μέσα σε strings. Το μοτίβο σας ταιριάζει κείμενο μέσα στα δεδομένα που δεν προοριζόταν ποτέ να είναι διαχωριστικό. - Ονόματα πινάκων ως υποσυμβολοσειρές. Η εξαγωγή του
userαρπάζει επίσης ταuser_roles,user_sessionsκαιpassword_user, επειδή το όνομα εμφανίζεται ως υποσυμβολοσειρά άλλων. - Σχόλια και κεφαλίδες μεταβάλλονται. Το ακριβές κείμενο των σχολίων διαφέρει μεταξύ των εκδόσεων MySQL, MariaDB και PostgreSQL, και το
pg_dumpδεν χρησιμοποιεί καθόλου τις ίδιες κεφαλίδες — οπότε η ίδια εντολή επιστρέφει σιωπηλά τίποτα. - Καμία επίγνωση ξένων κλειδιών. Ακόμη κι αν κόψετε τέλεια το
orders, οι γραμμές του αναφέρονται στοusers. Τοsedδεν έχει ιδέα, οπότε η εξαγωγή αποτυγχάνει να εισαχθεί με σφάλμα ξένου κλειδιού.
Καταλήγετε να στοιβάζετε awk πάνω σε grep πάνω σε sed, να δοκιμάζετε σε υποσύνολα, και να μην εμπιστεύεστε ακόμη το αποτέλεσμα. Υπάρχει καλύτερος τρόπος.
Εξαγωγή πινάκων με το DumpCleaner
Το DumpCleaner αναλύει το dump σωστά — κατανοεί τα όρια των εντολών, τα πολυγραμμικά INSERT, τα backticks και τα σχόλια — οπότε πάντα κόβει στις σωστές γραμμές. Η εξαγωγή των πινάκων που χρειάζεστε γίνεται σε τέσσερα βήματα:
- Σύρετε το
.sqldump σας μέσα. Το DumpCleaner κάνει streaming το αρχείο, οπότε ένα dump 7 GB ανοίγει με σταθερή μνήμη αντί να φορτώνει ολόκληρο. - Διαβάστε την αυτόματα εντοπισμένη λίστα πινάκων. Κάθε πίνακας αναλύεται και παρατίθεται με τον αριθμό γραμμών και το μέγεθός του — χωρίς κύλιση σε εκατομμύρια γραμμές για να βρείτε τι υπάρχει.
- Επιλέξτε τους πίνακες που θέλετε. Τσεκάρετε τα
users,ordersκαιproducts, ή πληκτρολογήστε ένα μοτίβο regex / αποκλεισμού όπως*_logsγια να αφαιρέσετε ολόκληρες ομάδες με τη μία. - Συμπεριλάβετε τους γονικούς πίνακες ξένων κλειδιών και εξάγετε. Προαιρετικά τραβήξτε αυτόματα τους γονικούς πίνακες που αναφέρονται, και μετά εξάγετε ένα καθαρό, εισαγώγιμο αρχείο.
Μερικά πράγματα κάνουν αυτό πολύ λιγότερο επίπονο από τα εργαλεία του κελύφους:
- Μοτίβα αποκλεισμού όπως
*_logsή*_sessionsαφαιρούν τον θόρυβο των audit και session χωρίς να ξετσεκάρετε δεκάδες πίνακες με το χέρι. - Φίλτρα regex σας επιτρέπουν να ταιριάζετε κατά πρόθεμα, κατάληξη ή οποιοδήποτε μοτίβο — κρατήστε π.χ. οτιδήποτε ταιριάζει με
shop_*. - Μια ζωντανή προεπισκόπηση δείχνει ακριβώς ποιοι πίνακες θα καταλήξουν στην έξοδο καθώς αλλάζετε την επιλογή.
- Ένα εκτιμώμενο μέγεθος εξόδου σας λέει πόσο μεγάλη θα είναι η εξαγωγή πριν εξάγετε, ώστε να ξέρετε ότι θα χωρέσει τοπικά.
- Οι εξαρτήσεις ξένων κλειδιών μπορούν να συμπεριληφθούν αυτόματα, οπότε η επιλογή του
ordersφέρνει διακριτικά μαζί τοusersκαι η εξαγωγή εισάγεται χωρίς σφάλματα περιορισμού.
Μόνο τους πίνακες που χρειάζεστε — τίποτα άλλο
Το DumpCleaner εξάγει συγκεκριμένους πίνακες από dumps οποιουδήποτε μεγέθους — με streaming, με σταθερή μνήμη, και με τα ξένα κλειδιά επιλυμένα για εσάς. Εγγενής εφαρμογή macOS & iPadOS, εφάπαξ αγορά.
Κατεβάστε το από το App StoreΣυχνές ερωτήσεις
Μπορώ να εξάγω πολλούς πίνακες ταυτόχρονα;
Ναι. Τσεκάρετε όσους πίνακες θέλετε — users, orders και products μαζί — και το DumpCleaner τους γράφει όλους σε ένα ενιαίο αρχείο σε ένα πέρασμα.
Διατηρεί τις εξαρτήσεις ξένων κλειδιών;
Προαιρετικά, ναι. Ενεργοποιήστε το συμπερίληψη εξαρτήσεων ξένων κλειδιών και κάθε γονικός πίνακας που αναφέρεται από την επιλογή σας τραβιέται αυτόματα, ώστε η εξαγωγή να εισάγεται χωρίς σφάλματα περιορισμού.
Μπορώ να αποκλείσω πίνακες με μοτίβο;
Ναι. Χρησιμοποιήστε μοτίβα αποκλεισμού όπως *_logs ή *_sessions, ή μια κανονική έκφραση, για να αφαιρέσετε ολόκληρες ομάδες πινάκων αντί να τους ξετσεκάρετε έναν προς έναν.
Λειτουργεί με PostgreSQL;
Ναι. Το DumpCleaner διαβάζει dumps MySQL, MariaDB και PostgreSQL (pg_dump), και διαχειρίζεται ονόματα με πρόθεμα σχήματος όπως public.users κατά την εξαγωγή πινάκων.
Σταματήστε να παλεύετε με το sed και το grep
Σύρετε, επιλέξτε τους πίνακές σας, εξάγετε. Το DumpCleaner τραβάει ακριβώς τους πίνακες που χρειάζεστε — μαζί με τα ξένα κλειδιά τους — από οποιοδήποτε dump.
Κατεβάστε το από το App Store