Incremental φορτώσεις και CDC με το Boomi Data Integration
Σταματήστε να ξαναφορτώνετε ολόκληρους πίνακες: watermark ή CDC από logs, διαγραφές και ασφαλή backfills, βήμα βήμα με το Boomi Data Integration.
Η πρώτη εκδοχή ενός pipeline προς το warehouse συνήθως αντιγράφει ολόκληρους πίνακες κάθε βράδυ. Για τον πίνακα ειδών είναι μια χαρά, αλλά ο πίνακας γραμμών τιμολογίων μεγαλώνει κάθε μέρα, και κάποιο πρωί η νυχτερινή φόρτωση τρέχει ακόμη στις 9:00. Σε αυτό το άρθρο εξηγούμε τους δύο τρόπους να φορτώνετε μόνο ό,τι άλλαξε, τις παγίδες με τις διαγραφές και τις καθυστερημένες αλλαγές, και πώς στήνονται και οι δύο στο Boomi Data Integration.
Γιατί το «φόρτωσε μόνο ό,τι άλλαξε» είναι πιο δύσκολο απ’ ό,τι ακούγεται
Η προφανής ιδέα είναι να θυμάστε την ώρα της τελευταίας εκτέλεσης και να φέρνετε τις γραμμές που είναι νεότερες. Στην πράξη:
- Δεν έχει κάθε πίνακας αξιόπιστη στήλη «τροποποίησης». Κάποιοι πίνακες ERP έχουν μόνο ημερομηνία δημιουργίας· οι ενημερώσεις δεν την αγγίζουν.
- Τα ρολόγια και οι συναλλαγές δεν συμπίπτουν. Μια γραμμή που ενημερώθηκε στις 23:59:58 σε συναλλαγή που έκανε commit στις 00:00:03 μπορεί να πέσει ανάμεσα σε δύο εκτελέσεις και να χαθεί για πάντα.
- Οι διαγραμμένες γραμμές δεν αφήνουν ίχνος. Ένα ερώτημα «τροποποιήθηκε μετά από» δεν μπορεί να επιστρέψει γραμμή που δεν υπάρχει πια, οπότε τα ακυρωμένα τιμολόγια μένουν στο warehouse.
- Ζώνες ώρας. Αν το ERP αποθηκεύει τοπική ώρα Ελλάδας και το pipeline συγκρίνει σε UTC, χάνετε ή διπλασιάζετε μία ώρα αλλαγών σε κάθε αλλαγή θερινής ώρας.
Τα δύο patterns
Incremental φορτώσεις με watermark
Κάθε εκτέλεση επιλέγει τις γραμμές όπου μια στήλη (το watermark) είναι μεγαλύτερη από τη μέγιστη τιμή της προηγούμενης εκτέλεσης, και αποθηκεύει τη νέα μέγιστη τιμή για την επόμενη φορά.
select * from invoice_lines
where last_modified > :last_watermark -- π.χ. 2026-10-22 05:30:00
Καλές στήλες watermark είναι ένα timestamp «τελευταίας τροποποίησης» που το αγγίζει κάθε ενημέρωση, ή ένας αριθμός που μόνο αυξάνεται, όπως ένα row version. Δουλεύει με κάθε βάση ή API που μπορεί να φιλτράρει με αυτή τη στήλη.
Για να μη χάνετε γραμμές στο όριο, χρησιμοποιήστε ένα παράθυρο επικάλυψης (lookback): ξεκινάτε κάθε εκτέλεση λίγο πριν το τελευταίο watermark (π.χ. 15 λεπτά) και αφήνετε το upsert/merge στον προορισμό να απορροφήσει τα διπλά.
CDC από το transaction log
Η βάση ήδη καταγράφει κάθε αλλαγή στο transaction log της. Το log-based CDC διαβάζει αυτό το log και παραδίδει κάθε insert, update και delete, με σειρά, χωρίς να κάνει ερωτήματα στους ίδιους τους πίνακες.
| Watermark | CDC από log | |
|---|---|---|
| Τι χρειάζεται η πηγή | Αξιόπιστη στήλη τροποποίησης | Ενεργή πρόσβαση στο log (π.χ. SQL Server CDC, MySQL binlog, PostgreSQL logical replication) |
| Βλέπει διαγραφές | Όχι | Ναι |
| Φορτίο στην πηγή | Ένα ερώτημα ανά εκτέλεση | Χαμηλό, διαβάζει το log |
| Κόπος στησίματος | Μικρός | Μεγαλύτερος, συνήθως θέλει DBA |
| Δουλεύει με APIs | Ναι, αν το API φιλτράρει με ημερομηνία | Όχι, μόνο βάσεις |
Πρακτικός κανόνας: ξεκινήστε με watermarks· περάστε τους μεγάλους πίνακες με συχνές αλλαγές σε CDC όταν οι διαγραφές μετράνε ή όταν το φορτίο στην πηγή γίνεται πρόβλημα.
Διαγραφές
Επιλογές, από την πιο απλή στην πιο πλήρη:
- Τις αγνοείτε, αν η πηγή ουσιαστικά δεν διαγράφει (πολλά ERP ακυρώνουν παραστατικά αντί να τα διαγράφουν, και η ακύρωση είναι ενημέρωση που θα τη δείτε).
- Περιοδική συμφωνία: μία φορά την εβδομάδα φορτώνετε μόνο τα πρωτεύοντα κλειδιά του πίνακα-πηγής και σημειώνετε ως διαγραμμένες στο warehouse τις γραμμές που λείπουν από την πηγή.
- CDC: οι διαγραφές έρχονται ως events· κρατήστε τις ως soft deletes (στήλη-σημαία), ώστε οι αναφορές να τις φιλτράρουν και να μη χάνετε ιστορικό.
Backfills
Αργά ή γρήγορα θα χρειαστεί να ξαναφορτώσετε μια περίοδο: μια φόρτωση αποτύγχανε για μια εβδομάδα, ή μια νέα στήλη θέλει ιστορικό. Κάντε τα backfills ασφαλή από τον σχεδιασμό:
- Φορτώνετε με upsert/merge στο πρωτεύον κλειδί, ποτέ με απλό append, ώστε οι ξαναφορτωμένες γραμμές να αντικαθιστούν αντί να διπλασιάζονται.
- Κάντε το χρονικό διάστημα παράμετρο, ώστε το ίδιο pipeline να τρέχει «από 2026-09-01 έως 2026-09-30» όποτε το χρειαστείτε.
- Μη μετακινήσετε κατά λάθος το αποθηκευμένο watermark προς τα πίσω σε ένα backfill, αλλιώς η επόμενη προγραμματισμένη εκτέλεση θα ξαναφορτώσει τα πάντα από εκείνο το σημείο.
Υλοποίηση στο Boomi Data Integration
Συνεχίζουμε από το pipeline του ERP στο Δεδομένα ERP και e-shop σε cloud data warehouse με το Boomi Data Integration: ένα source-to-target river από τη βάση SQL Server του ERP προς το Snowflake. Οι επιλογές και οι ονομασίες παρακάτω αντιστοιχούν στο προϊόν τη στιγμή που γράφουμε και μπορεί να διαφέρουν στη δική σας έκδοση.
Βήμα 1: Incremental εξαγωγή για τους μεγάλους πίνακες
Στις ρυθμίσεις πίνακα του river, αλλάξτε την εξαγωγή του invoice_lines από φόρτωση όλων των γραμμών σε incremental
και επιλέξτε το incremental πεδίο (π.χ. last_modified). Το Boomi Data Integration κρατά την τελευταία τιμή που φόρτωσε,
οπότε κάθε εκτέλεση συνεχίζει από εκεί. Ορίστε τον τρόπο φόρτωσης σε upsert/merge με το πρωτεύον κλειδί του πίνακα
(π.χ. invoice_id + line_no).
Αφήστε τους μικρούς πίνακες αναφοράς σε πλήρη αντικατάσταση· η incremental λογική δεν αξίζει για μερικές εκατοντάδες γραμμές.
Βήμα 2: Παράθυρο επικάλυψης
Αν η έκδοσή σας υποστηρίζει ρύθμιση offset ή lookback στο incremental πεδίο, χρησιμοποιήστε τη. Αν όχι, πετύχετε το ίδιο με ένα custom query για τον πίνακα που αφαιρεί ένα περιθώριο από την αποθηκευμένη τιμή εκκίνησης. Δείτε στην τεκμηρίωση πώς εκτίθενται στα custom queries οι μεταβλητές για την αρχή και το τέλος του incremental διαστήματος. Το upsert/merge του βήματος 1 κάνει την επικάλυψη αβλαβή.
Βήμα 3: CDC όπου μετράνε οι διαγραφές
Για πίνακες όπου οι διαγραφές ή το ακριβές ιστορικό αλλαγών μετράνε, γυρίστε το river στη μέθοδο εξαγωγής Change Data Capture, διαθέσιμη για συνηθισμένες βάσεις όπως SQL Server, MySQL, PostgreSQL και Oracle. Στην πλευρά της πηγής χρειάζεται προετοιμασία, συνήθως από DBA:
-- SQL Server: ενεργοποίηση CDC στη βάση και στον πίνακα (από DBA)
exec sys.sp_cdc_enable_db;
exec sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'invoice_lines',
@role_name = null;
Το Boomi Data Integration τεκμηριώνει τις ακριβείς προϋποθέσεις ανά βάση (δικαιώματα, διατήρηση log, αν χρησιμοποιεί SQL Server CDC ή Change Tracking). Σε λειτουργία CDC, το river προσθέτει στήλες metadata στον προορισμό, όπως σημαία διαγραφής και πληροφορία σειράς αλλαγών· ελέγξτε τα ακριβή ονόματά τους στους πίνακες-στόχους πριν γράψετε SQL πάνω τους.
Βήμα 4: Μόνο οι τρέχουσες γραμμές στις αναφορές
Με CDC, οι διαγραμμένες γραμμές μένουν στον raw πίνακα ως soft deletes. Δημιουργήστε ένα view στο schema analytics που τις κρύβει, ώστε κάθε αναφορά να μη χρειάζεται να θυμάται το φίλτρο:
create or replace view analytics.invoice_lines as
select *
from raw.erp_invoice_lines
where coalesce(is_deleted, false) = false; -- αντικαταστήστε το is_deleted με την πραγματική στήλη metadata
Βήμα 5: Σχεδιάστε τα backfills
Για πίνακες με watermark, ένα backfill είναι μια εφάπαξ εκτέλεση για επιλεγμένη περίοδο. Τρέξτε το από ένα αντίγραφο του river με custom query σταθερού χρονικού διαστήματος, αντί να μηδενίσετε την incremental τιμή του river παραγωγής. Με upsert/merge, οι ξαναφορτωμένες γραμμές αντικαθιστούν τις υπάρχουσες. Για πίνακες με CDC, ένα backfill συνήθως σημαίνει ένα νέο αρχικό snapshot του πίνακα και μετά συνέχιση του CDC από την τρέχουσα θέση του log· ελέγξτε πώς χειρίζεται η έκδοσή σας την επανεκκίνηση ενός πίνακα.
Πριν βγείτε σε παραγωγή
- Επαληθεύστε τη στήλη watermark. Ενημερώστε μια δοκιμαστική γραμμή στο ERP και βεβαιωθείτε ότι η στήλη τροποποίησης αλλάζει. Κάποιες οθόνες ERP ενημερώνουν πίνακες μέσω procedures που την παρακάμπτουν.
- Αποθήκευση και σύγκριση σε μία ζώνη ώρας. Προτιμήστε UTC στο warehouse και μετατροπή στις αναφορές.
- Ελέγξτε τη διατήρηση log για το CDC. Αν το pipeline μείνει εκτός λειτουργίας περισσότερο από όσο η πηγή κρατά τα logs της, οι αλλαγές χάνονται και χρειάζεστε πλήρη επαναφόρτωση.
- Συμφωνία σε τακτική βάση. Μια εβδομαδιαία σύγκριση πλήθους γραμμών και συνόλων ανάμεσα σε πηγή και warehouse πιάνει τις σιωπηλές αποκλίσεις.
- Ειδοποιήσεις και για «κολλήματα», όχι μόνο για αποτυχίες. Ένα river που πετυχαίνει αλλά φορτώνει μηδέν γραμμές για δύο μέρες αξίζει κι αυτό ειδοποίηση.
Σύνοψη
Η incremental φόρτωση είναι συμβιβασμός: τα watermarks είναι απλά και δουλεύουν σχεδόν παντού, το CDC από logs βλέπει τα πάντα, και τις διαγραφές, αλλά θέλει περισσότερο στήσιμο. Συνδυάστε όποιο από τα δύο με upsert/merge και παραμετρικά backfills, και τα pipelines σας μένουν γρήγορα και σωστά καθώς τα δεδομένα μεγαλώνουν. Στο Boomi Data Integration και οι δύο προσεγγίσεις είναι επιλογές του ίδιου river. Για τη μεγάλη εικόνα, δείτε τον Ολοκλήρωση δεδομένων, ETL και ELT: πρακτικός οδηγός.