SevyDevy

Guide · Backend

PostgreSQL 14 End of Life Explained: How to Upgrade Before 12 November 2026

19 min readUpdated By Saket Bhatnagar

Researched and drafted with AI, reviewed and edited by Saket Bhatnagar.

In short

  • PostgreSQL 14 end of life is 12 November 2026. That day's minor release, a fixes-only update like 14.24, is its last; after it, version 14 gets no bug or security fixes.
  • The server keeps running, but any flaw found later stays open. The August 2026 update alone fixed 24 security flaws in version 14, and 12 were rated 8.8 out of 10.
  • There are three ways to upgrade. Dump and restore exports and reloads everything. pg_upgrade reuses your data files; its fast modes need only minutes of downtime, the time your app cannot write. Logical replication streams row changes to a new server, with seconds of downtime.
  • Pick PostgreSQL 18, the newest stable version, supported until 14 November 2030. Version 19 is still a release candidate, a near-final test build, as of 19 October 2026.
  • Beginners can stop after the three upgrade paths. Engineers then get traps we reproduced on 14.24 and 18.6. Version 18's new default of page checksums (corruption checks) blocks pg_upgrade from default 14 clusters, and logical replication never copies large objects, PostgreSQL's separate store for big files.

What goes wrong when you keep running PostgreSQL 14 after November 2026?

Nothing breaks on the day, but your database stops getting fixes. PostgreSQL 14 end of life means no more patches after 12 November 2026, so security holes found later stay open.

Think of a phone that no longer gets updates. It still makes calls, but each new flaw stays unfixed on it. Where the picture breaks: a new phone is a quick purchase, but moving a database to a new major version is a project you rehearse.

Picture a common setup. A medicine delivery app keeps its orders, customers and scanned prescriptions in one 220 GB PostgreSQL 14 database. A standby copy can take over if the main server fails. The setup is made up, but the deadline is real.

The team has until 12 November and a quiet window of about 30 minutes at night (made up). This guide follows that team through the choice of a target version and an upgrade path.

Which words do you need before planning a PostgreSQL upgrade?

You need six words: major version, minor version, cluster, end of life, CVE and downtime.

  • Major version: the first number, such as 14 or 18. A new one ships about once a year and may change the system tables, so it needs a real upgrade.
  • Minor version: the number after the dot, such as 14.24. It carries only fixes. You install it by swapping the program files, called binaries, and restarting.
  • Cluster: one PostgreSQL server and all the databases in its data directory, the folder holding its files.
  • End of life (EOL): the point after which a version gets no fixes from the PostgreSQL project.
  • CVE: a public ID for one security flaw. Each one usually gets a CVSS severity score from 0 to 10.
  • Downtime: the minutes when your app cannot write to the database, because the old server is stopped and the new one is not yet live.

When is PostgreSQL 14 end of life, and what does it mean?

PostgreSQL 14 end of life is 12 November 2026. After one last minor release that day, the project stops fixing version 14.

The project supports each major version for five years after its first release, then ships one final minor release. Version 14 first shipped on 30 September 2021. Minor releases come at least every three months, usually on the second Thursday of February, May, August and November.

PostgreSQL support dates from the official versioning page, as of 19 October 2026
VersionCurrent minorFirst releaseFinal release
1414.2430 September 202112 November 2026
1515.1913 October 202211 November 2027
1616.1514 September 20239 November 2028
1717.1126 September 20248 November 2029
1818.625 September 202514 November 2030
19RC 1 onlyPlanned 19 November 2026Not yet listed

Check where your own server stands before planning anything. Connect with psql, the command-line client, and run these lines. We ran them on a fresh 14.24 cluster.

sql
-- Run in psql on the version 14 server
SHOW server_version;   -- 14.24 means you have the August 2026 fixes
SHOW data_checksums;   -- off unless the cluster was made with checksums on
SHOW wal_level;        -- replica is the default; logical replication needs logical
SHOW server_encoding;  -- reuse this and the next two values when you create the 18 cluster
SHOW lc_collate;
SHOW lc_ctype;

On that cluster, which we created with UTF8 and the C locale, they printed 14.24, off, replica, UTF8, C and C. If your server prints an older 14 number, patch it to 14.24 first. That needs new binaries and a restart, plus any extra steps in the release notes of each skipped version.

Which security fixes will PostgreSQL 14 miss after end of life?

It misses every security and bug fix released after 12 November 2026. Any flaw found later in code that version 14 shares with newer versions stays open on your server.

The 13 August 2026 update shows the scale. It fixed 28 security flaws and over 110 bugs across the supported versions. The project's security page lists 24 of those flaws as affecting version 14.

Twelve of those 24 were rated 8.8 out of 10. One example is a heap buffer overflow, code writing past the end of a memory area, in regular expressions, the text-pattern feature. It let anyone who can run queries execute code as the operating-system user that runs the database.

Not every flaw is in the server. Two of the 8.8 flaws were in client tools, pg_dump and psql. After 12 November, a new flaw like any of these gets no fix for 14.

Should you upgrade PostgreSQL 14 to 18 or wait for 19?

Upgrade to PostgreSQL 18 now. It is the newest stable release and is supported until 14 November 2030, four more years of fixes.

As of 19 October 2026, PostgreSQL 19 is not released. RC 1, a release candidate for final testing, came out on 15 October. General release is planned for 19 November, a week after version 14's last fix.

You can jump straight from 14 to 18 without stopping at 15, 16 and 17. The project asks you to read the release notes of every version in between, especially their Migration sections.

Version 15 would be a poor target for the team, because its fixes end on 11 November 2027. The team picks 18 and plans to test 19 next year.

What are the three ways to upgrade a PostgreSQL 14 database?

A major upgrade needs one of three methods: dump and restore, pg_upgrade, or logical replication. Copying the data folder to a new version will not work, because the layout of the system tables changes between major versions.

Dump and restore means exporting every database to a file with pg_dumpall and loading it into the new server. Use the dump tools from version 18, which the project recommends.

The three PostgreSQL 14 upgrade paths compared (pg_upgrade modes from the version 18 docs)
PathDowntimeRolling backWatch out for
Dump and restoreLongest; grows with data sizeEasy: old server untouchedSlowest of the three
pg_upgrade, copy modeGrows with data sizeEasy: old cluster unchangedDisk space for a second copy
pg_upgrade, clone modeMinutesEasy: old cluster unchangedNeeds Btrfs, reflink XFS or APFS, with both data folders on one file system
pg_upgrade, copy-file-range modeLike clone on some file systems; grows with data size on others, such as ext4Easy: old cluster unchangedLinux or FreeBSD only
pg_upgrade, link or swap modeMinutesOften a backup restoreOld cluster may become unsafe to start
Logical replicationSeconds at switch-overEasy before switch-over; after it, 14 lacks new writesSkips table definitions, sequence counters and large objects

Choosing a PostgreSQL 14 upgrade path

Notice the order of questions: your downtime budget rules out paths first, then your tables decide whether logical replication is possible.

Diagram connections:

  • PostgreSQL 14 cluster to Hours of downtime OK?
  • Hours of downtime OK? to Dump and restore (Yes)
  • Hours of downtime OK? to Minutes of downtime OK? (No)
  • Minutes of downtime OK? to pg_upgrade (Yes)
  • Minutes of downtime OK? to Every table replicable? (No, only seconds)
  • Every table replicable? to Logical replication (Yes)
  • Every table replicable? to pg_upgrade (No: fix tables or accept minutes)
  • PostgreSQL 14 cluster: Patched to 14.24 and backed up
  • Hours of downtime OK?: Small database or a long quiet window
  • Dump and restore: Simplest; use pg_dumpall from version 18
  • Minutes of downtime OK?: A short night window is enough
  • pg_upgrade: Clone, link or swap mode for speed
  • Every table replicable?: Rows findable by key; no large objects
  • Logical replication: Seconds of downtime at switch-over

The team's dump and restore rehearsal took about six hours on staging (made up), so it is out. Both other paths might fit the 30-minute window.

Beginners can stop here: you know the date, the risk, the target and the three paths. The rest is for the engineer running the upgrade, with every command tested on 14.24 and 18.6.

How does the pg_upgrade tool move PostgreSQL 14 to 18 with little downtime?

pg_upgrade builds fresh system tables, where PostgreSQL keeps its own records of your tables and users. It reuses your existing data files, because major releases rarely change how table data is stored.

Choosing a transfer mode

The transfer mode decides how data files reach the new cluster. Copy mode, the default, copies every file and leaves the old cluster untouched. It is safe but slow on big databases.

Link mode uses hard links, a second name for the same file on disk, so both clusters share the files and nothing is copied. Swap mode, new in 18, moves the data directories across. The docs say it can beat the others, especially with many tables.

Clone mode uses reflinks, a file-system feature that shares blocks until one side changes them. It is fast and leaves the old cluster untouched. It needs Linux kernel 4.5 or later with Btrfs or reflink-enabled XFS, or macOS with APFS. Link, clone and swap modes also need the old and new data folders on the same file system.

On a file system without reflinks, the check stops you early. On our ext4 test machine, the clone-mode check failed with this line: could not clone file between old and new data directories: Operation not supported. Copy-file-range mode, for Linux and FreeBSD, passed the same check. It can share blocks like clone on some file systems, but on our ext4 disk it still wrote a full copy.

Running the compatibility check first

Run pg_upgrade with the check option first. It changes no data, works while the old server is running, and lists the manual fixes you need. Add your chosen mode so its own checks run too. The script first makes the empty 18 cluster with initdb, the tool that creates a new cluster.

bash
# Run as the operating-system user that owns the data, from a folder it can write to.
# OLD_BIN and NEW_BIN are the bin folders of 14 and 18; OLD_DATA and NEW_DATA are data folders.
# pg_upgrade connects to both servers several times: use peer authentication or a .pgpass file.

# 1. Make the new 18 cluster. Put your old server_encoding and lc_collate in place of UTF8 and C.
#    If lc_ctype differs from lc_collate, use --lc-collate and --lc-ctype instead of --locale.
#    --no-data-checksums matches a 14 cluster where SHOW data_checksums printed off.
"$NEW_BIN/initdb" -D "$NEW_DATA" -E UTF8 --locale=C --no-data-checksums

# 2. Dry run while 14 still serves traffic. Pass the mode you plan to use.
"$NEW_BIN/pg_upgrade" --check --clone \
  --old-bindir="$OLD_BIN" --new-bindir="$NEW_BIN" \
  --old-datadir="$OLD_DATA" --new-datadir="$NEW_DATA" \
  --old-port=5432 --new-port=5433
# Expected last line: *Clusters are compatible*

When the old server is running, the two port numbers must differ, as above. Our run against a live 14.24 server ended with the line Clusters are compatible.

The script assumes a plain install, where initdb puts the config files inside the data folder. If you installed from your Linux distribution's packages, read their upgrade notes first. The docs say packages may ship their own scripts for major upgrades.

The checksum trap in PostgreSQL 18

Data checksums are small codes on each disk page that catch silent corruption. From version 18, initdb turns them on by default. Version 14's initdb left them off by default.

Pause and predict: you make the 18 cluster with plain initdb and run the check against a 14 cluster made the same way. Does it pass?

pg_upgrade needs both clusters to match. With a default 18 cluster and a default 14 cluster, our check stopped with: old cluster does not use data checksums but the new one does.

The fix is to make the new cluster with the no-data-checksums option, as in the script above. If your 14 cluster already has checksums on, leave the option out.

What to do after the upgrade

  • Before upgrading, install the version 18 builds of your extensions, such as pg_trgm for medicine-name search. Do not run CREATE EXTENSION again; pg_upgrade carries the definitions over.
  • pg_upgrade does not copy pg_hba.conf, which says who may connect, or postgresql.conf, the main settings file. It also skips postgresql.auto.conf, where ALTER SYSTEM commands save settings. In our test, shared_buffers, the main memory cache, fell from 256MB to the default 128MB, and our extra pg_hba.conf line and ALTER SYSTEM setting were gone. The default listen_addresses setting, localhost, makes the server refuse connections from other machines.
  • Carry those settings into the 18 data folder before you start it. A 14 setting that 18 no longer has, such as stats_temp_directory, stops 18 from starting.
  • The version 18 pg_upgrade carries over most planner statistics, the data summaries the query planner uses. It drops custom ones made with CREATE STATISTICS.
  • After the upgrade, run the two vacuumdb lines below. vacuumdb is a command-line tool that runs ANALYZE, the command that rebuilds statistics, on every database.
  • Rebuild the standby from the new primary, because the old standby still runs version 14. The docs offer a shortcut with rsync, a file-syncing tool, only for link mode.
bash
# After pg_upgrade finishes, you carry over the config files and start the 18 server
"$NEW_BIN/vacuumdb" --all --analyze-in-stages --missing-stats-only
"$NEW_BIN/vacuumdb" --all --analyze-only
"$NEW_BIN/psql" -Atc "SHOW server_version;"   # expected: 18.6

In our test, a table's ordinary statistics survived the upgrade, but its CREATE STATISTICS data was empty. The first vacuumdb line rebuilt it.

How does logical replication upgrade PostgreSQL with seconds of downtime?

You build a new PostgreSQL 18 server and let it copy every row change from version 14 as it happens. When it has caught up, you point the app at it, and the switch takes seconds.

Logical replication sends row changes, such as a new order, rather than raw disk pages, so it works across major versions. Version 14 publishes the changes, and 18 subscribes to them.

A logical replication upgrade, step by step

Notice that only the last two steps pause the app. Everything before them runs while customers keep ordering.

Diagram connections:

  • Build an 18 server to Copy the schema
  • Copy the schema to Publication on 14
  • Publication on 14 to Subscription on 18
  • Subscription on 18 to Catch up and test
  • Catch up and test to Pause writes
  • Pause writes to Point the app at 18
  • Build an 18 server: Fresh cluster on a new machine
  • Copy the schema: 18's pg_dump --schema-only against 14, load on 18
  • Publication on 14: Needs wal_level set to logical
  • Subscription on 18: Copies existing rows, then streams changes
  • Catch up and test: Compare row counts, run app tests
  • Pause writes: Wait for the last changes, then set sequences
  • Point the app at 18: Keep 14 untouched as a fallback

The low downtime has a price. Version 14 needs wal_level, the setting for how much detail goes into its change log, raised to logical. That setting only changes on a restart.

What logical replication never copies

It does not copy the schema, meaning your table definitions, or later schema changes. It does not copy sequence values, the counters behind auto-numbered IDs. It never copies large objects, PostgreSQL's way of storing big files such as scanned images.

We checked this from 14.24 to 18.6. Every row arrived, but the ID sequence on 18 still stood at 1, not 5001. The large object count was 1 on 14 and 0 on 18, with no error. In a second run, the first new order on 18 failed with: duplicate key value violates unique constraint "orders_pkey".

So set every sequence on 18 just before the switch. The docs suggest copying the values from 14 or picking a high enough value from the tables.

Tables without a replica identity

Every published table needs a replica identity, a way to find a row on the other side, usually its primary key. Inserts still work without one. Updates and deletes on that table start failing on the live version 14 server.

Our test update on such a table failed with: cannot update table "audit_log" because it does not have a replica identity and publishes updates. This query lists such tables before you publish anything.

python
# Needs the psycopg 3 driver: pip install "psycopg[binary]==3.2.10"
import psycopg

# Tables whose UPDATE and DELETE fail once they are in a publication:
# REPLICA IDENTITY NOTHING, DEFAULT with no primary key, or USING INDEX with the index gone.
QUERY = """
SELECT n.nspname, c.relname
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p')
  AND n.nspname NOT IN ('pg_catalog', 'information_schema')
  AND (c.relreplident = 'n'
       OR (c.relreplident = 'd' AND NOT EXISTS (
             SELECT 1 FROM pg_constraint p
             WHERE p.conrelid = c.oid AND p.contype = 'p'))
       OR (c.relreplident = 'i' AND NOT EXISTS (
             SELECT 1 FROM pg_index i
             WHERE i.indrelid = c.oid AND i.indisreplident)))
ORDER BY 1, 2
"""

with psycopg.connect("dbname=orders host=localhost user=postgres") as conn:
    for schema, table in conn.execute(QUERY):
        print(f"Needs a replica identity first: {schema}.{table}")

On our test database it printed three tables: one with no primary key, one set to NOTHING, and one whose identity index was dropped. In the team's database it finds only an audit_log table, easy to fix with a key.

The real blocker is that scanned prescriptions are stored as large objects, which logical replication cannot carry. Moving them into normal tables is a project of its own, and the deadline is too close.

The team picks pg_upgrade in clone mode. Its disks use reflink-enabled XFS (made up), and the new data folder sits on the same volume. The old cluster stays safe as a fallback.

What should a PostgreSQL 14 upgrade plan include before 12 November 2026?

A good plan has a rehearsal, a dated go-live and a written way back. Here is the team's.

  1. Patch and back up

    Move to 14.24 this week. Take a full backup and test that it restores.

  2. Read the release notes

    Read the Migration sections for 15, 16, 17 and 18, noting anything your app relies on.

  3. Rehearse on staging

    Restore the backup to staging, run pg_upgrade with the check option, fix every warning and time the real run.

  4. Test the app on 18

    Run the test suite and the busiest order queries on the upgraded copy.

  5. Schedule the window

    Book a quiet night in early November, before 12 November, and tell everyone who depends on the database.

  6. Upgrade and verify

    Stop the app and the 14 server, then run the same pg_upgrade command without the check option. Carry your pg_hba.conf, postgresql.conf and postgresql.auto.conf settings into the 18 data folder. Start 18, run the vacuumdb lines, check SHOW server_version prints 18.6 and run smoke tests.

  7. Keep the way back open

    Keep the untouched version 14 cluster for now. Rebuild the standby once 18 looks healthy.

On staging, the clone-mode run took 12 minutes and statistics another 8 (made up). That fits the 30-minute window, with the old cluster still safe beside the new one.

How do you explain a PostgreSQL major version upgrade in a system design interview?

Show that you treat an upgrade as a planned change with a way back. Use this frame.

  1. State the deadline and the risk

    Version 14 stops getting fixes on 12 November 2026, so new security flaws stay open.

  2. Pick the target

    Choose the newest stable major version, 18 as of October 2026, for the longest support.

  3. Size the downtime budget

    Ask how many minutes of paused writes the business can accept.

  4. Choose the path

    Dump and restore for small databases, pg_upgrade in a fast mode for minutes, logical replication for seconds if the tables allow it.

  5. Rehearse and keep a way back

    Rehearse on a copy, time it, and keep an untouched old cluster or a tested backup.

Questions people ask

Will PostgreSQL 14 stop working on 12 November 2026?
No, it keeps running as before. End of life means the PostgreSQL project stops releasing fixes for it. Any flaw found after the final release stays unfixed, so the risk grows over time.
Can I upgrade from PostgreSQL 14 straight to 18?
Yes. You can jump between major versions without installing the ones in between. Read the release notes of 15, 16, 17 and 18 first, because each may change behaviour your app relies on.
Should I wait for PostgreSQL 19 instead?
Not if you are on version 14. As of 19 October 2026, PostgreSQL 19 is a release candidate, and its general release is planned for 19 November 2026, after version 14's last fix. Upgrade production to 18.
Why does pg_upgrade fail with a data checksums error?
Because version 18's initdb turns data checksums on by default, while version 14's initdb left them off. pg_upgrade needs both to match. Create the new cluster with the no-data-checksums option. Or turn checksums on in the stopped 14 cluster with pg_checksums. It rewrites every file while the server stays stopped, so a large cluster means long downtime. The docs also say to switch the standby the same way or rebuild it.
What if my database is on a managed cloud service?
Check your provider's own page. Managed services set their own end-of-support dates and policies, which can differ from the community date of 12 November 2026. Plan the major upgrade the same way.
Does logical replication copy everything to the new server?
No. It copies table rows, but not the schema, schema changes, sequence values or large objects. Copy the schema first with pg_dump and set the sequences just before switching over.
Do I need the latest 14 minor release before upgrading?
Not for pg_upgrade, which accepts any 14.x source. It is still wise, because 14.24 carries the August 2026 security fixes. It needs no dump or pg_upgrade, just new binaries, a restart and any post-update steps in the release notes.

Sources and further reading

Practise this with Lala

Practise