Who this affects
Only pipelines using the microsoft_sql_server_cdc input with the built-in SQL Server checkpoint cache — i.e. you have not set the checkpoint_cache field, so Connect manages a checkpoint table for you (default rpcn.CdcCheckpointCache).
If you set checkpoint_cache to your own cache resource (Redis, etc.), you are not affected and no action is needed.
What we found
The checkpoint table stored the Log Sequence Number (LSN) in a character column (varchar). The SQL Server driver decodes those raw LSN bytes as text using the database's read collation, which can corrupt the stored LSN. The corruption is silent while the pipeline runs and only surfaces on restart, when Connect tries to resume from the stored position. Whether a given LSN is affected depends on the exact byte values SQL Server generates, so we can't say in advance which deployments have hit it.
The fix
Connect v4.103.0 changes the checkpoint column to varbinary(10). On the first startup after upgrade, the connector migrates the existing table in place automatically — the on-disk bytes are intact, so the true LSN is recovered byte-for-byte. No cache truncation and no resnapshot are required in the normal case. The migration is one-time, guarded by a lock so pipelines sharing a checkpoint table can start concurrently, and is a no-op on subsequent restarts.
Action required before you upgrade
Grant the Connect user ALTER permission on the checkpoint cache table:
GRANT ALTER ON [rpcn].[CdcCheckpointCache] TO [<connect_user>];(Substitute your table if you set checkpoint_cache_table_name. If you use checkpoint_cache_connection_string, grant it on that server.)
Without ALTER, the pipeline will fail to start after upgrade with an error saying the checkpoint table can't be altered due to permissions. Granting the permission and restarting resolves it — nothing is lost.
Rare edge case
If a stored checkpoint value isn't a valid 10-byte LSN, it can't be recovered safely. Connect will refuse to start and name the affected rows, with instructions to clear them:
UPDATE [rpcn].[CdcCheckpointCache] SET cache_val = NULL WHERE DATALENGTH(cache_val) <> 10;After clearing, affected pipelines resume with a full resnapshot if stream_snapshot: true, or by replaying each change table from its tracked start LSN if false.