In the context of enterprise-grade cloud migrations (think legacy databases or petabyte-scale data lakes ingestion into Databricks Delta Lake), the industry standard approach involves splitting the ingestion stack into 2:
History (Initial Bulk Load) and CDC (Change Data Capture / Continuous Stream) with both eventually writing into the same target table(s). This allows to treat the initial data import and ongoing changes as separate but strongly related operations.
Mechanics
Source Export: Point in time dump of the source database/lake into parquet or csv files in cloud storage
Ingestion Engine: Auto Loader in Directory Listing Mode + Trigger.AvailableNow
Target Write: Copy the raw parquet files into either Bronze layer Delta table in append mode or directly into Silver via bulk Insert Into
Phase 2: CDC Ingestion (Incremental Stream)
The CDC stream captures all inserts, updates and deletes (CREATE, UPDATE, DELETE) that occurred in the source system after the snapshot moment in time ($T_{\text{snapshot}}$)
Mechanics
Source Capture: Debezium / AWS DMS / Qlik etc. reading database WAL logs and writing individual small JSON/AVRO files into landing/cloud storage
Ingestion Engine: Auto Loader in File Notification Mode (cloudFiles.useNotifications = true OR
cloudFiles.useManagedFileEvents = true)
State Resolution (Silver): Delta Lake MERGE INTO or Lakeflow APPLY CHANGES INTO to de-duplicate and keep only the latest record version per PK