Skip to content
dbexplore

PostgreSQL 17

What PostgreSQL 17 changed in monitoring

Released 26 September 2024, supported until 8 November 2029. 14 pages so far, each verified against PostgreSQL 17.11.

PostgreSQL 17 is where a decade of assumptions about the background writer view stopped holding. The checkpoint counters left it for a view of their own, and the two columns that counted backend writes were dropped outright, so an exporter written for 16 either errors or scrapes nothing depending on how carefully it was written. The same release changed vacuum in two ways an operator feels: the memory that holds dead row pointers is no longer capped at a gigabyte, so a large table needs fewer index passes, and the progress view reports that memory in bytes instead of tuple counts. The statements extension renamed its block timing columns to distinguish shared from local buffers, and gained a column recording when each row began accumulating. Wait events got a catalog view with descriptions. Replication slots now say why they were invalidated and when they went idle. And the upgrade tool learned to carry logical slots forward, but only from a 17 source, which is misreported often enough to be worth a page. Every page here runs its queries on a 17 container and a 16 container so the difference is shown rather than described.

The release notes for this version are at postgresql.org; every page below cites the section it draws on by name. The hub for every supported version carries the support calendar.

  1. PostgreSQL 17 breaks: errors

    pg_stat_checkpointer replaced pg_stat_bgwriter

    For anyone who runs an exporter, a Datadog check or a collector against a cluster that is about to become a PostgreSQL 17 cluster.

  2. PostgreSQL 17 breaks: errors

    The statements view renamed its I/O timers

    For anyone who ranks slow statements by the time they spend waiting on blocks.

  3. PostgreSQL 17 breaks: none

    Knowing how old a statements row really is

    For anyone computing a rate from pg_stat_statements without knowing the denominator.

  4. PostgreSQL 17 breaks: errors

    Vacuum progress stopped counting in tuples

    For anyone who watches a long vacuum by polling the progress view.

  5. PostgreSQL 17 breaks: none

    Vacuum finally says how many indexes are left

    For anyone who has waited out the index phase of a vacuum blind.

  6. PostgreSQL 17 breaks: none

    Wait events that arrive with their own glossary

    For anyone who has met an unfamiliar wait event name on a dashboard.

  7. PostgreSQL 17 breaks: none

    Slots that say why they died and when

    For anyone who has found a slot in the lost state and wanted the reason.

  8. PostgreSQL 17 breaks: none

    Vacuum is no longer capped at one gigabyte

    For anyone who raised maintenance_work_mem on a huge table and saw nothing change.

  9. PostgreSQL 17 breaks: silent

    Every SLRU cache but one changed its name

    For anyone whose cache panel is keyed on a string literal typed years ago.

  10. PostgreSQL 17 breaks: none

    EXPLAIN can price the wire and the planner

    For anyone holding a fast plan for a query the application times as slow.

  11. PostgreSQL 17 breaks: none

    A reset call that now wipes everything

    For anyone with a scheduled job that resets statistics on a cluster.

  12. PostgreSQL 17 breaks: none

    pg_upgrade carries logical slots only from 17

    For anyone planning an upgrade around the promise that slots now survive.

  13. PostgreSQL 17 breaks: silent

    log_connections now logs trust connections

    For anyone who ships Postgres logs to a SIEM and has to answer an auditor out of them.

  14. PostgreSQL 17 breaks: errors

    pg_stat_subscription gained a worker type

    For anyone running logical replication who has ever asked why the subscription has three processes.

Grep your monitoring configuration for these

Every view, column and setting the pages above touch, in one list. A hit in an exporter query file, a dashboard definition or an alert rule is a place to read the page that names it.

  • EXPLAIN BUFFERS
  • EXPLAIN MEMORY
  • EXPLAIN SERIALIZE
  • Planning Memory
  • SERIALIZE BINARY
  • autovacuum_work_mem
  • backend_type
  • blk_read_time
  • blk_write_time
  • blks_zeroed
  • buffers_backend
  • buffers_backend_fsync
  • buffers_checkpoint
  • calls
  • checkpoint_sync_time
  • checkpoint_write_time
  • checkpoints_req
  • checkpoints_timed
  • confirmed_flush_lsn
  • conflicting
  • connection authenticated
  • connection authorized
  • dead_tuple_bytes
  • description
  • heap_blks_scanned
  • heap_blks_total
  • heap_blks_vacuumed
  • hot_standby_feedback
  • inactive_since
  • index_vacuum_count
  • indexes_processed
  • indexes_total
  • invalidation_reason
  • leader_pid
  • local_blk_read_time
  • local_blk_write_time
  • local_blks_hit
  • log_connections
  • maintenance_work_mem
  • max_dead_tuple_bytes
  • max_dead_tuples
  • max_exec_time
  • max_parallel_maintenance_workers
  • max_replication_slots
  • min_exec_time
  • minmax_only
  • minmax_stats_since
  • name
  • num_dead_item_ids
  • num_dead_tuples
  • pg_create_logical_replication_slot
  • pg_current_logfile
  • pg_hba_file_rules
  • pg_replication_slots
  • pg_stat_activity.wait_event
  • pg_stat_activity.wait_event_type
  • pg_stat_archiver
  • pg_stat_bgwriter
  • pg_stat_checkpointer
  • pg_stat_io
  • pg_stat_progress_vacuum
  • pg_stat_reset_shared
  • pg_stat_reset_slru
  • pg_stat_slru
  • pg_stat_statements
  • pg_stat_statements_info
  • pg_stat_statements_reset
  • pg_stat_subscription.worker_type
  • pg_stat_wal
  • pg_subscription_rel
  • pg_wait_events
  • phase
  • plugin
  • recovery_prefetch
  • relid
  • restart_lsn
  • safe_wal_size
  • shared_blk_read_time
  • shared_blk_write_time
  • shared_blks_read
  • stats_reset
  • stats_since
  • temp_blks_written
  • temporary
  • wait_event
  • wal_level
  • wal_status

The failure modes these changes touch are in the reference guides; the terms the release notes assume are in the glossary. Across a fleet, the version is what decides where a signal lives, which is why engine discovery establishes it first.

Put every Postgres you run on autopilot.

We onboard teams in small batches. Tell us about your fleet and we will reach out when a seat opens. One email, no drip campaign.