Materialize Self-Managed v26.0.0: Upstream Schema Change Support, Cost Efficiency Improvements, and Security Enhancements

Pranshu Maheshwari
November 20, 2025
Paul Hemberger
November 20, 2025

We're thrilled to announce Materialize v26.0.0, the newest major release of Self-Managed Materialize. This update includes an enhancement to sources, allowing you to handle upstream schema changes with zero downtime. With v26.0.0, swap is enabled by default, reducing the amount of physical memory (RAM) required to run workloads. Finally, we’ve added support for SASL/SCRAM authentication, giving you a more secure way to connect to Materialize.

If you'd like to get started right away, follow our first-time installation guide or our upgrade guide. But if you're curious about the details, read on!

Handle upstream schema changes in PostgreSQL sources

Materialize sources ingest data continuously from external systems, like PostgreSQL databases, or Kafka topics. In simple terms, you can think about this as ingesting continuous streams of data and the associated schemas. Historically, handling schema changes in database sources has been difficult in Materialize. To incorporate a schema change, you would have had to drop and recreate the source, risking downtime

With the latest release of Materialize, you can handle two of the most important types of upstream schema changes from PostgreSQL sources seamlessly, without any downtime: adding and dropping columns from your upstream database.

To enable this, we’ve made a slight modification to the syntax for creating a source. The code block below shows what it now looks like to create a source which can handle upstream schema changes:

1
-- First, create a connection, using the same syntax as before:
2
CREATE CONNECTION pg_connection TO POSTGRES (
3
  HOST '<host>',
4
  PORT 5432,
5
  USER 'materialize',
6
  PASSWORD SECRET pgpass,
7
  SSL MODE 'require',
8
  DATABASE '<database>'
9
);
10

11
-- Next, create a source
12
CREATE SOURCE IF NOT EXISTS my_source
13
    FROM POSTGRES CONNECTION pg_connection (PUBLICATION mz_source);
14

15
-- Finally, create a table from the source:
16
CREATE SCHEMA v1;
17
CREATE TABLE v1.T
18
    FROM SOURCE my_source(REFERENCE public.T);
sql

In the example above, we’re ingesting data from an upstream table named T, with a single column A into Materialize. If you’ve used Materialize before, you might notice the differences between the new syntax and the legacy syntax! If you’re not ready to use the new syntax yet, don’t worry. The legacy syntax will continue to be supported, and you can migrate over when you are ready.

Of course, as before, you can create a materialized view which reads from the source table:

1
/* First, create a connection, using the same syntax as before: */
2
CREATE MATERIALIZED VIEW v1.matview AS
3
    SELECT SUM(A) from v1.T;
sql

If we make a schema change to T, such as adding a column B, you can incorporate that schema change by creating a new version of the table:

1
CREATE SCHEMA v2;
2
CREATE TABLE v2.T
3
FROM SOURCE my_source(REFERENCE public.T);
4

5
CREATE MATERIALIZED VIEW v2.matview AS
6
    SELECT SUM(A) 
7
    FROM v2.T
8
    WHERE B = true;
sql

You might have downstream consumers reading data from v1.matview and v1.source. If you want those consumers to receive the new version, you can atomically switch the v1 and v2 schemas, using the ALTER SCHEMA command:

1
ALTER SCHEMA v1 SWAP WITH v2;
sql

The command above switches both schema names atomically. As soon as the ALTER command executes, downstream consumers will begin receiving data from your newest source & materialized view.

For a detailed tutorial, and a guide on how to drop columns safely, check out our documentation on how to handle upstream schema changes with zero downtime.

The newest source syntax is available today in private preview. It is supported for PostgreSQL sources, and we plan to add support for SQLServer and MySQL in the near future. Please contact our support team if you would like early access to it.

EXCLUDE COLUMNS from PostgreSQL sources

Materialize now supports excluding specific columns when ingesting data from PostgreSQL sources. This feature allows you to substantially reduce hydration times by ignoring unnecessary columns. You can also use EXCLUDE COLUMNS in conjunction with the latest source syntax to handle dropping columns from an upstream database without any downtime in Materialize.

Following in a similar vein to the previous example: imagine you have an upstream PostgreSQL table T, with columns A and B. You can exclude column A during ingestion:

1
-- Create the source
2
CREATE SOURCE IF NOT EXISTS my_source
3
    FROM POSTGRES CONNECTION pg_connection (PUBLICATION mz_source);
4

5
-- Create a table, 'T', in the v1 schema which excludes column 'A'
6
CREATE SCHEMA v1;
7
CREATE TABLE v1.T
8
    FROM SOURCE my_source(REFERENCE public.T) WITH (EXCLUDE COLUMNS (A));
sql

EXCLUDE COLUMNS is supported on the legacy source syntax as well:

1
CREATE SOURCE mz_source 
2
FROM POSTGRES CONNECTION pg_conn (PUBLICATION 'mz_source', EXCLUDE COLUMNS (T.A))
3
FOR ALL TABLES;
sql

WIth this release, EXCLUDE COLUMNS is now supported across all our relational database source types.

Cost Efficiency Improvements with Swap

Swap allows for infrequently accessed data to be moved from memory to disk. Enabling swap reduces the physical memory (RAM) required to run workloads on Materialize and improves cost efficiency. Since we first introduced swap in our Cloud product, many Materialize users have been able to downsize their clusters while maintaining similar performance levels as before.

With v26.0.0, swap is enabled by default for Self-Managed environments. Simply follow our installation & upgrade guides to use it.

Security Enhancements

Better security with SASL/SCRAM, and better performance with connection pooling

We've introduced SASL/SCRAM-SHA-256 authentication support for Materialize. SASL is a framework for modern authentication protocols, and SCRAM-SHA-256 is a modern authentication mechanism that never sends your password over the network. Instead, both the client and server use cryptographic proofs to verify identity. This means your database connections are now protected by enterprise-grade authentication that never exposes passwords on the wire.

Using SCRAM is particularly useful when setting up a connection pooler such as PgBouncer. Connection poolers like PgBouncer improve performance by reusing a small pool of active database connections across many clients, eliminating the expensive overhead of repeatedly creating and tearing down new connections for each request. With SCRAM, PgBouncer can authenticate users using hashed credentials retrieved from the database rather than requiring plaintext passwords in its configuration file.

To use this feature, follow our guide to enable SASL/SCRAM authentication, and our guide to enable connection pooling.

Quality of Life Updates

v26 incorporates numerous smaller improvements:

  • COPY TO now supports all S3 compatible destinations, including Google Cloud Storage
  • Multi-replica clusters with sources & sinks, which allow you to make zero downtime updates to source cluster sizes
  • Support for compression with webhook sources
  • Performance optimizations for incoming source data, to reduce CPU utilization
  • Several Console bugfixes, including fixing session timeout errors

License Key Requirements

v26.0.0 and future releases will require a license key to operate

A heads up: starting with v26.0.0, you will be required to provide a license key to use Self-Managed Materialize.

We continue to offer a complete free Self-Managed Community License, with a limit of 24 GiB of memory and 48 GiB of disk space. There are no time restrictions on Community License usage. You can obtain your Self-Managed Community license key through our website. If your workload requires more resources, contact our team for a Self-Managed Enterprise license.

A license key is required only once when creating a new environment or upgrading an existing environment to v26.0.0. After obtaining your license key, please follow our installation guides, or our upgrade guides, to add it to Materialize.

Coming next: weekly releases!

We’ve historically released updates to Materialize Cloud on a weekly basis. We’re going to start doing the same for our Self-Managed product as well. This means that v26.0.0 is the first of many upcoming releases.

If you’re a user of Materialize Cloud: you already have access to the exciting updates above! If you’re an existing user of Materialize Self-Managed, follow our upgrade guide here. If you’ve never used Materialize before - choose the deployment model which works best for you.


Pranshu

Pranshu Maheshwari

Pranshu is the Head of Product at Materialize. He was most recently at Cloudflare, leading Cloudflare Pipelines & Queues. Previously, Pranshu led the core product and data platform for Second Measure (acquired by Bloomberg). He was also a YC backed founder. Pranshu holds a B.Sc in Statistics and a B.A in International Studies from the University of Pennsylvania.

Paul

Paul Hemberger

VP Engineering, Materialize

Paul joined Materialize in 2022, first working as a software engineer on storage, then as manager of cloud infrastructure, and now as VP of Engineering. Previously, Paul worked on segmentation & data infrastructure at HubSpot. He holds an M.Eng. and S.B. in Electrical Engineering & Computer Science from MIT.