mirror of
https://github.com/xataio/pgroll.git
synced 2024-08-16 01:00:47 +03:00
PostgreSQL zero-downtime migrations made easy
Implement `Start` for **add column** operations that add a `NOT NULL` column without a `DEFAULT`. To add such a column without forcing a exclusive lock while a full table scan is performed, these steps need to be followed: On `Start`: 1. Add the new column 2. Add a `CHECK IS NOT NULL` constraint to the new column, but with `NOT VALID`, to avoid the scan. 3. Backfill the new column with the provided `up` SQL. On `Complete` 1. Validate the constraint (with `ALTER TABLE VALIDATE CONSTRAINT`). 2. Add the `NOT NULL` attribute to the column. The presence of a valid `NOT NULL` constraint on the column means that adding `NOT NULL` to the column does not perform a full table scan. See [this post](https://medium.com/paypal-tech/postgresql-at-scale-database-schema-changes-without-downtime-20d3749ed680#00dc) for a summary of these steps. |
||
---|---|---|
.github | ||
.vscode | ||
cmd | ||
examples | ||
pkg | ||
.golangci.yml | ||
docker-compose.yml | ||
go.mod | ||
go.sum | ||
main.go | ||
README.md |
pg-roll
⚠️ Under development ⚠️
PostgreSQL zero-downtime migrations made easy.
Getting started (development)
-
Bring a development PostgreSQL up:
docker compose up
-
Initialize pg-roll (first time only):
go run . init
-
Start a migration:
go run . start examples/01_create_tables.json
-
Inspect the results:
psql postgres://localhost -U postgres
\d+ public.* \d+ 01_create_tables.*
-
(Optional) Rollback the migration (undo):
go run . rollback
-
Complete the migration:
go run . complete