sluice

sluicesync·sluicesync.sluice

Open-source MySQL <-> Postgres database migration and continuous-sync (CDC) tool

sluice is an open-source database migration and continuous-sync (CDC) tool covering MySQL and Postgres in all four directions.

winget install --id sluicesync.sluice --exact --source winget

Latest 0.134.0·August 28, 2026

Release Notes

The consistency-and-hygiene release. The headline is a deliberate behavior change:a mid-sync timestamp ⇄ timestamptz column swap now refuses under the default --schema-changes=forward instead of silently forwarding — the rewritten values depend on the source ALTER session's TimeZone, which the replication wire does not carry, so the target's identical cast can silently diverge. Its sibling (time ⇄ timetz) already refused; the session-TZ-cast class now has one posture. Plus seven audit-filed hygiene items, all mutation-verified.

Changed

timestamp ⇄ timestamptz mid-stream swaps refuse under forward mode (cdc_relations.go, the sessionTZSwapPair predicate, both directions, refusal naming the source-vs-target session-TimeZone mechanism and the drained-model remedy). Precision-only temporal changes (timestamp(6)→(3) etc.) forward and converge exactly as before — pinned. sluice's applier does not pin a session TimeZone, and a target-side pin could not close the hazard anyway (the source ALTER session's zone is not on the wire) — recorded in ADR-0091. Honest residuals filed, not fixed:the ARRAY variants (time[] ⇄ timetz[], timestamp[] ⇄ timestamptz[]) still forward with the same per-element hazard, and MySQL's timestamp ⇄ datetime MODIFY is the other lane's class analogue — both are design-scoped follow-ups.

Fixed

timetz columns now project WithTimeZone in CDC relation state (registry parity with the schema reader), removing a live phantom-alter every timetz column previously produced at classifier boundaries. The fix's naive form would have silently flipped time ⇄ timetz swaps from refuse to forward — caught by mutation before landing; the refusal is preserved with an honest session-TZ message. The SLUICE-E-CDC-STATEMENT-DML tripwire now enumerates WITH (CTE-DML) — previously a documented residue, a statement-format WITH x AS (…) UPDATE was silently dropped; it now refuses like the other DML verbs. LocalStore crash-orphaned temp files are invisible to List and swept (age-guarded, best-effort) by the next same-key write.

Internal

The CDC roster gates refuse alias references of their guarded preflights (closing the invoke-through-a-variable evasion, with self-tests; name-based residual stated); honest comment corrections (splitDBList's per-arm asymmetry; the probe round-trip count claim); dependency bumps (otel v1.46.0 family; kong 1.16.1 via Dependabot).

Compatibility

Drop-in from v0.133.1 with one deliberate posture change:a timestamp ⇄ timestamptz ALTER mid-sync now stops the stream loudly where every prior release forwarded it. If both your ALTER session and the apply path ran UTC, the old forwarding converged and nothing was lost; if they differed, prior releases silently diverged pre-existing rows — run sluice verify on any table that crossed that ALTER historically. The refusal's remedy is the standard drained-model apply.

Install

# Homebrew
brew upgrade sluice

# Scoop (Windows)
scoop update sluice

# Go
go install sluicesync.dev/sluice/cmd/sluice@v0.134.0

Container images:ghcr.io/sluicesync/sluice:0.134.0 (multi-arch; the image tag carries no v prefix).

Full changelog: https://github.com/sluicesync/sluice/blob/main/CHANGELOG.md

Installer type: zip

arm64—A188C11E06A268BFFFB727A60C0DC5F78714F4D8E342530B58F433EC472FEAD6
x64—980E288E82FA108DDA205D97D8F315F210D062838C70F9058263F5FCAF537431

Details

Homepage
https://sluicesync.com
License
Apache-2.0
Publisher
sluicesync
Copyright
sluicesync
Moniker
sluice

Tags

databasemigrationcdcmysqlpostgres

Older versions (4)

0.100.0
arm64—5c4858f48d4b74d992b51d784b6bc57421c5cd7f85be60c93d2a49afb9347b30
x64—c05ec4e8a54afd6b0e139540516be6dcbb4186808a18799d03958fe4a9705ea3
0.99.158
arm64—99ca9205112d0b2335e67c82b57c664d1f3c74c71392fd174a97b36c8c049cda
x64—c88b4c8948ee8727643d9831a2a16fb91ccd0a2b50f142f050ae49756604140e
0.99.41
arm64—80dd5c257ce02bb27e2a3973c184f0b512229182fe0986cace0aef66fbb2c29f
x64—ab40208221248f3599c7e77f80d8471dd1509f3063ab33ff8cfe85f358819deb
0.99.2
arm64—9357f57897c29c7f839f512e71c5bd05ce76215f7658a605cbaa07786773875b
x64—4912877dbd1f215b9fa3ba6313131c345e584c436d2b04ed39bae2f9bfe3f8b3