Extension Upgrade Path
Extension versions move independently from Postgres majors. Plan OS package upgrades, ALTER EXTENSION UPDATE, and regression tests as a single change window, especially for pgvector and PostGIS.
Search across all documentation pages
Extension versions move independently from Postgres majors. Plan OS package upgrades, ALTER EXTENSION UPDATE, and regression tests as a single change window, especially for pgvector and PostGIS.
-- Check current vs target version
SELECT extname, extversion
FROM pg_extension
WHERE extname = 'vector';
SELECT name, default_version
FROM pg_available_extensions
WHERE name = 'vector';
-- Apply available upgrade scripts
ALTER EXTENSION vector UPDATE TO '0.8.0';
-- Verify
SELECT extname, extversion FROM pg_extension WHERE extname = 'vector';When to reach for this: After patching Postgres, deploying new extension packages, or before building HNSW indexes that require a minimum pgvector version.
-- Safe upgrade runbook (run on staging first)
BEGIN;
-- 1) Snapshot inventory
CREATE TEMP TABLE ext_before AS
SELECT extname, extversion FROM pg_extension;
-- 2) Upgrade one extension
ALTER EXTENSION postgis UPDATE;
-- 3) Compare
SELECT b.extname,
b.extversion AS before_version,
e.extversion AS after_version
FROM ext_before b
JOIN pg_extension e ON e.extname = b.extname
WHERE b.extversion IS DISTINCT FROM e.extversion;
-- 4) Smoke test
SELECT PostGIS_Version();
SELECT ST_Distance(
ST_MakePoint(-73.9857, 40.7484)::geography,
ST_MakePoint(-118.2437, 34.0522)::geography
) AS nyc_to_la_meters;
COMMIT;What this demonstrates:
ALTER EXTENSION UPDATE without TO applies latest available scriptpostgresql-18-postgis-3.5 (or vendor equivalent) on every node.ALTER EXTENSION name UPDATE [TO 'version'] runs SQL migration scripts in EXTENSION(name)/.REINDEX (pgvector index opclass changes). Read release notes.-- List upgrade path scripts shipped with the extension
SELECT version, relocatable
FROM pg_available_extension_versions
WHERE name = 'vector'
ORDER BY version;| Scenario | Postgres major | Extension action |
|---|---|---|
| pgvector 0.7 to 0.8 | Same PG 18 | ALTER EXTENSION UPDATE, possible reindex |
| PostGIS 3.4 to 3.5 | Same PG 18 | ALTER EXTENSION UPDATE, run postgis_extensions_upgrade() if docs say so |
| PG 17 to PG 18 | Major bump | pg_upgrade or dump/restore, reinstall packages, then ALTER EXTENSION UPDATE |
ALTER EXTENSION on primary.ALTER EXTENSION during maintenance window.ALTER EXTENSION in each database.There is no ALTER EXTENSION DOWNGRADE. Rollback means restore from backup or recreate indexes after reinstalling older packages (high risk). Test upgrades on a snapshot clone.
.so file causes runtime crashes. Fix: Upgrade packages on all nodes before ALTER EXTENSION.REINDEX CONCURRENTLY where supported; schedule off-peak.appdb but not analytics. Fix: Loop all databases: \l + per-DB ALTER EXTENSION.postgis_topology) need their own UPDATE. Fix: Inventory all postgis* rows in pg_extension.| Alternative | Use When | Don't Use When |
|---|---|---|
| Blue/green database | Zero-downtime cutover required | Extension change is minor and tested |
| Dump/restore to new cluster | Major PG + extension jump together | Database size makes dump impractical |
| Freeze extension version | Stability over features | Security patch requires minimum version |
| Side-by-side new DB | Rebuild indexes from scratch is faster than in-place upgrade | App cannot tolerate dual-write period |
Stack versions: This page was written for PostgreSQL 18.4 (stable 18, maintenance 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x, and Patroni 3.x.
Reviewed by Chris St. John·Last updated Jul 18, 2026