diff --git a/en_US/changes/all-changes-ee.md b/en_US/changes/all-changes-ee.md
index d16071898..9006dc8b3 100644
--- a/en_US/changes/all-changes-ee.md
+++ b/en_US/changes/all-changes-ee.md
@@ -4,6 +4,7 @@ The release notes page for EMQX Enterprise provides a comprehensive and detailed
## v5.9
+- [5.9.2](./changes-ee-v5.md#_5-9-2): 2025-10-31
- [5.9.1](./changes-ee-v5.md#_5-9-1): 2025-07-02
- [5.9.0](./changes-ee-v5.md#_5-9-0): 2025-05-02
diff --git a/en_US/changes/breaking-changes-ee-5.9.md b/en_US/changes/breaking-changes-ee-5.9.md
index 3eeaaaa07..8a9255695 100644
--- a/en_US/changes/breaking-changes-ee-5.9.md
+++ b/en_US/changes/breaking-changes-ee-5.9.md
@@ -1,5 +1,15 @@
# Incompatible Changes in EMQX 5.9
+## 5.9.2
+
+- [#15753](https://github.com/emqx/emqx/pull/15753) Listener connection rate limits (`max_conn_rate` and `max_conn_burst`) are now enforced per listener rather than per acceptor, restoring the behavior before 5.9.0.
+
+ As a result, configurations from versions 5.9.0 and 5.9.1 are incompatible: the specified rate values must be scaled up by the number of acceptors configured for each listener to preserve the same effective limits.
+
+- [#16062](https://github.com/emqx/emqx/pull/16062) Fixed an issue where RocketMQ actions ignored the configured payload template and sent the entire rule output instead.
+
+ If you relied on the previous (incorrect) behavior, you may need to update your payload templates to ensure messages are formatted as expected.
+
## 5.9.1
- [#15156](https://github.com/emqx/emqx/pull/15156) Added strict schema validation for the `dashboard.sso.oidc.issuer` field. This field must now contain a valid URL. Previously, invalid configurations could be accepted by the API without errors but would cause EMQX to fail to restart, potentially resulting in a crash (`erl_crash.dump`).
diff --git a/en_US/changes/changes-ee-v5.md b/en_US/changes/changes-ee-v5.md
index aa40442e2..57efbd01a 100644
--- a/en_US/changes/changes-ee-v5.md
+++ b/en_US/changes/changes-ee-v5.md
@@ -1,5 +1,201 @@
# EMQX Enterprise Version 5
+## 5.9.2
+
+*Release Date: 2025-10-31*
+
+Make sure to check the breaking changes and known issues before upgrading to EMQX 5.9.2.
+
+### Enhancements
+
+#### Core MQTT Functionalities
+
+- [#15773](https://github.com/emqx/emqx/pull/15773) Throttled client ID registration during reconnects.
+ - When a previous session cleanup is still in progress, new connections using the same client ID are now throttled. This prevents instability when clients reconnect aggressively.
+ - Affected clients receive reason code `137` (Server Busy) in the `CONNACK` with Reason-String `"THROTTLED"`, and should retry after the cleanup completes.
+ - Fixed the reason code returned when another connection registers the same client ID; now correctly returns `137` instead of `133`.
+
+#### Data Integration
+
+- [#15542](https://github.com/emqx/emqx/pull/15542) Upgraded our `erlcloud` library to `3.8.3.0`. This allows one to set up a S3 Connector without specifying Access Key Id and Secret Access Key, so long as the EC2 instance EMQX is running in has the correct IAM permissions to read/write to the configured bucket(s).
+- [#15585](https://github.com/emqx/emqx/pull/15585) Updated the brod client to version 4.4.4, expanding support for a wider range of Kafka APIs. This update addresses the deprecation of `JoinGroups` API versions `v0` - `v1`.
+- [#15845](https://github.com/emqx/emqx/pull/15845) The `static_clientids` configuration for the MQTT Connector now supports specifying a username and password for each client ID. This is particularly useful for scenarios like connecting to Azure IoT Hub, where each device (client ID) requires a unique set of credentials. This enhancement helps ensure successful connections across multiple nodes in a clustered environment.
+- [#15911](https://github.com/emqx/emqx/pull/15911) The HTTP request timeout for the HTTP Action is now configurable via the `resource_opts.request_ttl` setting. Previously, this timeout was fixed at 30 seconds and could not be adjusted.
+
+#### Observability
+
+- [#15499](https://github.com/emqx/emqx/pull/15499) Added a force deactivate alarm API endpoint to allow administrators to forcibly deactivate active alarms.
+- [#15944](https://github.com/emqx/emqx/pull/15944) Improved the information returned when a resource is marked as `disconnected` for the following Connectors: LDAP, Syskeeper, IoTDB, Snowflake (aggregated), JWKS Authentication.
+
+#### Performance
+
+- [#15536](https://github.com/emqx/emqx/pull/15536) Disable the `node.global_gc_interval` configuration by default.
+
+- [#15539](https://github.com/emqx/emqx/pull/15539) Optimized Erlang VM parameters to improve performance and stability:
+
+ - Increased buffer size for distributed channels to 32 MB (`+zdbbl 32768`) to prevent `busy_dist_port alarms` during intensive Mnesia operations.
+ - Disabled scheduler busy-waiting (`+sbwt none +sbwtdcpu none +sbwtdio none`) to lower CPU usage reported by the operating system.
+ - Set scheduler binding type to db (`+stbt db`) to reduce message latency.
+
+- [#15907](https://github.com/emqx/emqx/pull/15907) Improve system memory usage.
+
+ - Authorization (authz) cache is now cleared immediately when a client disconnects, reducing unnecessary memory consumption.
+ - Fields such as client ID, username, password, and topic are copied into new binaries (when more than 64 bytes) instead of being slices from the raw packet to reduce 'binary' part of memory usage in Erlang VM.
+
+- [#15949](https://github.com/emqx/emqx/pull/15949) Changed the default value of the `parse_unit` option in listener configuration from `chunk` to `frame`. This change can significantly reduce CPU usage when the payload size exceeds the socket buffer (default is 4 KB).
+
+ **Note:** With `parse_unit = frame`, if a `PUBLISH` packet exceeds the maximum allowed size, EMQX will close the connection instead of sending a `DISCONNECT` packet.
+
+### Bug Fixes
+
+#### Core MQTT Functionalities
+
+- [#15884](https://github.com/emqx/emqx/pull/15884) Resolved an issue where, in rare cases, the global routing table could indefinitely retain routing information for nodes that had long left the cluster.
+- [#15518](https://github.com/emqx/emqx/pull/15518) Resolved a race condition that may lead to accumulating inconsistencies in the routing table and shared subscriptions state in the cluster when a large number of shared subscribers disconnect simultaneously.
+- [#15872](https://github.com/emqx/emqx/pull/15872) Eliminated warning log `unclean_terminate` when disconnected after CONNACK is sent with a non-zero reason code.
+
+#### Deployment
+
+- [#15553](https://github.com/emqx/emqx/pull/15553) Fixed an issue in the Helm chart where deploying EMQX with default values started multiple replicas and caused all nodes except one to crash. The chart now defaults to a single replica, since clustered deployments require an Commercial License.
+
+- [#15580](https://github.com/emqx/emqx/pull/15580) Added a new `emqxLicenseSecretRef` variable to the EMQX Enterprise Helm chart. This allows users to specify a Kubernetes Secret containing the EMQX license key, so the license is applied automatically.
+
+ This replaces the non-functional `emqxLicenseSecretName` variable, which created and mounted a secret file but did not pass the license to EMQX.
+
+- [#15712](https://github.com/emqx/emqx/pull/15712) Fixed node boot-up failure during rolling upgrade from older versions (before 5.9)
+
+ In previous EMQX versions (before 5.9), a bug in the ZIP timestamp encoder could store an invalid “seconds” value in archive entries (values corresponding to the 30th or 31st 2-second slot in DOS time format).
+
+- [#15863](https://github.com/emqx/emqx/pull/15863) Fixed the license quota alarm message to correctly reflect session quotas instead of live connections.
+
+#### Security
+
+- [#15581](https://github.com/emqx/emqx/pull/15581) Upgraded Erlang/OTP version from 26.2.5.2 to 26.2.5.14. This upgrade includes two TLS-related fixes from OTP that affect EMQX:
+ - Fixed a crash in TLS connections caused by a race condition during certificate renewal.
+ - Added support for RSA certificates signed with RSASSA-PSS parameters. Previously, such certificates could cause TLS handshakes to fail with a `bad_certificate` / `invalid_signature error`.
+
+#### Access Control
+
+
+- [#15818](https://github.com/emqx/emqx/pull/15818) Corrected handling of `{allow|deny, all}` ACL rules.
+
+ Previously, these rules were internally translated to match `#`, which incorrectly failed to match topics prefixed with `$` (e.g. `$testtopic/1`) due to MQTT spec restrictions.
+ Now, a special internal value is used to ensure `{allow|deny, all}` rules correctly match any topic, including `$`-prefixed ones.
+
+- [#15844](https://github.com/emqx/emqx/pull/15844) Added validation to forbid adding empty usernames to the built-in database authenticator. Such users cannot be deleted via the HTTP API later, since they mess up the API path.
+
+ If you have such an user and wish to delete it, run the following in an EMQX console:
+
+ ```erlang
+ mria:transaction(emqx_authn_shard, fun() -> mnesia:delete(emqx_authn_mnesia, {'mqtt:global',<<>>}, write) end).
+ ```
+
+- [#15899](https://github.com/emqx/emqx/pull/15899) Improved memory management by ensuring that the authorization (authz) cache is cleared immediately when a client disconnects, reducing unnecessary memory consumption.
+
+- [#16081](https://github.com/emqx/emqx/pull/16081) Fixed an issue where clients using extended authentication and memory-based sessions could crash with a `session_stepdown_request_exception` caused by a `calling_self` error.
+
+ Example error log
+
+ ```
+ 2025-09-24T07:13:08.973954+08:00 [error] clientid: someclientid, msg: session_stepdown_request_exception, peername: 127.0.0.1:41782, username: admin, error: exit, reason: calling_self, stacktrace: [{gen_server,call,3,[{file,"gen_server.erl"},{line,1222}]},{emqx_cm,request_stepdown,4,[{file,"emqx_cm.erl"},{line,427}]},{emqx_cm,do_takeover_begin,2,[{file,"emqx_cm.erl"},{line,398}]},{emqx_cm,takeover_session,2,[{file,"emqx_cm.erl"},{line,384}]},{emqx_cm,takeover_session_begin,2,[{file,"emqx_cm.erl"},{line,305}]},{emqx_session_mem,open,4,[{file,"emqx_session_mem.erl"},{line,210}]},{emqx_session,open,3,[{file,"emqx_session.erl"},{line,263}]},{emqx_cm,'-open_session/4-fun-1-',4,[{file,"emqx_cm.erl"},{line,290}]},{emqx_cm_locker,trans,2,[{file,"emqx_cm_locker.erl"},{line,32}]},{emqx_channel,post_process_connect,2,[{file,"emqx_channel.erl"},{line,575}]},{emqx_connection,with_channel,3,[{file,"emqx_connection.erl"},{line,852}]},{emqx_connection,process_msg,2,[{file,"emqx_connection.erl"},{line,470}]},{emqx_connection,process_msgs,2,[{file,"emqx_connection.erl"},{line,462}]},{emqx_connection,handle_recv,3,[{file,"emqx_connection.erl"},{line,406}]},{proc_lib,wake_up,3,[{file,"proc_lib.erl"},{line,340}]}], action: {takeover,'begin'}, ...
+ ```
+
+
+
+#### Data Integration
+
+
+- [#15616](https://github.com/emqx/emqx/pull/15616) Kafka connections are now considered healthy even if a `topic_authorization_failed` error is returned for the default probing topic.
+
+- [#15826](https://github.com/emqx/emqx/pull/15826) Improved Kafka consumer connector health check behavior with restricted ACLs. Previously, Kafka Consumer Connector health checks could fail if the configured user lacked permission to access the internal `____emqx_consumer_probe` consumer group used for the check. With this fix, if the Kafka broker returns an "ACL denied" response, EMQX will treat the connection as healthy.
+
+- [#15827](https://github.com/emqx/emqx/pull/15827) Fixed atom and process leaks in the GreptimeDB driver.
+
+ Fixed a `function_clause` error that could arise if certain incorrect write syntaxes were used in GreptimeDB Actions.
+
+- [#15836](https://github.com/emqx/emqx/pull/15836) Enriched the returned information when a Kafka Consumer Source fails to be added, for example, due to denied topic ACLs.
+
+- [#15850](https://github.com/emqx/emqx/pull/15850) Fixed an issue where the MQTT bridge incorrectly showed a stale connection as `Connected`, and failed to re-establish the connection.
+
+- [#15866](https://github.com/emqx/emqx/pull/15866) Upgraded Kafka producer lib wollf to `4.0.12` to improve handling of temporarily missing partitions in Kafka metadata responses.
+
+ In rare race conditions, Kafka may return an incomplete partition list. Previously, this was only handled when a topic was recreated with fewer partitions, but not when partitions were temporarily missing. This gap could cause the partition producer to stall and block shutdown indefinitely.
+
+
+- [#15906](https://github.com/emqx/emqx/pull/15906) Upgraded Kafka producer library Wolff from `4.0.12` to `4.0.13`, which adds handling for the `record_list_too_large` error in `ProduceResponse`.
+
+
+- [#15902](https://github.com/emqx/emqx/pull/15902) Upgraded MQTT client library to 1.13.8. This improves MQTT bridge connectivity with:
+ - Connector will automatically reconnect when peer broker does not reply PINGRESP.
+ - Bridge over TLS failure is more promptly handled if connection breaks while waiting for CONNACK.
+
+- [#15910](https://github.com/emqx/emqx/pull/15910) Fixed an issue with Connectors where a pool of workers could fail to recover from a failure if multiple workers crashed simultaneously in large worker pools.
+
+ Connectors affected and fixed:
+
+ - MySQL
+ - PostgreSQL
+ - Oracle
+ - SQLServer
+ - TDEngine
+ - Cassandra
+ - Dynamo
+ - HTTP
+ - Couchbase
+ - GCP PubSub
+ - Snowflake
+
+ Upgraded `gun` and related dependencies to 2.1.0.
+
+- [#16010](https://github.com/emqx/emqx/pull/16010) Fixed an issue where a Republish Fallback Action could fail with a `function_clause` error if the originating rule's SQL did not include the `metadata` field from the rule environment.
+
+ Example error log:
+
+ ```
+ [error] tag: RESOURCE, msg: failed_to_trigger_fallback_action, reason: {error,function_clause}, fallback_kind: republish, primary_action_resource_id: <<"action:type:name:connector:type:name">>, republish_topic: <<"republish/topic">>
+ ```
+
+- [#16043](https://github.com/emqx/emqx/pull/16043) Improved log details for Kafka data integration when `not_all_kafka_partitions_connected` event occurs.
+
+- [#16046](https://github.com/emqx/emqx/pull/16046) Fixed a potential out-of-memory (OOM) crash when loading or restarting a configuration containing a Connector with several hundred Actions.
+
+#### Rule Engine
+
+
+- [#16028](https://github.com/emqx/emqx/pull/16028) Fixed rule engine `jq` function memory leak.
+
+ Previously if `jq` built-in function `index` is used (e.g. `.key | index("name")`), it would result in memory leak.
+
+#### Smart Data Hub
+
+
+- [#15706](https://github.com/emqx/emqx/pull/15706) Fixed an indexing issue that could cause Message Transformations and Schema Validations to behave inconsistently. Deleting one item could corrupt the topic index, so that a subsequent item remained active even after being disabled.
+- [#15708](https://github.com/emqx/emqx/pull/15708) Fixed an issue where external schema registries were not reloaded after a node restart.
+- [#15810](https://github.com/emqx/emqx/pull/15810) Introduced `spb_{en,de}code` functions to correct handling of `bytes_value` Metrics. Fixed an issue with the original `sparkplug_{en,de}code` functions, which did not base64 encode/decode `bytes_value` metric values as required by the [Protobuf specification](https://protobuf.dev/programming-guides/json/). To address this, new `spb_{en,de}code` functions have been introduced for correct encoding/decoding of such fields. The old `sparkplug_{en,de}code` functions are now deprecated to maintain backward compatibility.
+
+#### Observability
+
+- [#15639](https://github.com/emqx/emqx/pull/15639) Fixed incorrect counting of the `packets.subscribe.auth_error` metric.
+- [#15785](https://github.com/emqx/emqx/pull/15785) Resolved a crash that occurred when MQTT usernames containing non-ASCII characters were used in formatting network congestion alarm messages.
+- [#15963](https://github.com/emqx/emqx/pull/15963) Reduced excessive audit log entries generated during looped evaluations in the remote shell (`remsh`).
+- [#15967](https://github.com/emqx/emqx/pull/15967) Fixed an issue where Mnesia transaction blocking during the cleanup of large volumes of audit logs could lead to rapid memory growth.
+
+#### Gateway
+
+- [#15679](https://github.com/emqx/emqx/pull/15679) Fixed incorrect global chain names for the ExProto, JT/T 808, GB/T 32960, and OCPP gateways. Built-in authentication data for these gateways was previously grouped under `unknown:global`, causing conflicts between gateways.
+- [#15699](https://github.com/emqx/emqx/pull/15699) Fixed an issue where built-in authentication data for gateways (e.g., CoAP) was incorrectly removed when a node was stopped or restarted.
+- [#15822](https://github.com/emqx/emqx/pull/15822) Fixed an issue where the OCPP connection would crash after sending a certain number of messages.
+
+#### Rate Limit
+
+
+- [#15794](https://github.com/emqx/emqx/pull/15794) Improved the behavior of connection rate limit updates to ensure that changes (e.g., to burst rate or rate thresholds) are applied immediately after the listener configuration is updated. Previously, parts of the internal limiter state were not refreshed correctly, which could result in rate limits appearing stricter than configured.
+
+#### ExHook
+
+
+- [#15683](https://github.com/emqx/emqx/pull/15683) Fixed ExHook TLS options so that gRPC clients can correctly verify the server hostname during the TLS handshake.
+
## 5.9.1
*Release Date: 2025-07-02*
diff --git a/zh_CN/changes/all-changes-ee.md b/zh_CN/changes/all-changes-ee.md
index 26eb9acc5..d3b4608d8 100644
--- a/zh_CN/changes/all-changes-ee.md
+++ b/zh_CN/changes/all-changes-ee.md
@@ -4,6 +4,7 @@ EMQX 企业版版本发布页面全面详细地记录了 EMQX 企业版每个版
## v5.9
+- [5.9.2](./changes-ee-v5.md#_5-9-2): 2025-11-07
- [5.9.1](./changes-ee-v5.md#_5-9-1): 2025-07-02
- [5.9.0](./changes-ee-v5.md#_5-9-0): 2025-05-02
diff --git a/zh_CN/changes/breaking-changes-ee-5.9.md b/zh_CN/changes/breaking-changes-ee-5.9.md
index 30b3be8d0..ae3f890a6 100644
--- a/zh_CN/changes/breaking-changes-ee-5.9.md
+++ b/zh_CN/changes/breaking-changes-ee-5.9.md
@@ -1,5 +1,15 @@
# EMQX 5.9 中的不兼容变更
+## 5.9.2
+
+- [#15753](https://github.com/emqx/emqx/pull/15753) 监听器连接速率限制(`max_conn_rate` 和 `max_conn_burst`)现在按监听器维度生效,而不再是按 acceptor (连接接收进程)生效,恢复了 5.9.0 之前的行为。
+
+ 这导致 5.9.0 和 5.9.1 版本的相关配置与当前版本不兼容。为了保持相同的限流效果,指定的速率必须按相应监听器配置的 acceptor 数量进行放大。
+
+- [#16062](https://github.com/emqx/emqx/pull/16062) 修复了一个问题:RocketMQ 动作忽略了配置的 payload 模板,错误地发送了整个规则的输出结果。
+
+ 如果您依赖了此前(错误)行为,可能需要更新 payload 模板,以确保消息格式符合预期。
+
## 5.9.1
- [#15156](https://github.com/emqx/emqx/pull/15156) 为 `dashboard.sso.oidc.issuer` 字段新增了严格的 schema 校验。该字段现在必须为合法的 URL。此前,即使配置无效,API 也可能错误地接受,但会导致 EMQX 无法重启,甚至触发崩溃(`erl_crash.dump`)。
diff --git a/zh_CN/changes/changes-ee-v5.md b/zh_CN/changes/changes-ee-v5.md
index b1d007d19..ff768bf99 100644
--- a/zh_CN/changes/changes-ee-v5.md
+++ b/zh_CN/changes/changes-ee-v5.md
@@ -1,5 +1,187 @@
# EMQX 企业版 v5 版本
+## 5.9.2
+
+*发布日期 2025-10-31*
+
+升级前请查看已知问题列表和不兼容变更列表。
+
+### 增强
+
+#### 核心 MQTT 功能
+
+- [#15773](https://github.com/emqx/emqx/pull/15773) 在客户端重连时增加了 Client ID 注册的节流机制。
+ - 当之前的会话清理仍在进行中时,新连接使用相同 Client ID 将被节流,避免客户端在频繁重连时导致系统不稳定。
+ - 受影响的客户端会在 `CONNACK` 中收到原因码 `137` (Server Busy),并带有 Reason-String `"THROTTLED"`,应在会话清理完成后重试。
+ - 修复了当另一个连接正在注册相同 Client ID 时返回的原因码,现在会正确返回 `137` 而不是 `133`。
+
+#### 数据集成
+
+- [#15542](https://github.com/emqx/emqx/pull/15542) 将 `erlcloud` 库升级到 `3.8.3.0`。升级后,如果 EMQX 运行的 EC2 实例具有正确的 IAM 权限来读写配置的 S3 存储桶,就可以在不指定访问密钥 ID 和私有访问密钥的情况下配置 S3 连接器。
+- [#15585](https://github.com/emqx/emqx/pull/15585) 将 Kafka `brod` 客户端升级至 4.4.4,扩展了对更多 Kafka API 的支持,并解决了 `JoinGroups` API 版本 `v0` 和 `v1` 弃用的问题。
+- [#15845](https://github.com/emqx/emqx/pull/15845) MQTT 连接器的 `static_clientids` 配置项现支持为每个客户端 ID 分别指定用户名和密码,适用于如 Azure IoT Hub 等要求每个设备使用唯一凭证的场景。此增强提升了在集群部署中多节点连接的兼容性与稳定性。
+- [#15911](https://github.com/emqx/emqx/pull/15911) HTTP 动作的 HTTP 请求超时时间现在可以通过 `resource_opts.request_ttl` 设置进行配置。此前,此超时时间固定为 30 秒且不可调整。
+
+#### 可观测性
+
+- [#15499](https://github.com/emqx/emqx/pull/15499) 添加了强制停用告警的 API 接口,允许管理员强制停用当前告警。
+- [#15944](https://github.com/emqx/emqx/pull/15944) 改进了以下连接器在资源被标记为 `disconnected` 状态时返回的信息:LDAP、Syskeeper、IoTDB、Snowflake(聚合模式)、JWKS 认证。
+
+#### 性能
+
+- [#15536](https://github.com/emqx/emqx/pull/15536) 默认禁用了 `node.global_gc_interval` 配置。该配置在启用时会引发 CPU 波动和消息延迟,而 Erlang 内置 GC 已足够应对大部分场景。禁用后整体性能更稳定。
+
+- [#15539](https://github.com/emqx/emqx/pull/15539) 优化 Erlang VM 参数以提升性能与稳定性:
+ - 增大分布式通道缓冲区至 32 MB(`+zdbbl 32768`),避免在高强度 Mnesia 操作中触发 `busy_dist_port` 报警。
+ - 禁用调度器忙等待(`+sbwt none +sbwtdcpu none +sbwtdio none`),降低操作系统报告的 CPU 使用率。
+ - 设置调度器绑定类型为 db(`+stbt db`),以降低消息延迟。
+
+- [#15907](https://github.com/emqx/emqx/pull/15907) 优化了系统内存使用。当客户端 ID、用户名、密码和主题等字段长度超过 64 字节时,这些字段将被复制为新的二进制数据,而不再是原始报文的切片,以减少 Erlang 虚拟机中 “binary” 类型内存的占用。
+
+- [#15899](https://github.com/emqx/emqx/pull/15899) 通过确保在客户端断开时立即清除授权(authz)缓存来改进内存管理,减少不必要的内存消耗。
+
+- [#15949](https://github.com/emqx/emqx/pull/15949) 将监听器配置中的 `parse_unit` 选项默认值从 `chunk` 修改为 `frame`。当负载大小超过 socket 缓冲区(默认 4 KB)时,此更改可以显著降低 CPU 使用率。
+
+ **注意:** 当 `parse_unit = frame` 时,如果 `PUBLISH` 报文超过允许的最大大小,EMQX 将关闭连接,而不是发送 `DISCONNECT` 报文。
+
+### 修复
+
+#### 核心 MQTT 功能
+
+- [#15884](https://github.com/emqx/emqx/pull/15884) 修复了一个问题:在极少数情况下,全局路由表可能会无限期保留已长时间离开集群的节点的路由信息。
+- [#15518](https://github.com/emqx/emqx/pull/15518) 修复了一个竞争条件,该问题在大量共享订阅者同时断开连接时,可能导致集群中路由表和共享订阅状态持续出现不一致。
+- [#15872](https://github.com/emqx/emqx/pull/15872) 消除了在 CONNACK 后因非零原因代码断开连接时的 warning 日志 `unclean_terminate`。
+
+#### 部署
+
+- [#15553](https://github.com/emqx/emqx/pull/15553) 修复了 EMQX Helm chart 的一个问题:在使用默认配置部署 EMQX 时,会启动多个副本,并导致除一个节点外其余节点全部崩溃。现在 Helm chart 默认改为单副本,因为集群部署需要商业 License。
+
+- [#15580](https://github.com/emqx/emqx/pull/15580) 在 EMQX Enterprise Helm Chart 中新增变量 `emqxLicenseSecretRef`,可指定包含 EMQX License Key 的 Kubernetes Secret,使 License 自动生效。 该变量替代了无效的 `emqxLicenseSecretName`,后者仅创建并挂载 Secret 文件,却未将 License 应用于 EMQX。
+
+- [#15712](https://github.com/emqx/emqx/pull/15712) 修复了从旧版本(5.9 之前)进行滚动升级时,节点启动失败的问题。在 EMQX 的早期版本中(5.9 之前),ZIP 时间戳编码器中的错误可能会在归档条目中存储无效的 "秒" 值(值对应于 DOS 时间格式中的第 30 或 31 个 2 秒槽)。
+
+- [#15863](https://github.com/emqx/emqx/pull/15863) 修复了 License 配额报警文本。
+
+
+#### 安全
+
+- [#15581](https://github.com/emqx/emqx/pull/15581) 将 Erlang/OTP 从 26.2.5.2 升级至 26.2.5.14,包含两个与 TLS 相关的重要修复:
+ - 修复了因证书更新过程中的竞争条件导致的 TLS 连接崩溃。
+ - 现在可以正常使用 RSASSA-PSS 签名的 RSA 证书。此前,TLS 握手可能因 `bad_certificate / invalid_signature` 错误而失败。
+
+#### 访问控制
+
+
+- [#15818](https://github.com/emqx/emqx/pull/15818) 修正了 `{allow|deny, all}` ACL 规则的处理。以前,这些规则被内部转换为匹配 `#`,但由于 MQTT 规范的限制,未能正确匹配以 `$` 为前缀的主题(例如 `$testtopic/1`)。现在,使用了一个特殊的内部值,确保 `{allow|deny, all}` 规则能够正确匹配所有主题,包括以 `$` 为前缀的主题。
+
+- [#15844](https://github.com/emqx/emqx/pull/15844) 添加了验证机制,禁止向内置数据库认证器添加空用户名。此类用户稍后无法通过 HTTP API 删除,因为它们会导致 API 路径混乱。 如果您有此类用户并希望删除,请在 EMQX 控制台中运行以下命令:
+
+ ```erlang
+ mria:transaction(emqx_authn_shard, fun() -> mnesia:delete(emqx_authn_mnesia, {'mqtt:global',<<>>}, write) end).
+ ```
+
+- [#16081](https://github.com/emqx/emqx/pull/16081) 修复了一个问题:使用扩展认证和内存会话的客户端可能因 `calling_self` 错误导致触发 `session_stepdown_request_exception` 异常并发生崩溃。
+
+ 示例错误日志
+
+
+ ```
+ 2025-09-24T07:13:08.973954+08:00 [error] clientid: someclientid, msg: session_stepdown_request_exception, peername: 127.0.0.1:41782, username: admin, error: exit, reason: calling_self, stacktrace: [{gen_server,call,3,[{file,"gen_server.erl"},{line,1222}]},{emqx_cm,request_stepdown,4,[{file,"emqx_cm.erl"},{line,427}]},{emqx_cm,do_takeover_begin,2,[{file,"emqx_cm.erl"},{line,398}]},{emqx_cm,takeover_session,2,[{file,"emqx_cm.erl"},{line,384}]},{emqx_cm,takeover_session_begin,2,[{file,"emqx_cm.erl"},{line,305}]},{emqx_session_mem,open,4,[{file,"emqx_session_mem.erl"},{line,210}]},{emqx_session,open,3,[{file,"emqx_session.erl"},{line,263}]},{emqx_cm,'-open_session/4-fun-1-',4,[{file,"emqx_cm.erl"},{line,290}]},{emqx_cm_locker,trans,2,[{file,"emqx_cm_locker.erl"},{line,32}]},{emqx_channel,post_process_connect,2,[{file,"emqx_channel.erl"},{line,575}]},{emqx_connection,with_channel,3,[{file,"emqx_connection.erl"},{line,852}]},{emqx_connection,process_msg,2,[{file,"emqx_connection.erl"},{line,470}]},{emqx_connection,process_msgs,2,[{file,"emqx_connection.erl"},{line,462}]},{emqx_connection,handle_recv,3,[{file,"emqx_connection.erl"},{line,406}]},{proc_lib,wake_up,3,[{file,"proc_lib.erl"},{line,340}]}], action: {takeover,'begin'}, ...
+ ```
+
+
+
+#### 数据集成
+
+
+- [#15616](https://github.com/emqx/emqx/pull/15616) 修复了 Kafka 健康检查逻辑。即使默认探测主题返回 `topic_authorization_failed` 错误,Kafka 连接也会被视为健康。
+
+- [#15826](https://github.com/emqx/emqx/pull/15826) 改进了 Kafka 消费者连接器健康检查行为,尤其是在 ACL 限制的情况下。此前,若配置的用户缺少访问内部 `____emqx_consumer_probe` 消费者组的权限,则 Kafka 消费者连接器的健康检查可能会失败。通过此修复,如果 Kafka broker 返回 "ACL denied" 响应,EMQX 将视该连接为健康连接。
+
+- [#15827](https://github.com/emqx/emqx/pull/15827) 修复了 GreptimeDB 驱动中的原子泄漏和进程泄漏问题。同时修复了在 GreptimeDB 动作中使用某些错误的写入语法时可能出现的 `function_clause` 错误。
+
+- [#15836](https://github.com/emqx/emqx/pull/15836) 丰富了 Kafka 消费者源添加失败时的返回信息,例如因主题 ACL 被拒导致的失败。
+
+- [#15850](https://github.com/emqx/emqx/pull/15850) 修复了一个问题:MQTT 桥接错误地将已失效的连接显示为已连接状态,并且未能重新建立连接。
+
+- [#15866](https://github.com/emqx/emqx/pull/15866) 将 Kafka 生产者库 wollf 升级至 `4.0.12`,以改进对 Kafka 元数据响应中临时缺失分区的处理。
+
+ 在极少数竞争条件下,Kafka 可能返回不完整的分区列表。此前,仅在主题被重新创建且分区数量减少的情况下进行了处理,但未覆盖分区暂时缺失的情况。该缺陷可能导致分区生产者阻塞,并使节点在关闭时无限等待。
+
+- [#15906](https://github.com/emqx/emqx/pull/15906) 将 Kafka 生产者库 Wolff 从 `4.0.12` 升级到 `4.0.13`,新增了处理 `ProduceResponse` 中 `record_list_too_large` 错误的功能。
+
+- [#15902](https://github.com/emqx/emqx/pull/15902) 将 MQTT 客户端库升级至 1.13.8,提升了 MQTT 桥接的连接稳定性:
+
+ - 当对端 Broker 未响应 PINGRESP 时,连接器将自动重连。
+ - 若在等待 CONNACK 期间连接中断,基于 TLS 的桥接失败将更及时地被处理。
+
+- [#15910](https://github.com/emqx/emqx/pull/15910) 修复了连接器中的一个问题:在较大的工作线程池中,若多个工作线程同时崩溃,可能导致连接器无法正常恢复。
+
+ 受影响并已修复的连接器包括:
+
+ - MySQL
+ - PostgreSQL
+ - Oracle
+ - SQLServer
+ - TDEngine
+ - Cassandra
+ - Dynamo
+ - HTTP
+ - Couchbase
+ - GCP PubSub
+ - Snowflake
+
+ 同时将 `gun` 及相关依赖升级至 2.1.0。
+
+- [#16010](https://github.com/emqx/emqx/pull/16010) 修复了一个问题:如果原始规则的 SQL 未包含规则环境中的 `metadata` 字段,规则的备选动作可能会因 `function_clause` 错误而执行失败。
+
+ 错误日志示例:
+
+ ```
+ [error] tag: RESOURCE, msg: failed_to_trigger_fallback_action, reason: {error,function_clause}, fallback_kind: republish, primary_action_resource_id: <<"action:type:name:connector:type:name">>, republish_topic: <<"republish/topic">>
+ ```
+
+- [#16043](https://github.com/emqx/emqx/pull/16043) 优化了 Kafka 数据集成在发生 `not_all_kafka_partitions_connected` 事件时的日志信息。
+
+- [#16046](https://github.com/emqx/emqx/pull/16046) 修复了一个潜在的内存溢出(OOM)崩溃问题:当加载或重启包含数百个动作的连接器配置时,可能导致崩溃。
+
+#### 规则引擎
+
+
+- [#16028](https://github.com/emqx/emqx/pull/16028) 修复了规则引擎中 `jq` 函数的内存泄漏问题。
+
+ 此前,如果使用内置的 `jq` 函数 `index`(例如 `.key | index("name")`),会导致内存泄漏。
+
+#### 数据智能中心
+
+
+- [#15706](https://github.com/emqx/emqx/pull/15706) 修复了可能导致消息转换 和 Schema 验证表现不一致的索引问题。删除某个条目后可能破坏主题索引,导致后续条目即使被禁用仍然保持启用状态。
+- [#15708](https://github.com/emqx/emqx/pull/15708) 修复了外部 Schema Registry 在节点重启后未能重新加载的问题。
+- [#15810](https://github.com/emqx/emqx/pull/15810) 引入了 `spb_{en,de}code` 函数来修正 `bytes_value` 指标的处理。修复了原始的 `sparkplug_{en,de}code` 函数的问题,因为它们没有根据 [Protobuf 规范](https://protobuf.dev/programming-guides/json/) 对 `bytes_value` 指标值进行 base64 编码/解码。为此,引入了新的 `spb_{en,de}code` 函数来正确编码/解码这些字段。旧的 `sparkplug_{en,de}code` 函数已被弃用,以保持向后兼容性。
+
+#### 可观测性
+
+- [#15639](https://github.com/emqx/emqx/pull/15639) 修复了 `packets.subscribe.auth_error` 指标未在订阅认证失败时正确递增的问题。
+- [#15785](https://github.com/emqx/emqx/pull/15785) 修复了在格式化网络拥塞告警消息时,若 MQTT 用户名包含非 ASCII 字符,可能导致崩溃的问题。
+- [#15963](https://github.com/emqx/emqx/pull/15963) 减少了在远程 shell(`remsh`)中进行循环评估时产生的过多审计日志。
+- [#15967](https://github.com/emqx/emqx/pull/15967) 修复了一个问题:在清理大量审计日志时,Mnesia 事务阻塞可能导致内存迅速增长。
+
+#### 网关
+
+- [#15679](https://github.com/emqx/emqx/pull/15679) 修复了 ExProto、JT/T 808、GB/T 32960 和 OCPP 网关的 global chain name 错误。这些网关的内置认证数据此前被错误地归类到 `unknown:global`,导致网关之间产生冲突。
+- [#15699](https://github.com/emqx/emqx/pull/15699) 修复了当节点停止或重启时,网关(如 CoAP)的内置认证数据被错误删除的问题。
+- [#15822](https://github.com/emqx/emqx/pull/15822) 修复了 OCPP 网关连接在发送一定数量的消息后会崩溃的问题。
+
+#### 速率限制
+
+
+- [#15794](https://github.com/emqx/emqx/pull/15794) 改进了连接速率限制更新的行为,确保在监听器配置更新后,速率限制的更改(例如突发速率或速率阈值)会立即生效。此前,内部限速器状态未能正确刷新,可能导致速率限制比配置的严格。
+
+#### ExHook
+
+
+- [#15683](https://github.com/emqx/emqx/pull/15683) 修复了 ExHook 的 TLS 选项,使 gRPC 客户端能够在 TLS 握手过程中正确验证服务器主机名。
+
## 5.9.1
*发布日期 2025-07-02*
@@ -634,7 +816,7 @@
### 增强
-#### MQTT 核心功能
+#### 核心 MQTT 功能
- [#14454](https://github.com/emqx/emqx/pull/14454) 引入了 `max_publish_rate` 选项,用于控制每个节点发布保留消息的最大速率。超过此限制发布的消息将仍然被传送,但不会存储为保留消息。
@@ -733,7 +915,7 @@
### 修复
-#### MQTT 核心功能
+#### 核心 MQTT 功能
- [#14405](https://github.com/emqx/emqx/pull/14405) 将 `mqtt.max_packet_size` 中的 `256MB` 转换为 `268435455` 字节。
@@ -820,7 +1002,7 @@
### 增强
-#### MQTT 核心功能
+#### 核心 MQTT 功能
- [#13739](https://github.com/emqx/emqx/pull/13739) 新增支持清除整个集群的监控(统计)数据。现在可以通过向 `api/v5/monitor` 端点发送 `DELETE` 请求来清除所有收集到的监控指标。
@@ -873,7 +1055,7 @@
### 修复
-#### MQTT 核心功能
+#### 核心 MQTT 功能
- [#14248](https://github.com/emqx/emqx/pull/14248) 修复了集群节点间偶发的连接问题,这些问题可能导致集群范围的路由表状态部分丢失。此修复确保了集群间更好的一致性和可靠性。
- [#14272](https://github.com/emqx/emqx/pull/14272) 修复了通过 CLI 加载的 `auto_subscribe` 配置未生效的问题,尽管之前显示了成功消息。
@@ -948,7 +1130,7 @@
### 增强
-#### MQTT 核心功能
+#### 核心 MQTT 功能
- [#14219](https://github.com/emqx/emqx/pull/14219) 强化了连接速率限制器,提升了系统的弹性。
- **提升了高连接速率下的系统稳定性和响应性**:以前,当连接速率超出限制时,监听器接收器会忽略新的连接请求,这可能导致在大量客户端频繁连接或重新连接的情况下系统进入不可恢复的状态。现在,监听器会接受待处理的连接,但一旦达到连接速率限制,立即关闭这些连接。这减少了资源压力,并提高了高峰负载下的系统弹性。
@@ -995,7 +1177,7 @@
### 修复
-#### MQTT 核心功能
+#### 核心 MQTT 功能
- [#14201](https://github.com/emqx/emqx/pull/14201) 防止 WebSocket 连接遇到速率限制时出现 `check_gc` 警告。
- [#14215](https://github.com/emqx/emqx/pull/14215) 修复了当 retainer 被禁用时(通过 REST 或 CLI 调用)会抛出异常的问题。