본문으로 건너뛰기
최종 수정: 에

Cluster Upgrade

Apache Doris supports rolling upgrades by progressively replacing the binaries on FE and BE nodes, which minimizes downtime and keeps the cluster available during the upgrade. This document is for cluster administrators and covers version compatibility rules, the metadata compatibility test procedure, and the detailed upgrade steps.

Applicable Scenarios​

ScenarioApplicableNotes
Patch-version upgrade within the same minor version (for example, 2.1.3 to 2.1.7)YesRolling upgrade can be applied directly
Minor-version upgrade across minor versions (for example, 3.0 to 3.3)Yes, step by stepUpgrade in sequence: 3.0 to 3.1, 3.1 to 3.2, 3.2 to 3.3
Major-version upgrade (for example, 2.x to 3.x)Yes, step by stepDirectly upgrading across major versions is not recommended; upgrade minor version by minor version
Upgrade of a single-FE clusterYes, after compatibility testingScale out to a 3-FE high-availability deployment first, or run a metadata compatibility test before upgrading
Upgrade across versions where metadata may be incompatibleYes, after compatibility testingMetadata compatibility must be verified before the upgrade

Prerequisites​

Before performing the upgrade, confirm the following:

  • You have read the Release Notes of the target version and understand the behavioral changes and compatibility between versions.
  • Data is stored with 3 replicas, so that an upgrade failure does not cause data loss.
  • Client tasks have retry logic in place (see "Upgrade Considerations" below).
  • A development machine or BE node is available for the metadata compatibility test.
  • The installation package of the target version has been downloaded and extracted (in the steps below, ${DORIS_NEW_HOME} refers to the new version's root directory, and ${DORIS_OLD_HOME} refers to the root directory of the old version running in production).

Version Compatibility​

A Doris version number has three digits. The first digit is the major milestone version, the second digit is the feature version, and the third digit is the bug-fix version. No new features are released in third-digit versions. Take Doris 2.1.3 as an example:

PositionExample valueMeaning
First digit2The 2nd milestone version
Second digit1The feature version under that milestone
Third digit3The 3rd bug-fix version under that feature version

Follow these rules when upgrading:

Upgrade typeCross-version supportedRecommended path
Third-digit version (same second-digit version)SupportedUpgrade directly, for example 2.1.3 to 2.1.7
Second-digit versionCross-version not recommendedUpgrade second-digit version by second-digit version, for example 3.0 to 3.1 to 3.2 to 3.3
First-digit versionCross-version not recommendedFirst upgrade to the latest second-digit version under the same first-digit version, then upgrade across the major version

For detailed version information, see Versioning rules.

Upgrade Considerations​

Pay attention to the following three items before upgrading:

ConsiderationHow to handle
Behavioral changes between versionsRead the Release Notes of the target version before upgrading and confirm whether there are incompatible behavioral changes
Client task retriesNodes are restarted in sequence during the upgrade, so retry logic must be added for Stream Load and query tasks. Routine Load, the Flink Doris Connector, and the Spark Doris Connector have built-in retries, so no extra handling is required
Replica repair and balanceReplica repair and balance must be disabled before the upgrade. Whether the upgrade succeeds or not, they must be re-enabled after the upgrade is complete
Note

A Doris upgrade only requires replacing the /bin and /lib directories under the FE directory and the /bin and /lib directories under the BE directory.

In versions 2.0.2 and later, a custom_lib/ directory has been added under both the FE and BE deployment paths (create it manually if it does not exist). It is used to store user-defined third-party jar files (such as hadoop-lzo-*.jar and orai18n.jar). This directory does not need to be replaced during the upgrade.

Metadata Compatibility Test​

The metadata compatibility test verifies before the upgrade that the new version can load the existing metadata correctly, which prevents data loss from an upgrade failure. It is recommended to run this test before every upgrade.

Note

In production, it is recommended to keep 3 or more FE nodes in a high-availability configuration. If there is only 1 FE node, the metadata compatibility test must be run before the upgrade. Metadata compatibility is critical: if an upgrade fails because of metadata incompatibility, data loss is possible.

Also note the following:

  • It is recommended to run the metadata compatibility test on a development machine or a BE node, and to avoid running it on an FE node.
  • If the test can only be run on an FE node, choose a non-Master node and stop its original FE process first.

1. Back Up Metadata​

Before starting the upgrade, back up the metadata of the Master FE node.

The Master FE node can be identified by the IsMaster column in show frontends. The FE metadata can be backed up hot, without stopping the FE process. By default, the FE metadata is stored in the fe/doris-meta directory; the metadata directory can also be confirmed through the meta_dir parameter in fe.conf.

2. Modify the FE Configuration File for Testing​

Edit fe.conf in the test environment:

vi ${DORIS_NEW_HOME}/conf/fe.conf

Set all ports to values different from the production ones, and also modify the clusterId parameter:

...
## modify port
http_port = 18030
rpc_port = 19020
query_port = 19030
arrow_flight_sql_port = 19040
edit_log_port = 19010

## modify clusterIP
clusterId=<a_new_clusterID, such as 123456>
...

Example ports for the test environment:

ParameterExample valueDescription
http_port18030FE HTTP service port
rpc_port19020FE Thrift Server port
query_port19030FE MySQL protocol query port
arrow_flight_sql_port19040Arrow Flight SQL port
edit_log_port19010FE BDBJE communication port
clusterId123456Test cluster ID, must differ from production

3. Copy the Master FE Metadata​

Copy the backed-up Master FE metadata to the new compatibility-test environment:

cp ${DORIS_OLD_HOME}/fe/doris-meta/* ${DORIS_NEW_HOME}/fe/doris-meta

4. Modify the cluster_id in the Metadata VERSION File​

Modify the cluster_id in the VERSION file under the copied metadata directory to the new cluster ID, for example 123456 as in the example above:

vi ${DORIS_NEW_HOME}/fe/doris-meta/image/VERSION
clusterId=123456

5. Start the FE Process in the Test Environment​

sh ${DORIS_NEW_HOME}/bin/start_fe.sh --daemon --metadata_failure_recovery

In versions before 2.0.2, add metadata_failure_recovery=true to fe.conf first, then start the FE process:

echo "metadata_failure_recovery=true" >> ${DORIS_NEW_HOME}/conf/fe.conf
sh ${DORIS_NEW_HOME}/bin/start_fe.sh --daemon

6. Verify That the FE Started Successfully​

Connect to the test FE through a MySQL client, using query_port 19030 from the example above:

mysql -uroot -P19030 -h127.0.0.1

If the connection succeeds, the new version can load the current metadata correctly, and the metadata compatibility test passes.

Upgrade Flow Overview​

The full upgrade flow is as follows, and the steps must be executed strictly in order:

  1. Disable replica repair and balance.
  2. Upgrade the BE nodes (a multi-replica cluster can use a canary upgrade).
  3. Upgrade the FE nodes (upgrade Observer/Follower nodes first, and the Master last).
  4. Re-enable replica repair and balance.

The overall principle is upgrade BE first, then upgrade FE. When upgrading FE, upgrade the Observer FE and Follower FE nodes first, and upgrade the Master FE node last.

Upgrade Steps​

Step 1: Disable Replica Repair and Balance​

Nodes are restarted during the upgrade, which may trigger unnecessary cluster balancing and replica repair. Disable the following three configurations first:

admin set frontend config("disable_balance" = "true");
admin set frontend config("disable_colocate_balance" = "true");
admin set frontend config("disable_tablet_scheduler" = "true");

The configurations involved are:

ConfigurationValue before upgradeEffect
disable_balancetrueDisables replica balancing, preventing replica migration triggered by node restarts
disable_colocate_balancetrueDisables replica balancing for Colocate Join tables
disable_tablet_schedulertrueDisables tablet scheduling, preventing replica repair

Step 2: Upgrade BE Nodes​

Note

To ensure data safety, store data with 3 replicas to avoid data loss caused by upgrade mis-operations or failures.

In a multi-replica cluster, you can pick one BE node for a canary upgrade. After it is verified, upgrade the remaining nodes one by one.

2.1 Stop the BE Node to Be Upgraded​

sh ${DORIS_OLD_HOME}/be/bin/stop_be.sh

2.2 Back Up the Existing /bin and /lib Directories​

mv ${DORIS_OLD_HOME}/be/bin ${DORIS_OLD_HOME}/be/bin_back
mv ${DORIS_OLD_HOME}/be/lib ${DORIS_OLD_HOME}/be/lib_back

2.3 Copy the New Version's /bin and /lib Directories​

cp -r ${DORIS_NEW_HOME}/be/bin ${DORIS_OLD_HOME}/be/bin
cp -r ${DORIS_NEW_HOME}/be/lib ${DORIS_OLD_HOME}/be/lib

2.4 Start the BE Node​

sh ${DORIS_OLD_HOME}/be/bin/start_be.sh --daemon

2.5 Verify the Upgrade​

Connect to the cluster and check the node information:

show backends\G

If the Alive status of the BE node is true and the Version value is the new version, the node has been upgraded successfully. After confirming, upgrade the remaining BE nodes one by one in the same way.

Step 3: Upgrade FE Nodes​

When there are multiple FE nodes, upgrade the non-Master nodes (Observer or Follower) first, and upgrade the Master node last after all the others are done.

3.1 Stop the FE Node to Be Upgraded​

sh ${DORIS_OLD_HOME}/fe/bin/stop_fe.sh

3.2 Back Up the Existing Directories​

Back up the three directories /bin, /lib, and /mysql_ssl_default_certificate:

mv ${DORIS_OLD_HOME}/fe/bin ${DORIS_OLD_HOME}/fe/bin_back
mv ${DORIS_OLD_HOME}/fe/lib ${DORIS_OLD_HOME}/fe/lib_back
mv ${DORIS_OLD_HOME}/fe/mysql_ssl_default_certificate ${DORIS_OLD_HOME}/fe/mysql_ssl_default_certificate_back

3.3 Copy the New Version's Directories​

cp -r ${DORIS_NEW_HOME}/fe/bin ${DORIS_OLD_HOME}/fe/bin
cp -r ${DORIS_NEW_HOME}/fe/lib ${DORIS_OLD_HOME}/fe/lib
cp -r ${DORIS_NEW_HOME}/fe/mysql_ssl_default_certificate ${DORIS_OLD_HOME}/fe/mysql_ssl_default_certificate

3.4 Start the FE Node​

sh ${DORIS_OLD_HOME}/fe/bin/start_fe.sh --daemon

3.5 Verify the Upgrade​

Connect to the cluster and check the node information:

show frontends\G

If the Alive status of the FE node is true and the Version value is the new version, the node has been upgraded successfully.

3.6 Upgrade the Remaining FE Nodes One by One​

Upgrade the other non-Master FE nodes one by one in the same way, and upgrade the Master FE node last.

Step 4: Re-enable Replica Repair and Balance​

After the upgrade is complete and the Alive status of all BE nodes has returned to true, re-enable cluster replica repair and balance:

admin set frontend config("disable_balance" = "false");
admin set frontend config("disable_colocate_balance" = "false");
admin set frontend config("disable_tablet_scheduler" = "false");

Per-Version Upgrade Notes​

This section records behavior changes that need extra attention when upgrading to a specific version. Beyond this section, always read the target version's release notes for the complete list of changes.

Session variable migration when upgrading from 3.x to 4.0​

FE tracks the migration progress of session variable defaults through the internal variable variable_version. When upgrading from 3.x to 4.0 (variable_version lower than 400), FE automatically adjusts the global defaults of the following variables:

VariableDefault after migrationDescription
enable_ansi_query_organization_behaviorfalseKeeps the 3.x query organization behavior so semantics do not change after the upgrade
enable_new_type_coercion_behaviorfalseKeeps the 3.x type coercion behavior
enable_sql_cachetrueEnables SQL Cache
enable_nereids_distribute_plannertrueMigration item added in version 4.0.8, see below

The migration runs only once, when variable_version is raised from below 400 to 400. It never overwrites a value the user has explicitly set afterwards.

Upgrading to 4.0.8​

Nereids distribute planner is enabled

Starting from version 4.0.8, upgrading from 3.x to 4.0 enables the Nereids distribute planner (enable_nereids_distribute_planner).

Before 4.0.8, if the cluster's metadata image had persisted enable_nereids_distribute_planner=false, that value was restored as-is after the upgrade and the cluster kept using the legacy distribute planner. Version 4.0.8 adds the variable to the variable_version=400 migration, so the new distribute planner is enabled consistently after the upgrade.

If query plan distribution differs from before the upgrade, you can roll back with SET GLOBAL enable_nereids_distribute_planner = false; and report the affected queries.

The following changes also need attention when upgrading to 4.0.8:

ChangeAffected scopeWhat to do
Compaction is no longer paused on high memory (BE config enable_compaction_pause_on_high_memory default true → false)All deployment modesSet it back to true to keep the old behavior. See BE Configuration
The minimum auto bucket number is raised from 1 to 3 (FE config autobucket_min_buckets)Tables created with BUCKETS AUTOOnly newly created partitions are affected. See Data Bucketing
The BE _stream_load_forward endpoint requires the configuration to be enabled and requests to be authenticatedDeployments relying on Group Commit BE forwarding in decoupled modeSet enable_group_commit_streamload_be_forward=true in every be.conf and make sure the load account holds the global LOAD privilege. See Group Commit
Node management APIs require the global ADMIN privilegeAutomation calling /rest/v2/manager/node/{action}/{be|fe|broker}Add authentication with an ADMIN account to the caller. See Node Action
Stream Load validates the account's access to the compute group that actually serves the requestStream Load in decoupled modeGrant the load account access to the corresponding compute group. See Stream Load
In decoupled mode, data size is consistently reported as remote sizeScripts computing capacity from SHOW TABLETS or information_schema.partitionsUse REMOTE_DATA_SIZE instead. See partitions
Sensitive Kafka properties of Routine Load jobs are masked as ****** in query resultsScripts reading credentials from SHOW ROUTINE LOADRead the original values from your configuration management instead. See SHOW ROUTINE LOAD
Warm-up timestamps change from HH:mm:ss to yyyy-MM-dd HH:mm:ssScripts parsing warm-up job statusAdjust the time parsing format. See Read-Write Separation
Scan errors no longer carry the failed to initialize storage reader prefixMonitoring rules matching on that prefixUse the error code and the tablet= / backend= information instead

Upgrading to 4.1.4​

Nereids distribute planner is enabled

Starting from version 4.1.4, upgrading from 3.x to 4.1.4 refreshes the global default of the session variable enable_nereids_distribute_planner to true. The 4.0 series has behaved this way since 4.0.8.

The refresh only happens when the cluster's variable_version is below 400, so a cluster already running 4.0.x or 4.1.x keeps whatever value it has persisted for this variable.

If query plan distribution differs from before the upgrade, you can roll back with SET GLOBAL enable_nereids_distribute_planner = false; and report the affected queries.

The string form of floating-point values changes

Starting from version 4.1.4, converting a FLOAT / DOUBLE value to a string produces the shortest string that round-trips back to the same value, instead of a fixed number of significant digits. The stored value does not change, but its text form may differ from 4.1.3 (for example, 246.9120025634766 becomes 246.91200256347656, and 0.0000123456 becomes 1.23456e-05).

This affects MySQL protocol query results, CAST(... AS STRING), the display of complex types / JSON / VARIANT, SELECT INTO OUTFILE, EXPORT, and floating-point columns of external tables. If a downstream system compares the string form of floating-point values exactly, adjust it after the upgrade. See Floating-Point Types.

The following changes also need attention when upgrading to 4.1.4:

Removed interfaces and syntax

ChangeAffected scopeWhat to do
The iceberg_meta() table function is removedSQL that reads Iceberg metadata through this table functionUse the Iceberg system tables <table>$<system_table_name> instead. See ICEBERG_META
The FE /api/<ns>/<db>/<tbl>/upload endpoints are removed, together with the FE config http_load_submitter_max_worker_threadsScripts that upload small files for loading through these endpointsUse Stream Load or the S3 / HDFS / LOCAL TVFs instead. See Upload Action
The PLAN REPLAYER PLAY '<file>' statement is removedDebugging flows that replay a minidumpOnly PLAN REPLAYER DUMP remains
The set_session_variable action of workload policies is removedWorkload policies using that actionUse cancel_query / move_query_to_group instead
The BE config get_stack_trace_tool is removed, and the fields of the BE thread stack HTTP output changeScripts collecting BE thread stacksParse the new output fields
The BE config s3_client_retry_slow_down is removed in decoupled modeDeployments relying on it to control S3 throttling retriesNo configuration is needed: BE now always retries S3 429 / 503, and Recycler never retries
The HdfsIO timer and its seven counters are removed from the query profileAutomation parsing the profileUse the other IO-related counters instead

Default value and behavior changes

ChangeAffected scopeWhat to do
The minimum auto bucket number is raised from 1 to 3 (FE config autobucket_min_buckets)Tables created with BUCKETS AUTOOnly newly created partitions are affected. See Data Bucketing
The session variable max_scanners_concurrency default changes from 4 to 8All queriesSet it back to 4 to keep the old behavior
The FE config default_get_version_from_ms_timeout_second default changes from 3 to 30Decoupled modeNothing to do; it reduces query failures caused by Meta Service jitter
The BE config enable_cache_read_from_peer default changes from true to false, and cache_read_from_peer_expired_seconds is removedDeployments relying on peer cache reads across compute groupsSet enable_cache_read_from_peer=true explicitly in be.conf to keep the old behavior
The session variable eager_aggregation_on_join is removed; eager_aggregation_on_broadcast_join (default true) and eager_agg_broadcast_row_count (default 250000) are addedSessions / scripts that set eager_aggregation_on_joinRemove the assignments to that variable
In the jobs() table function, the streaming job column Lag is renamed to LagBytes and its unit changes from seconds to bytes; a LastSourceEventTimestamp column is addedScripts parsing the jobs() output, monitoring based on the streaming_job_per_job_lag metricUse the LagBytes column and the streaming_job_per_job_lag_bytes metric. See Continuous Load
Arrow Flight SQL returns DATETIME / DATETIMEV2 as an Arrow Timestamp without a time zone (TIMESTAMPTZ stays time zone aware)Clients reading time columns through Arrow Flight SQLInterpret the values without a time zone
An aggregate function that contains another aggregate function in any of its arguments now reports aggregate function cannot contain aggregate parametersExisting SQL such as group_concat(x ORDER BY sum(k))Rewrite the SQL to aggregate first and then reference the result
Modifying default.replication_num or default.replication_allocation now removes the conflicting legacy propertyOld tables whose metadata still carries both propertiesNo action needed. SHOW CREATE TABLE and the effective replica allocation now agree. During a rolling upgrade, only alter these two properties once every FE has been upgraded, otherwise old and new FEs may apply different replica settings
Paimon paimon.table-option.* catalog properties are restricted to an allowlist of seven keysCatalogs using other paimon.table-option.* keysRemove the keys outside the allowlist. See Paimon Catalog
Storage properties add the reserved key doris.fs.cache.key and no longer apply the implicit fs.<schema>.impl.disable.cache=true defaultCatalogs / TVFs that use external storageUpgrade the BE nodes before the FE nodes
In decoupled mode, ADMIN SET FRONTEND CONFIG is restricted to the root userScripts changing FE configs at runtime with a non-root accountUse the root account, or set the configs in fe.conf instead
The FE configs s3_load_endpoint_white_list, jdbc_driver_url_white_list and force_sqlserver_jdbc_encrypt_false can no longer be modified at runtimeScripts changing these configs through ADMIN SET FRONTEND CONFIGSet them in fe.conf and restart the FE
Sensitive Kafka properties of Routine Load, and the IV / CIPHER columns of the information_schema encryption keys, are masked as ****** in query resultsScripts reading credentials from these resultsRead the original values from your configuration management instead

Deployment and configuration file changes

ChangeAffected scopeWhat to do
The JDK 17 JAVA_OPTS must change --add-opens=java.base/java.nio=ALL-UNNAMED to --add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMEDDeployments with a customized JAVA_OPTS_FOR_JDK_17 in fe.conf / be.confSync this option from the fe.conf / be.conf shipped in the new release package. Otherwise Arrow-based features such as Arrow Flight SQL may fail to start or run
The paimon-scanner module of be-java-extensions is renamed to paimon-connectorCustom deployment scripts referencing be/lib/java_extensions/paimon-scannerChange the path to paimon-connector
The BE _stream_load_forward endpoint requires the configuration to be enabled and requests to be authenticatedDeployments relying on Group Commit BE forwarding in decoupled modeSet enable_group_commit_streamload_be_forward=true in every be.conf and make sure the load account holds the global LOAD privilege. See Group Commit

Upgrading to 4.1.5​

The following changes are relative to 4.1.4.1. Before upgrading, check V1 inverted index settings, external table type mappings, and files containing historical dates.

Removed interfaces and syntax

ChangeAffected scopeWhat to do
Creating V1 inverted indexes is prohibited; existing V1 tables cannot have more inverted indexes addedCREATE TABLE, CREATE INDEX, and ALTER TABLE ADD INDEXUse V2 or V3 for new tables. Existing tables remain readable. Recreate a table if you need new indexes; ALTER TABLE cannot convert its storage format
Custom functions no longer accept variadic ... signaturesJava / Python UDFs, UDAFs, UDTFs, and ALIAS FUNCTIONUse a fixed number of parameters or a single ARRAY parameter to receive multiple values. See CREATE FUNCTION
The native file format is removedFile reads or exports using this formatUse a supported format such as Parquet or ORC. Convert old files with the previous Doris version before upgrading

Default value and behavior changes

ChangeAffected scopeWhat to do
Catalog binary types always map to VARBINARY; time zone aware timestamp types always map to TIMESTAMPTZHive, Iceberg, Paimon, and related JDBC type mappingsenable.mapping.varbinary and enable.mapping.timestamp_tz remain compatibility markers; setting them to false cannot restore the old mappings. Master FE persists the markers as true for old catalogs. Check client field types, time zones, and explicit casts
S3 / HDFS / LOCAL TVFs always preserve timestamp time zone semanticsReading Parquet UTC Timestamp or ORC TIMESTAMP_INSTANT through TVFsenable_mapping_timestamp_tz is accepted for compatibility and ignored even when set to false. The TVF parameter enable_mapping_varbinary remains configurable and defaults to false
The BE configuration and session variable enable_file_cache default changes from false to trueRemote file reads in integrated mode; BEs in compute-storage decoupled mode already force it onCheck cache paths, disk capacity, existing explicit BE configuration, and persisted global variables. See File Cache
FE meta_service_rpc_rate_limit_enabled is enabled by default, with a new dry-run mode also enabled by defaultFE-to-Meta-Service RPCs in compute-storage decoupled modeThe default only evaluates and records rate limiting. Set meta_service_rpc_rate_limit_dry_run=false to enforce it. The two new BE dry-run switches must also be disabled before they cause actual waiting. See FE Configuration and BE Configuration
cloud_version_syncer_interval_second default changes from 20 to 60 seconds, cloud_get_version_task_batch_size from 2000 to 200, and the new maximum attempt count is 3Compute-storage decoupled clusters using background version synchronizationConfigure explicit values if you need the old frequency or batch size. The interval requires an FE restart
FE streaming_cdc_fetch_splits_batch_size default changes from 100 to 16; BE request_cdc_client_timeout_ms from 60000 to 120000Streaming CDC ingestionNo migration is required. Check explicit configuration if you have tuned throughput or timeouts
The legacy LDAP authentication path rejects empty passwords by defaultLogins relying on LDAP unauthenticated BindUse a valid password. The compatibility switch ldap_allow_empty_pass defaults to false and requires an FE restart. The LDAP authentication plugin always rejects empty passwords. See LDAP
Missing data or delete files in committed Iceberg snapshots always cause an errorIceberg queries with ignore_not_found_file_in_external_table=trueRestore the missing files or use a valid snapshot. This switch can no longer skip committed Iceberg files
Invalid Iceberg schema.name-mapping.default values now cause an error instead of allowing a tolerant readTables with invalid name mapping propertiesFix or remove the property through the writer, then refresh Doris metadata. See Iceberg Catalog
Dictionary, warm-up, constraint, and other commands add privilege checks; column-level GRANT / REVOKE checks the operator's own privilegesRelated operations accounts and automation scriptsGrant the required privileges on target and related objects. See the corresponding command documentation
New AI Resources created by root can only be altered or dropped by rootAI Resources created with the root marker from 4.1.5 onwardUse root for these operations. Resources without the marker from before the upgrade are unaffected. See AI Resources

Deployment and configuration file changes

ChangeAffected scopeWhat to do
An effective FE setting of inverted_index_storage_format=V1 prevents startupClusters that configured V1 in fe.conf or fe_custom.confBefore upgrading, change it to V2 or V3 and check whether fe_custom.conf overrides fe.conf
Parquet export enable_int96_timestamps now defaults to false, using INT64 timestamps with logical typesOutfile / Export consumers that depend on the old INT96 formatConfirm support for logical INT64 timestamps. If the old format is required, explicitly set enable_int96_timestamps=true. Only true and false are accepted
Files using the old Doris DATE encoding can have a year-zero date offsetORC / Parquet files exported by Doris containing 0000-01-01 through 0000-02-28Verify the file origin and migrate as described below. Upgrading the reader alone cannot restore the original dates
Bundled Thrift upgrades from 0.16.0 to 0.24.0; Iceberg SDK from 1.10.1 to 1.11.0Deployments that build Doris or reuse third-party dependency artifactsPrepare dependencies from this release's source. Avoid reusing an old Thrift generator or mixing JAR versions

Command Privilege Checks​

Version 4.1.5 adds privilege checks to the following paths. For operations scripts and delegated accounts, check privileges on both target objects and any objects modified through cascading operations:

OperationRequired privileges
ADD CONSTRAINT / DROP CONSTRAINTALTER on the target table; adding a foreign key also requires ALTER on the referenced table; dropping a primary key and cascading to foreign keys also requires ALTER on every table modified by the cascade
CREATE DICTIONARY / DROP DICTIONARYCreating requires CREATE on the dictionary and SELECT on its source table; dropping requires DROP on the dictionary
WARM UP COMPUTE GROUPUSAGE on the target group and any specified source group, plus SELECT on explicit tables; ON TABLES rules also require global ADMIN
Cancel warm-up, clean up the catalog recycle bin, drop a stage, and manage TDE root keysGlobal ADMIN
/rest/v1 endpoints requiring administrative privilegesBoth Basic and Cookie authentication require global ADMIN or NODE. A successful /login authenticates the user but does not grant access to administrative endpoints

Metadata queries also become more tolerant: information_schema.view_dependency skips views whose definitions cannot be parsed or reference invalid objects, instead of failing the entire query. If a view is missing from the result, check its definition and FE warning logs. A missing row does not mean that the view has no dependencies.

Year-Zero DATE File Migration​

Version 4.1.5 corrects the conversion of DATE values to proleptic Gregorian epoch days in Arrow, Parquet, and ORC V2. The old Doris encoding wrote an epoch day one greater than expected for 0000-01-01 through 0000-02-28. Dates on or after 0000-03-01 are unaffected, and 0000-02-29 remains outside the supported Doris DATE range.

Old values cannot be distinguished automatically from valid new encodings. Verify files by their writer. For files where all DATE fields are confirmed to use the old Doris encoding, use the offline migration tool in this release's source:

python tools/legacy_date_migration/migrate_legacy_dates.py \
--input legacy.parquet --output migrated.parquet --format parquet \
--confirm-legacy-doris-date-encoding

For ORC files, change --format to orc. The tool requires Python 3.8+ and PyArrow with support for the selected format. It writes a new file and does not overwrite the original. Do not run it on files from other writers, files with mixed origins, or files already migrated. After migration, use enable_file_scanner_v2=true and validate boundary dates, row counts, and NULL values against a trusted source before switching consumers. For table formats such as Iceberg, do not replace data files in place. Recreate the table through the table format's writer or perform a supported transactional rewrite, so that partitions, statistics, and snapshot metadata are recomputed consistently.

FAQ​

Q: After the upgrade, a BE / FE node shows Alive as false and Version is still the old version. What should I do?​

The process did not start, or the new version failed to start. Check the be.log / fe.log error logs and confirm that /bin and /lib were replaced correctly.

Q: After the upgrade, the FE fails to start with a metadata incompatibility error. What should I do?​

The cross-version jump was too large, or the metadata compatibility test was not run. Roll back to the old version, run the test following the "Metadata Compatibility Test" procedure in this document, and upgrade step by step if necessary.

Q: After the upgrade, jar files in custom_lib/ are missing. What happened?​

custom_lib/ was overwritten by mistake. Only replace /bin and /lib; custom_lib/ must not be replaced.

Q: Stream Load tasks fail during the upgrade. Why?​

Node restarts interrupt client connections. Add retry logic on the client side. Routine Load and the Flink/Spark Doris Connectors have built-in retries.

Q: After the upgrade, the replica count is abnormal or replica migration happens frequently. What is wrong?​

disable_balance / disable_tablet_scheduler were not disabled, or they were not re-enabled after the upgrade. Verify the enable/disable flow of these configurations: disable them before the upgrade and re-enable them after.

Q: A cross-minor-version upgrade failed. Why?​

The versions were not upgraded in sequence. Roll back and follow a step-by-step path such as 3.0 to 3.1 to 3.2 to 3.3.

Q: A single-FE cluster upgrade failed and metadata was lost. What should I do?​

The metadata compatibility test was not run. Before upgrading, scale out to a 3-FE high-availability deployment, or run the metadata compatibility test on a development machine or BE node.