From 24663ab6198a24d5008a61fa4d20c7b15101dd23 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 23 Oct 2026 07:16:31 +0000 Subject: [PATCH 01/10] v26.48.0 release notes (rc.1) Adds the v26.48.0 section to doc/user/content/releases/_index.md and the v26.48 row to the self-managed operator compatibility table. Dates are provisional (Cloud 2026-10-29, Self-Managed 2026-10-30) and are set for real by the final snapshot. Draft with PR links: https://github.com/MaterializeInc/mz-skills/blob/main/data/mz-release-notes/v26.48.0/rc.1/release_notes.md --- doc/user/content/releases/_index.md | 25 +++++++++++++++++++ .../self_managed_operator_compatibility.yml | 5 ++++ 2 files changed, 30 insertions(+) diff --git a/doc/user/content/releases/_index.md b/doc/user/content/releases/_index.md index f14c645ed3ae9..9080b2dc6299b 100644 --- a/doc/user/content/releases/_index.md +++ b/doc/user/content/releases/_index.md @@ -20,6 +20,31 @@ Starting with the v26.1.0 release, Materialize releases on a weekly schedule for both Cloud and Self-Managed. See [Release schedule](/releases/schedule) for details. {{}} +## v26.48.0 +*Released to Materialize Cloud: 2026-10-29*
+*Released to Materialize Self-Managed: 2026-10-30*
+ +### Native Google Cloud Storage for persist {#v26.48-native-gcs-for-persist} + +Self-managed deployments on Google Cloud can now point persist at a `gcs:///` URL, which reaches the bucket through a native Google Cloud Storage client authenticated with Google's default credentials. Previously a GCS deployment had to reach the same bucket through the S3-compatible API with static HMAC keys, so credentials can now be managed the way the rest of a GCP deployment manages them. Blob restore copies back the newest noncurrent generation and so requires a versioned bucket, which is the default in the self-managed Terraform modules; soft delete is not yet supported. + +### Improvements {#v26.48-improvements} +- **`EXCLUDE ALL NOT NULL CONSTRAINTS` for MySQL source tables**: `CREATE TABLE ... FROM SOURCE` now accepts `EXCLUDE ALL NOT NULL CONSTRAINTS` against MySQL sources, which ignores the upstream `NOT NULL` constraints and makes the corresponding Materialize columns nullable, matching the PostgreSQL behavior added in v26.47.0; columns of a retained primary key stay `NOT NULL`, and a source type without support now rejects the option instead of silently ignoring it. +- **Kafka sink headers on by default**: The `HEADERS` option for Kafka sinks is now enabled by default, and Kafka sinks now attach a `materialize-sink-id` header carrying the sink's ID to every message they produce. +- **Bounded replication slot creation for PostgreSQL sources**: Creating a PostgreSQL source's replication slot is now bounded by a one-minute timeout, applied as the upstream session's `lock_timeout` and configurable, so an upstream transaction holding the slot creation open surfaces an error the source can resume from rather than blocking it indefinitely; the timeout has no effect when the upstream is a physical standby. +- **Faster progress tracking for sources with many tables**: A source now updates the committed progress of each of its tables only when that table has advanced, rather than walking all of them on every invocation, which on an idle source with 1,000 tables cut total source dataflow time by 40% (129s to 77s of operator time over a two-minute sample on an eight-worker replica). +- **Fewer Kafka clients on replicas running many sources**: A worker now creates a Kafka reader consumer only once it is responsible for a partition of the source's topic, instead of one per source per worker, which on a four-worker replica with 11 mostly single-partition sources cut the replica's Kafka clients from 55 to 24; each consumer runs a thread per broker, so the old count was what drove the CPU throttling and degraded freshness seen with a few hundred sources on one replica. +- **Lower memory while hydrating large materialized views**: The consolidation that runs when a materialized view sink's first batch lands no longer collects the whole buffer onto the heap at once, and instead accumulates it in bounded runs that can spill to disk; a TPC-H scale-factor-100 hydration that previously exhausted its replica's 849 GiB memory limit and had to recover now peaks at about 628 GiB and finishes without a restart. +- **`environmentd` queues more connections while it boots**: The SQL and HTTP listeners now request a kernel accept backlog of 1,024 instead of 128, so connections made during a long boot — including the Kubernetes readiness and liveness probes, which occupy a queue slot even though they close immediately — are queued rather than dropped, making `environmentd` less likely to be restarted by its liveness probe during a long startup. +- **Time zone data updated to 2026e**: Materialize now ships IANA time zone data 2026e, in which `America/Winnipeg`, `Canada/Central`, `America/Rainy_River`, and `America/Inuvik` stop falling back on 2026-11-01 and keep their summer offsets year-round, and `EST5EDT`, `CST6CDT`, `MST7MDT`, and `PST8PDT` return to US federal rules. +- **External autoscaling for the connection balancer**: The `Materialize` resource gains a `balancerdExternallyScaled` field, and `Balancer` an `externallyScaled` field, that stop the Kubernetes operator from reasserting the balancerd Deployment's replica count on every reconcile, so a HorizontalPodAutoscaler can own it; `balancerdReplicas` then only seeds the count when the Deployment is first created. + +### Bug Fixes {#v26.48-bug-fixes} +- Fixed a PostgreSQL source's replica growing until it was killed for running out of memory when upstream schema validation kept failing while the replication stream was silent; the validator retried without pausing and filled an unbounded error queue that is drained only on a keepalive, and it now reports each failure once. +- Fixed `ALTER CONNECTION` panicking when run on an Iceberg catalog connection, or on the parent S3 or GCP connection that an S3 Tables or BigLake catalog uses. +- Fixed connection credentials supplied as literal strings rather than wrapped in a `SECRET` — OAuth credentials, AWS session tokens, usernames, access key IDs, and TLS certificates — being written verbatim to the logs whenever a connection was dumped, which happens on every `ALTER CONNECTION` compatibility failure and on every sink a cluster reconciles. +- Fixed the `dbt-materialize` cluster and schema ownership checks that guard a blue/green deployment never raising anything, because they subtracted the set of objects under deployment the wrong way around; they now also treat membership in the owning role as ownership, which is how Materialize itself decides whether a role may run the swap that `deploy_promote` performs. + ## v26.47.1 *Released to Materialize Cloud: 2026-10-29*
*Released to Materialize Self-Managed: 2026-10-30*
diff --git a/doc/user/data/self_managed/self_managed_operator_compatibility.yml b/doc/user/data/self_managed/self_managed_operator_compatibility.yml index 5c94e90a962e2..9eced39d2d0db 100644 --- a/doc/user/data/self_managed/self_managed_operator_compatibility.yml +++ b/doc/user/data/self_managed/self_managed_operator_compatibility.yml @@ -5,6 +5,11 @@ columns: - column: Release date - column: Notes rows: + - Materialize Operator: v26.48 + orchestratord version: v26.48 + environmentd version: v26.48 + Release date: "2026-10-30" + Notes: "See [v26.48 release notes](/releases/#v26480)" - Materialize Operator: v26.47.1 orchestratord version: v26.47.1 environmentd version: v26.47.1 From e1091f995f69c29f0b8a8f6f8498f03436404560 Mon Sep 17 00:00:00 2001 From: Valerie Chiang Date: Mon, 26 Oct 2026 08:06:36 -0700 Subject: [PATCH 02/10] doc: v26.48.0 release notes: Kafka sink headers GA Co-Authored-By: Claude Opus 5.5 --- doc/user/content/releases/_index.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/user/content/releases/_index.md b/doc/user/content/releases/_index.md index 9080b2dc6299b..2797b460031f6 100644 --- a/doc/user/content/releases/_index.md +++ b/doc/user/content/releases/_index.md @@ -28,9 +28,14 @@ both Cloud and Self-Managed. See [Release schedule](/releases/schedule) for deta Self-managed deployments on Google Cloud can now point persist at a `gcs:///` URL, which reaches the bucket through a native Google Cloud Storage client authenticated with Google's default credentials. Previously a GCS deployment had to reach the same bucket through the S3-compatible API with static HMAC keys, so credentials can now be managed the way the rest of a GCP deployment manages them. Blob restore copies back the newest noncurrent generation and so requires a versioned bucket, which is the default in the self-managed Terraform modules; soft delete is not yet supported. +### Kafka sink headers are generally available {#v26.48-kafka-sink-headers-ga} + +The `HEADERS` option for Kafka sinks and the `materialize-sink-id` header, both previously in private preview, are now generally available. `HEADERS` adds the entries of a `map[text => text]` or `map[text => bytea]` column as headers on every message the sink produces. Every Kafka sink now also attaches a `materialize-sink-id` header carrying the sink's ID, so downstream consumers can correlate a data topic with its progress topic without querying Materialize. For more information, see [`CREATE SINK`: Headers](/sql/create-sink/kafka/#headers). + +To see how a downstream loader can use the `materialize-sink-id` header to expose only fully committed timestamps, see [Transactional downstream updates using Kafka](/export-data/patterns/transactional-downstream-updates-kafka/). + ### Improvements {#v26.48-improvements} - **`EXCLUDE ALL NOT NULL CONSTRAINTS` for MySQL source tables**: `CREATE TABLE ... FROM SOURCE` now accepts `EXCLUDE ALL NOT NULL CONSTRAINTS` against MySQL sources, which ignores the upstream `NOT NULL` constraints and makes the corresponding Materialize columns nullable, matching the PostgreSQL behavior added in v26.47.0; columns of a retained primary key stay `NOT NULL`, and a source type without support now rejects the option instead of silently ignoring it. -- **Kafka sink headers on by default**: The `HEADERS` option for Kafka sinks is now enabled by default, and Kafka sinks now attach a `materialize-sink-id` header carrying the sink's ID to every message they produce. - **Bounded replication slot creation for PostgreSQL sources**: Creating a PostgreSQL source's replication slot is now bounded by a one-minute timeout, applied as the upstream session's `lock_timeout` and configurable, so an upstream transaction holding the slot creation open surfaces an error the source can resume from rather than blocking it indefinitely; the timeout has no effect when the upstream is a physical standby. - **Faster progress tracking for sources with many tables**: A source now updates the committed progress of each of its tables only when that table has advanced, rather than walking all of them on every invocation, which on an idle source with 1,000 tables cut total source dataflow time by 40% (129s to 77s of operator time over a two-minute sample on an eight-worker replica). - **Fewer Kafka clients on replicas running many sources**: A worker now creates a Kafka reader consumer only once it is responsible for a partition of the source's topic, instead of one per source per worker, which on a four-worker replica with 11 mostly single-partition sources cut the replica's Kafka clients from 55 to 24; each consumer runs a thread per broker, so the old count was what drove the CPU throttling and degraded freshness seen with a few hundred sources on one replica. @@ -39,6 +44,9 @@ Self-managed deployments on Google Cloud can now point persist at a `gcs:// Date: Tue, 27 Oct 2026 01:22:02 +0000 Subject: [PATCH 03/10] v26.48.0 release notes (rc.2) No published increment: the rc.2 snapshot covered one materialize PR (upsert v2 drain performance), held at Borderline because it only runs behind the enable_upsert_v2 dyncfg, which defaults to false at the v26.48.0-rc.2 tag. The four agent-skills PRs in the window were automated docs syncs and were omitted. Provisional dates are unchanged from rc.1 (Cloud 2026-10-29, Self-Managed 2026-10-30), so neither _index.md nor the operator compatibility table changes. This empty commit records that rc.2 was applied so later runs do not re-sweep it. From b9d805a5c67e8d16a1255b3b49e79d5dbdbce99d Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 27 Oct 2026 01:22:16 +0000 Subject: [PATCH 04/10] v26.48.0 release notes (rc.3) Adds the rc.3 increment: one Improvements entry for #40065, which makes a read-only environmentd restart in place rather than exit its container when it reboots to pick up DDL changes during zero-downtime upgrade catch-up, so Kubernetes no longer applies crash-restart backoff. Provisional dates are unchanged from rc.1 and rc.2 (Cloud 2026-10-29, Self-Managed 2026-10-30), so the operator compatibility table is untouched. --- doc/user/content/releases/_index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/user/content/releases/_index.md b/doc/user/content/releases/_index.md index 2797b460031f6..5d67a8e78c3e3 100644 --- a/doc/user/content/releases/_index.md +++ b/doc/user/content/releases/_index.md @@ -35,6 +35,7 @@ The `HEADERS` option for Kafka sinks and the `materialize-sink-id` header, both To see how a downstream loader can use the `materialize-sink-id` header to expose only fully committed timestamps, see [Transactional downstream updates using Kafka](/export-data/patterns/transactional-downstream-updates-kafka/). ### Improvements {#v26.48-improvements} +- **No Kubernetes restart backoff during zero-downtime upgrade catch-up**: A read-only `environmentd` that reboots to pick up DDL changes while it catches up now restarts inside its container instead of exiting it, so Kubernetes no longer applies crash-restart backoff to the repeated reboots a zero-downtime upgrade can need. - **`EXCLUDE ALL NOT NULL CONSTRAINTS` for MySQL source tables**: `CREATE TABLE ... FROM SOURCE` now accepts `EXCLUDE ALL NOT NULL CONSTRAINTS` against MySQL sources, which ignores the upstream `NOT NULL` constraints and makes the corresponding Materialize columns nullable, matching the PostgreSQL behavior added in v26.47.0; columns of a retained primary key stay `NOT NULL`, and a source type without support now rejects the option instead of silently ignoring it. - **Bounded replication slot creation for PostgreSQL sources**: Creating a PostgreSQL source's replication slot is now bounded by a one-minute timeout, applied as the upstream session's `lock_timeout` and configurable, so an upstream transaction holding the slot creation open surfaces an error the source can resume from rather than blocking it indefinitely; the timeout has no effect when the upstream is a physical standby. - **Faster progress tracking for sources with many tables**: A source now updates the committed progress of each of its tables only when that table has advanced, rather than walking all of them on every invocation, which on an idle source with 1,000 tables cut total source dataflow time by 40% (129s to 77s of operator time over a two-minute sample on an eight-worker replica). From e1f6f043a3fb19f04e64d55fef0a695dd0180374 Mon Sep 17 00:00:00 2001 From: Pranshu Maheshwari Date: Wed, 28 Oct 2026 13:05:09 -0400 Subject: [PATCH 05/10] releases: add upsert hydration improvements to v26.48.0 notes (#40308) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Motivation Adds the upsert source hydration improvement to the v26.48.0 release notes. This PR targets the release notes branch of MaterializeInc/materialize#40113, not `main`. ### Description - New feature section, **Improved hydration times and memory efficiency for upsert sources** (`{#v26.48-upsert-hydration}`), placed first under `## v26.48.0`. - New chart `doc/user/static/images/releases/v2648_upsert_hydration.png`, comparing old and new hydration time and peak memory plus disk usage. - Hydration time comes from the "Catch-up" row of the benchmark run (206.1 min old vs 107.9–113.3 min new across four tested configurations). The peak memory plus disk figures (542 GiB old vs 183–208 GiB new) were supplied separately. - Links to the blog post: https://materialize.com/blog/materialize-out-of-core/ ### Verification Checked the rendered chart image and the Markdown section by hand. --- _Generated by [Claude Code](https://claude.ai/code/session_016DcnmrsjsfSMzxGBGkmEuK)_ --------- Co-authored-by: Claude --- doc/user/content/releases/_index.md | 12 ++++++++++++ .../images/releases/v2648_upsert_hydration.png | Bin 0 -> 80639 bytes 2 files changed, 12 insertions(+) create mode 100644 doc/user/static/images/releases/v2648_upsert_hydration.png diff --git a/doc/user/content/releases/_index.md b/doc/user/content/releases/_index.md index 5d67a8e78c3e3..3e3f48e5fc959 100644 --- a/doc/user/content/releases/_index.md +++ b/doc/user/content/releases/_index.md @@ -24,6 +24,18 @@ both Cloud and Self-Managed. See [Release schedule](/releases/schedule) for deta *Released to Materialize Cloud: 2026-10-29*
*Released to Materialize Self-Managed: 2026-10-30*
+### Improved hydration times and memory efficiency for upsert sources {#v26.48-upsert-hydration} + +Upsert sources that spill to disk now hydrate up to 1.9x faster, with up to 66% lower peak memory and disk usage. + +![Hydration time and peak memory plus disk usage for an upsert source, old versus new: hydration time drops from 206.1 minutes to 107.9–113.3 minutes, and peak memory plus disk usage drops from 542 GiB to 183–208 GiB](/images/releases/v2648_upsert_hydration.png) + +In our tests, hydration time dropped from 206 minutes to between 108 and 113 minutes, and peak memory and disk usage dropped from 542 GiB to between 183 and 208 GiB. + +Materialize now uses its own buffer pool to keep hot data in memory and serve sequential work from disk. Previously, this was left to the operating system's swap. See our [blog post](https://materialize.com/blog/materialize-out-of-core/) for details on how it works. + +This change has been rolled out to all Materialize Cloud environments and applies to all existing and new clusters. It will be enabled by default in Materialize Self-Managed in the coming weeks. + ### Native Google Cloud Storage for persist {#v26.48-native-gcs-for-persist} Self-managed deployments on Google Cloud can now point persist at a `gcs:///` URL, which reaches the bucket through a native Google Cloud Storage client authenticated with Google's default credentials. Previously a GCS deployment had to reach the same bucket through the S3-compatible API with static HMAC keys, so credentials can now be managed the way the rest of a GCP deployment manages them. Blob restore copies back the newest noncurrent generation and so requires a versioned bucket, which is the default in the self-managed Terraform modules; soft delete is not yet supported. diff --git a/doc/user/static/images/releases/v2648_upsert_hydration.png b/doc/user/static/images/releases/v2648_upsert_hydration.png new file mode 100644 index 0000000000000000000000000000000000000000..62ba7f7e515b829acb13898b74c2ecd8ea481007 GIT binary patch literal 80639 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 Date: Wed, 28 Oct 2026 14:08:54 -0400 Subject: [PATCH 06/10] Updated note --- doc/user/content/releases/_index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/user/content/releases/_index.md b/doc/user/content/releases/_index.md index 3e3f48e5fc959..c78ca7df4b528 100644 --- a/doc/user/content/releases/_index.md +++ b/doc/user/content/releases/_index.md @@ -26,13 +26,13 @@ both Cloud and Self-Managed. See [Release schedule](/releases/schedule) for deta ### Improved hydration times and memory efficiency for upsert sources {#v26.48-upsert-hydration} -Upsert sources that spill to disk now hydrate up to 1.9x faster, with up to 66% lower peak memory and disk usage. +Upsert sources that spill to disk now hydrate up to 48% faster, with up to 66% lower peak memory and disk usage. ![Hydration time and peak memory plus disk usage for an upsert source, old versus new: hydration time drops from 206.1 minutes to 107.9–113.3 minutes, and peak memory plus disk usage drops from 542 GiB to 183–208 GiB](/images/releases/v2648_upsert_hydration.png) -In our tests, hydration time dropped from 206 minutes to between 108 and 113 minutes, and peak memory and disk usage dropped from 542 GiB to between 183 and 208 GiB. +For our tests, we created a new Kafka upsert source, from scratch, on an M.1-1.5xlarge cluster, which has a total heap capacity of 637 GiB. The topic is a single partition of about 1.5B messages and roughly 100 GB, holding 956M distinct keys, with records around 100 bytes. We measured hydration times as how long it took from `CREATE SOURCE` until every key is indexed, and the source is keeping up with the topic. We ran the test four times, and observed that hydration times dropped from 206 minutes to between 108 and 113 minutes. Peak memory and disk usage dropped from 542 GiB to between 183 and 208 GiB. -Materialize now uses its own buffer pool to keep hot data in memory and serve sequential work from disk. Previously, this was left to the operating system's swap. See our [blog post](https://materialize.com/blog/materialize-out-of-core/) for details on how it works. +Materialize now uses its own buffer pool to keep hot data in memory and serve sequential work from disk. Previously, this was left to the operating system's swap. In addition, we now apply LZ4 compression to in-progress data while building an upsert source. See our [blog post](https://materialize.com/blog/materialize-out-of-core/) for details on how it works. This change has been rolled out to all Materialize Cloud environments and applies to all existing and new clusters. It will be enabled by default in Materialize Self-Managed in the coming weeks. From c63bc43d7196dc62b278a18781067a7cee62c402 Mon Sep 17 00:00:00 2001 From: Pranshu Maheshwari Date: Wed, 28 Oct 2026 14:09:59 -0400 Subject: [PATCH 07/10] updated note --- doc/user/content/releases/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/user/content/releases/_index.md b/doc/user/content/releases/_index.md index c78ca7df4b528..e1377dda42ca5 100644 --- a/doc/user/content/releases/_index.md +++ b/doc/user/content/releases/_index.md @@ -30,10 +30,10 @@ Upsert sources that spill to disk now hydrate up to 48% faster, with up to 66% l ![Hydration time and peak memory plus disk usage for an upsert source, old versus new: hydration time drops from 206.1 minutes to 107.9–113.3 minutes, and peak memory plus disk usage drops from 542 GiB to 183–208 GiB](/images/releases/v2648_upsert_hydration.png) -For our tests, we created a new Kafka upsert source, from scratch, on an M.1-1.5xlarge cluster, which has a total heap capacity of 637 GiB. The topic is a single partition of about 1.5B messages and roughly 100 GB, holding 956M distinct keys, with records around 100 bytes. We measured hydration times as how long it took from `CREATE SOURCE` until every key is indexed, and the source is keeping up with the topic. We ran the test four times, and observed that hydration times dropped from 206 minutes to between 108 and 113 minutes. Peak memory and disk usage dropped from 542 GiB to between 183 and 208 GiB. - Materialize now uses its own buffer pool to keep hot data in memory and serve sequential work from disk. Previously, this was left to the operating system's swap. In addition, we now apply LZ4 compression to in-progress data while building an upsert source. See our [blog post](https://materialize.com/blog/materialize-out-of-core/) for details on how it works. +We ran our tests on Materialize Cloud. We created a new Kafka upsert source, from scratch, on an M.1-1.5xlarge cluster, which has a total heap capacity of 637 GiB. The source ingested from a Kafka topic, consisting of a single partition of about 1.5B messages (roughly 100 GB), holding 956M distinct keys, with records around 100 bytes. We measured hydration times as how long it took from `CREATE SOURCE` until every key is indexed, and the source is keeping up with the topic. We ran the test four times, and observed that hydration times dropped from 206 minutes to between 108 and 113 minutes. Peak memory and disk usage dropped from 542 GiB to between 183 and 208 GiB. + This change has been rolled out to all Materialize Cloud environments and applies to all existing and new clusters. It will be enabled by default in Materialize Self-Managed in the coming weeks. ### Native Google Cloud Storage for persist {#v26.48-native-gcs-for-persist} From 524adb8b42096e55366ea9766ff2cbd4e2f61b38 Mon Sep 17 00:00:00 2001 From: Pranshu Maheshwari Date: Wed, 28 Oct 2026 14:49:51 -0400 Subject: [PATCH 08/10] releases: refine v26.48.0 notes Drop the GCS persist note, note the new cluster details page on Self-Managed, and list the sub-second freshness and Iceberg sink troubleshooting guides. Co-Authored-By: Claude Opus 5.5 --- doc/user/content/releases/_index.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/doc/user/content/releases/_index.md b/doc/user/content/releases/_index.md index e1377dda42ca5..dcad60c192775 100644 --- a/doc/user/content/releases/_index.md +++ b/doc/user/content/releases/_index.md @@ -36,10 +36,6 @@ We ran our tests on Materialize Cloud. We created a new Kafka upsert source, fro This change has been rolled out to all Materialize Cloud environments and applies to all existing and new clusters. It will be enabled by default in Materialize Self-Managed in the coming weeks. -### Native Google Cloud Storage for persist {#v26.48-native-gcs-for-persist} - -Self-managed deployments on Google Cloud can now point persist at a `gcs:///` URL, which reaches the bucket through a native Google Cloud Storage client authenticated with Google's default credentials. Previously a GCS deployment had to reach the same bucket through the S3-compatible API with static HMAC keys, so credentials can now be managed the way the rest of a GCP deployment manages them. Blob restore copies back the newest noncurrent generation and so requires a versioned bucket, which is the default in the self-managed Terraform modules; soft delete is not yet supported. - ### Kafka sink headers are generally available {#v26.48-kafka-sink-headers-ga} The `HEADERS` option for Kafka sinks and the `materialize-sink-id` header, both previously in private preview, are now generally available. `HEADERS` adds the entries of a `map[text => text]` or `map[text => bytea]` column as headers on every message the sink produces. Every Kafka sink now also attaches a `materialize-sink-id` header carrying the sink's ID, so downstream consumers can correlate a data topic with its progress topic without querying Materialize. For more information, see [`CREATE SINK`: Headers](/sql/create-sink/kafka/#headers). @@ -47,6 +43,7 @@ The `HEADERS` option for Kafka sinks and the `materialize-sink-id` header, both To see how a downstream loader can use the `materialize-sink-id` header to expose only fully committed timestamps, see [Transactional downstream updates using Kafka](/export-data/patterns/transactional-downstream-updates-kafka/). ### Improvements {#v26.48-improvements} +- **New cluster details page on Self-Managed**: The [redesigned cluster details page](#v26.47-cluster-details-page) is now available on Materialize Self-Managed. To try it, open a cluster and select **Show the new cluster details page** in the breadcrumb bar. - **No Kubernetes restart backoff during zero-downtime upgrade catch-up**: A read-only `environmentd` that reboots to pick up DDL changes while it catches up now restarts inside its container instead of exiting it, so Kubernetes no longer applies crash-restart backoff to the repeated reboots a zero-downtime upgrade can need. - **`EXCLUDE ALL NOT NULL CONSTRAINTS` for MySQL source tables**: `CREATE TABLE ... FROM SOURCE` now accepts `EXCLUDE ALL NOT NULL CONSTRAINTS` against MySQL sources, which ignores the upstream `NOT NULL` constraints and makes the corresponding Materialize columns nullable, matching the PostgreSQL behavior added in v26.47.0; columns of a retained primary key stay `NOT NULL`, and a source type without support now rejects the option instead of silently ignoring it. - **Bounded replication slot creation for PostgreSQL sources**: Creating a PostgreSQL source's replication slot is now bounded by a one-minute timeout, applied as the upstream session's `lock_timeout` and configurable, so an upstream transaction holding the slot creation open surfaces an error the source can resume from rather than blocking it indefinitely; the timeout has no effect when the upstream is a physical standby. @@ -58,7 +55,8 @@ To see how a downstream loader can use the `materialize-sink-id` header to expos - **External autoscaling for the connection balancer**: The `Materialize` resource gains a `balancerdExternallyScaled` field, and `Balancer` an `externallyScaled` field, that stop the Kubernetes operator from reasserting the balancerd Deployment's replica count on every reconcile, so a HorizontalPodAutoscaler can own it; `balancerdReplicas` then only seeds the count when the Deployment is first created. ### Guides {#v26.48-guides} -- [Transactional downstream updates using Kafka](/export-data/patterns/transactional-downstream-updates-kafka/) +- [Fine tune for sub-second freshness](/transform-data/freshness/subsecond-freshness/) +- [Troubleshooting Iceberg sinks](/export-data/iceberg-troubleshooting/) ### Bug Fixes {#v26.48-bug-fixes} - Fixed a PostgreSQL source's replica growing until it was killed for running out of memory when upstream schema validation kept failing while the replication stream was silent; the validator retried without pausing and filled an unbounded error queue that is drained only on a keepalive, and it now reports each failure once. From 68501f00563b2fdd725c1b924b433fb27ed93f22 Mon Sep 17 00:00:00 2001 From: Valerie Chiang Date: Wed, 28 Oct 2026 11:38:27 -0700 Subject: [PATCH 09/10] docs: give MySQL EXCLUDE ALL NOT NULL CONSTRAINTS its own v26.48 section Match the v26.47 PostgreSQL section and link the MySQL docs. Co-Authored-By: Claude Opus 5.5 --- doc/user/content/releases/_index.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/user/content/releases/_index.md b/doc/user/content/releases/_index.md index dcad60c192775..f864370b56b26 100644 --- a/doc/user/content/releases/_index.md +++ b/doc/user/content/releases/_index.md @@ -42,10 +42,20 @@ The `HEADERS` option for Kafka sinks and the `materialize-sink-id` header, both To see how a downstream loader can use the `materialize-sink-id` header to expose only fully committed timestamps, see [Transactional downstream updates using Kafka](/export-data/patterns/transactional-downstream-updates-kafka/). +### Safely drop upstream `NOT NULL` constraints in your MySQL sources {#v26.48-exclude-not-null-constraints} +Materialize now allows you to `EXCLUDE ALL NOT NULL CONSTRAINTS` when creating a table from a MySQL source, as it already did for PostgreSQL sources. Every column is ingested as nullable, so you can drop `NOT NULL` constraints upstream without causing your table to error. `PRIMARY KEY` and `UNIQUE` constraints are still recorded, and primary key columns remain `NOT NULL`. + +```mzsql +CREATE TABLE orders + FROM SOURCE mysql_source (REFERENCE mydb.orders) + WITH (EXCLUDE ALL NOT NULL CONSTRAINTS); +``` + +For more details, see [`CREATE TABLE ... FROM SOURCE`](/sql/create-table/mysql/) for MySQL and the guide on [excluding nullability constraints](/ingest-data/mysql/source-versioning/#excluding-nullability-constraints). + ### Improvements {#v26.48-improvements} - **New cluster details page on Self-Managed**: The [redesigned cluster details page](#v26.47-cluster-details-page) is now available on Materialize Self-Managed. To try it, open a cluster and select **Show the new cluster details page** in the breadcrumb bar. - **No Kubernetes restart backoff during zero-downtime upgrade catch-up**: A read-only `environmentd` that reboots to pick up DDL changes while it catches up now restarts inside its container instead of exiting it, so Kubernetes no longer applies crash-restart backoff to the repeated reboots a zero-downtime upgrade can need. -- **`EXCLUDE ALL NOT NULL CONSTRAINTS` for MySQL source tables**: `CREATE TABLE ... FROM SOURCE` now accepts `EXCLUDE ALL NOT NULL CONSTRAINTS` against MySQL sources, which ignores the upstream `NOT NULL` constraints and makes the corresponding Materialize columns nullable, matching the PostgreSQL behavior added in v26.47.0; columns of a retained primary key stay `NOT NULL`, and a source type without support now rejects the option instead of silently ignoring it. - **Bounded replication slot creation for PostgreSQL sources**: Creating a PostgreSQL source's replication slot is now bounded by a one-minute timeout, applied as the upstream session's `lock_timeout` and configurable, so an upstream transaction holding the slot creation open surfaces an error the source can resume from rather than blocking it indefinitely; the timeout has no effect when the upstream is a physical standby. - **Faster progress tracking for sources with many tables**: A source now updates the committed progress of each of its tables only when that table has advanced, rather than walking all of them on every invocation, which on an idle source with 1,000 tables cut total source dataflow time by 40% (129s to 77s of operator time over a two-minute sample on an eight-worker replica). - **Fewer Kafka clients on replicas running many sources**: A worker now creates a Kafka reader consumer only once it is responsible for a partition of the source's topic, instead of one per source per worker, which on a four-worker replica with 11 mostly single-partition sources cut the replica's Kafka clients from 55 to 24; each consumer runs a thread per broker, so the old count was what drove the CPU throttling and degraded freshness seen with a few hundred sources on one replica. From 1ef13366c1505c6f67ba48c46cf47d68de1db09a Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 18:52:35 +0000 Subject: [PATCH 10/10] v26.48.0 release notes (final) The final snapshot adds no entries: the v26.48.0 tracking issue lists only the version bump commit, and comparing v26.48.0-rc.3...v26.48.0 confirms a single commit on the release branch. The three agent-skills PRs in the window were all omitted. The provisional dates carried since rc.1 (Cloud 2026-10-29, Self-Managed 2026-10-30) match the real ship dates, so the date refresh in _index.md and self_managed_operator_compatibility.yml is a no-op. This commit is empty; it records on the branch that the final snapshot has been applied.