Glen Aultman-Bettridge
07/30/2026, 3:01 AMkapa.ai
07/30/2026, 3:01 AM_airbyte_emitted_at and _airbyte_normalized_at timestamp, regardless of whether it changed in the source. [Full Refresh Tutorial]
There is also an open bug where, if the destination table is shared by more than one connection, Full Refresh | Overwrite may append rows instead of replacing them (a regression introduced with the Direct Load feature in destination-postgres v3.0.11). [GitHub Issue]
Recommendations • For write-heavy source tables, consider switching to Incremental | Append + Deduped with a cursor column (e.g., updated_at) to avoid the CTID race condition. [GitHub Issue]
• If deduplication is important and syncs may be interrupted/resumed, prefer Full Refresh | Overwrite + Deduped over plain Overwrite. [Overwrite + Deduped Docs]
• Ensure each destination table is used by only one connection to avoid the append-instead-of-overwrite bug. [GitHub Issue] 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Glen Aultman-Bettridge
07/30/2026, 3:03 AMkapa.ai
07/30/2026, 3:03 AMfull_refresh | overwrite streams can append data forever instead of overwriting, under certain conditions. [GitHub Issue]
The root cause: the connector decides whether to truncate or append by sampling one arbitrary row from the existing table:
SELECT "_AIRBYTE_GENERATION_ID" FROM <table> LIMIT 1
If that sampled row has a _airbyte_generation_id >= minimumGenerationId (the current sync's generation), the connector takes the append path instead of the truncate/swap path. This misfires permanently when the table contains stale rows with higher generation IDs than the current stream's counter — for example, after re-pointing a connection to a different destination namespace. [GitHub Issue]
Observed impact in production:
• A 741-row dimension table grew to 14,000+ rows
• Downstream views joining affected tables cross-multiplied to billions of rows
• Job status remained succeeded throughout — no visible errors [GitHub Issue]
Workaround The only recovery found was manually deleting the stale high-generation rows (or emptying/dropping the final table), after which normal truncate-per-sync behavior resumed. [GitHub Issue]
Fix Status The Airbyte team acknowledged the bug and planned to fix it by using strict equality (==) instead of >= in the generation ID comparison. However, as of the issue comments, the CDK change was awaiting rollout into the Snowflake connector version. [GitHub Issue]
> Note: The source-postgres CTID scanning issue described previously is independent of the destination — it affects what rows are read from Postgres regardless of where they're written. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Glen Aultman-Bettridge
07/30/2026, 3:05 AMkapa.ai
07/30/2026, 3:05 AMfull_refresh | overwrite stream, regardless of the nature of the source data. The problem is in the destination connector's truncate decision logic, not in the type of data being synced. [GitHub Issue]
That said, the practical impact depends on your sync mode:
• If you're using Full Refresh | Overwrite on an event table, the bug still applies — the table would grow unboundedly instead of being replaced each sync.
• If you're using Incremental | Append for an event tracking table (which is the typical choice for immutable event data), the generation ID bug does not apply — that bug is specific to the truncate path used by full_refresh | overwrite streams. [GitHub Issue]
Recommendation For insert-only event tables, Incremental | Append is generally the appropriate sync mode anyway, since you want to accumulate all events rather than overwrite them. In that case, you would not be affected by this particular bug.
If you have a specific reason to use Full Refresh | Overwrite on an event table, the bug would still apply and the same manual workaround (clearing stale high-generation rows) would be needed until the fix is rolled out. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Glen Aultman-Bettridge
07/30/2026, 3:07 AMkapa.ai
07/30/2026, 3:07 AMUPDATE transactions during the scan. [GitHub Issue] If no updates are occurring, that race condition cannot happen.
> One caveat: the knowledge sources do mention that the code handles VACUUM separately (file node changes between batches). If aggressive VACUUM or VACUUM FULL runs concurrently and rewrites the table, that could theoretically affect any table. But for normal operations on an insert-only table, the CTID bug is not a concern. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.