Database migrations σε web apps: πώς αλλάζει η βάση χωρίς να σπάσει η παραγωγή
Κάθε custom εφαρμογή που εξελίσσεται χρειάζεται αλλαγές στη βάση δεδομένων. Νέο πεδίο σε πελάτη, νέο status σε παραγγελία, νέος πίνακας για audit logs, αλλαγή σε permissions, indexing για πιο γρήγορο dashboard ή νέα σχέση ανάμεσα σε entities.
Αυτές οι αλλαγές ονομάζονται database migrations. Αν γίνουν πρόχειρα, μπορούν να ρίξουν production, να χαλάσουν δεδομένα ή να κάνουν την εφαρμογή ασύμβατη με τον κώδικα που τρέχει ήδη.
Η βάση δεν είναι απλό αρχείο ρυθμίσεων. Είναι η μνήμη της επιχείρησης.
Τι είναι database migration
Migration είναι ελεγχόμενη αλλαγή στο schema ή στα δεδομένα της βάσης.
Παραδείγματα:
- προσθήκη νέου column
- αλλαγή τύπου πεδίου
- δημιουργία νέου table
- προσθήκη index
- migration παλιών δεδομένων σε νέα δομή
- αλλαγή constraint
- δημιουργία foreign key
- διαγραφή παλιού πεδίου
Σε μικρό project, αυτά μπορεί να φαίνονται απλά. Σε παραγωγική εφαρμογή με πραγματικούς χρήστες, κάθε αλλαγή πρέπει να σχεδιαστεί.
Το βασικό πρόβλημα: κώδικας και βάση πρέπει να συμφωνούν
Ένα deployment δεν αλλάζει πάντα όλο το σύστημα την ίδια στιγμή. Μπορεί για λίγα λεπτά να τρέχουν παλιές και νέες εκδόσεις του κώδικα. Μπορεί να αποτύχει το deploy μετά τη migration. Μπορεί ένας worker να επεξεργάζεται job με παλιά λογική.
Γι' αυτό οι ασφαλείς migrations συχνά γίνονται σε βήματα.
Παράδειγμα:
- προσθέτετε νέο nullable column
- ο νέος κώδικας γράφει και στο παλιό και στο νέο πεδίο
- μεταφέρετε παλιά δεδομένα
- ο κώδικας αρχίζει να διαβάζει από το νέο πεδίο
- αργότερα αφαιρείτε το παλιό πεδίο
Αυτό μειώνει το ρίσκο σε σχέση με μια μεγάλη αλλαγή που γίνεται όλη μαζί.
Backward-compatible migrations
Μια migration είναι πιο ασφαλής όταν ο παλιός κώδικας μπορεί ακόμη να δουλέψει μετά την αλλαγή.
Συνήθως είναι ασφαλέστερο να:
- προσθέτετε πεδία αντί να αφαιρείτε αμέσως
- αποφεύγετε άμεση αλλαγή τύπου σε κρίσιμα columns
- κάνετε data backfill ξεχωριστά
- προσθέτετε constraints αφού καθαριστούν τα δεδομένα
- δοκιμάζετε σε staging με αντίγραφο πραγματικού όγκου δεδομένων
Η PostgreSQL τεκμηρίωση για ALTER TABLE και indexes δείχνει πόσο διαφορετικό κόστος μπορούν να έχουν οι αλλαγές ανάλογα με τον τύπο τους. Σε μεγάλους πίνακες, μια απλή αλλαγή μπορεί να γίνει ακριβή.
Rollback δεν σημαίνει πάντα reverse migration
Πολλοί πιστεύουν ότι rollback σημαίνει απλώς «τρέχω την αντίστροφη migration». Στην πράξη αυτό δεν είναι πάντα ασφαλές.
Αν έχετε ήδη μεταφέρει ή αλλάξει δεδομένα, η επιστροφή μπορεί να είναι δύσκολη ή αδύνατη χωρίς απώλεια.
Καλύτερη προσέγγιση:
- backup πριν από κρίσιμες αλλαγές
- backward-compatible βήματα
- feature flags όπου χρειάζεται
- ability to stop using the new field χωρίς να το διαγράψετε
- σαφή monitoring μετά το deploy
Ο στόχος είναι να μη χρειαστεί καταστροφικό rollback υπό πίεση.
Data migrations και background jobs
Όταν πρέπει να μεταφερθούν πολλά δεδομένα, συχνά δεν πρέπει να γίνει όλο μέσα στο deployment.
Παράδειγμα: έχετε 2 εκατομμύρια παλιές εγγραφές και πρέπει να υπολογιστεί νέο normalized πεδίο. Αν το κάνετε μέσα στη migration, μπορεί να κλειδώσετε πίνακες ή να καθυστερήσει το deploy.
Καλύτερα:
- προσθήκη νέου πεδίου
- background job για backfill σε batches
- monitoring προόδου
- έλεγχος consistency
- μετάβαση του κώδικα όταν ολοκληρωθεί
Αυτό είναι πιο ελεγχόμενο για παραγωγικά web apps.
Πώς βοηθά η Ai Foundry
Στην Ai Foundry σχεδιάζουμε database migrations ως μέρος του deployment plan. Σε custom εφαρμογές, CRM, portals και e-shop, δεν μας ενδιαφέρει μόνο να περάσει η αλλαγή στο local περιβάλλον. Μας ενδιαφέρει να περάσει με ασφάλεια σε production, με δεδομένα, χρήστες, workers και integrations να συνεχίζουν να λειτουργούν.
Χρησιμοποιούμε staged αλλαγές, testing σε staging, backup σκέψη, monitoring και όπου χρειάζεται feature flags. Έτσι η εφαρμογή μπορεί να εξελίσσεται χωρίς κάθε αλλαγή στη βάση να γίνεται ρίσκο.
Checklist
Πριν τρέξετε migration σε production, ελέγξτε:
- είναι backward-compatible;
- έχει δοκιμαστεί σε staging;
- υπάρχει backup;
- επηρεάζει μεγάλο table;
- χρειάζεται batch backfill;
- υπάρχουν workers που βασίζονται στο παλιό schema;
- υπάρχει rollback plan;
- υπάρχουν alerts μετά το deploy;
- η αλλαγή έχει μετρηθεί με πραγματικό όγκο δεδομένων;
- υπάρχει ιδιοκτήτης για την παρακολούθηση;
Συμπέρασμα
Οι database migrations είναι από τα πιο κρίσιμα κομμάτια στην εξέλιξη μιας εφαρμογής. Δεν είναι απλό τεχνικό βήμα. Είναι αλλαγή στα δεδομένα πάνω στα οποία δουλεύει η επιχείρηση.
Για σοβαρά web apps, portals, CRM και e-shop, οι migrations πρέπει να είναι ελεγχόμενες, σταδιακές και με σχέδιο ανάκαμψης.
Πηγές για περαιτέρω ανάγνωση: PostgreSQL ALTER TABLE, PostgreSQL CREATE INDEX, Prisma migrations.