Upgrade InfluxDB 3 Enterprise
Upgrade your InfluxDB 3 Enterprise version.
Before you upgrade
Before upgrading your InfluxDB 3 Enterprise cluster, review the release notes for compatibility requirements and then plan your upgrade strategy.
Upgrading to InfluxDB 3.10 is a one-way migration
The first time you start InfluxDB 3.10, it automatically upgrades the on-disk catalog format from v2 to v3. After migration, 3.9.x and older binaries are unable to read the new catalog, and fail to start on the same cluster data.
Before upgrading, back up {prefix}/catalogs/ and {prefix}/_catalog_checkpoint.
Restoring these objects is the only way to roll back to 3.9.x.
If your cluster uses the upgraded storage engine (the default for new clusters, or after running the storage engine upgrade with --upgrade-pacha-tree), data written in the new .pt file format is also unreadable by 3.9.x.
Upgrading to InfluxDB 3.12 removes rollback to any 3.11.x release
InfluxDB 3.12 adds a catalog record type that 3.11.x binaries can’t read. Once every running node in the cluster is on 3.12 (which happens at first startup on a single node), the catalog commits the new feature level. From then on, a 3.11.x binary refuses to load the catalog and reports that the node’s feature level is below the cluster’s committed level. This applies to InfluxDB 3 Enterprise whether or not you use any of the features that require it.
Back up everything under {prefix}/catalog/ (the catalog snapshot and
logs under catalog/v3/) before you upgrade.
Restoring these objects is the only way to roll back to 3.11.x.
Other changes to review before you upgrade to 3.12
- Query concurrency now has a finite default:
--max-concurrent-queriesdefaults to the larger of50and 4 times the node’s query parallelism, instead of being effectively unlimited. Queries submitted over the limit wait for a slot instead of running immediately. - The WAL buffer limit is now enforced:
--wal-max-buffered-writes(default100000) previously had no effect. Once the WAL buffer fills, writes now return429 Too Many Requestsuntil it drains. - HTTP and gRPC request metrics are split by protocol:
http_requests*metrics now count only HTTP requests, andgrpc_requests*metrics count only gRPC requests. Dashboards that summed the two families report lower values after you upgrade. Thepathandmethod_pathlabels are now route templates, such as/api/v3/engine/:path, instead of literal paths; update panels that filter on a specific path.
Also review these InfluxDB 3 Enterprise changes:
- Data file cache is now a hard limit (upgraded storage engine):
--file-cache-sizenow also counts bytes held by running queries. A query that needs more than the remaining budget fails instead of the node using memory beyond the configured limit. - Nodes without
querymode refuse data queries (Parquet engine): A node that doesn’t runquerymode now returns405 Method Not Allowedfor data queries instead of serving them. System table queries still work. - Processing Engine in a cluster: A WAL trigger now runs on a process node for writes sent to any ingest node, and the default
--node-spec allmakes every node that runs the Processing Engine own the trigger. When you upgrade a cluster, move your plugins to a standalone process node, remove--plugin-dirfrom the other nodes, and pin each trigger to the process node with--node-spec. See Configure a standalone Processing Engine. - Username and password sessions must be renewed: Access tokens issued to users who sign in with a username and password must now carry the cluster’s catalog UUID. Tokens issued before 3.12 are rejected: refresh the token or sign in again. API tokens aren’t affected.
- Orphaned file cleanup starts automatically (upgraded storage engine): The primary compactor begins finding and deleting unreferenced compacted files a few minutes after it first starts on 3.12, then repeats every 7 days. To only report candidates without deleting them, set
--compactor-sweep-mode dry-run. To turn cleanup off, set--compactor-sweep-interval off. See Orphaned file cleanup. - Distributed compaction is available (beta, upgraded storage engine): Compaction jobs can now run on every compact node instead of only the node that holds the compactor lease. It’s off by default (
--compactor-dispatch-target local), so upgrading alone doesn’t change where compaction runs. See Distributed compaction.
For the complete list of changes, see the release notes.
Verify your current version
Before upgrading, verify the InfluxDB 3 Enterprise version running on each node.
influxdb3 --versiondocker exec CONTAINER_NAME influxdb3 --versionReplace the following:
CONTAINER_NAME: The name of your InfluxDB 3 Enterprise container
The command returns version information similar to the following:
influxdb3 3.12.2Verify your InfluxDB version
Before and after upgrading, verify the InfluxDB 3 Enterprise version running on your instance.
Upgrade an InfluxDB 3 instance
curl -O https://www.influxdata.com/d/install_influxdb3.sh \
&& sh install_influxdb3.sh enterprise# 1. Download the new version
curl -L https://dl.influxdata.com/influxdb/releases/influxdb3-enterprise-3.12.2_linux_amd64.tar.gz \
-o influxdb3-enterprise.tar.gz
# 2. Extract the archive
tar xvzf influxdb3-enterprise.tar.gz
# 3. Stop the service
sudo systemctl stop influxdb3-enterprise
# 4. Install the new binary
sudo cp influxdb3 /usr/local/bin/
# 5. Start the service
sudo systemctl start influxdb3-enterprisedocker stop CONTAINER_NAME
docker pull influxdb:enterprise
docker start CONTAINER_NAMEReplace the following:
CONTAINER_NAME: The name of your InfluxDB 3 Enterprise container
docker compose down
docker compose pull
docker compose up -d# Download the latest Windows binary
Invoke-WebRequest `
-Uri "https://dl.influxdata.com/influxdb/releases/influxdb3-enterprise-3.12.2-windows_amd64.zip" `
-OutFile "influxdb3-enterprise.zip"
# Extract the binary
Expand-Archive -Path influxdb3-enterprise.zip -DestinationPath . -Force
# Stop the service, replace the binary, and start the service
Stop-Service influxdb3
Copy-Item -Path "influxdb3.exe" -Destination "C:\Program Files\InfluxData\influxdb3\" -Force
Start-Service influxdb3Upgrade a multi-node cluster
Upgrade InfluxDB 3 Enterprise instances to newer versions using rolling upgrades to minimize downtime. When upgrading multi-node clusters, you need to understand how nodes on different versions interoperate and the recommended upgrade order for different node modes.
Mixed-version clusters
During a rolling upgrade, nodes on the old and new versions share the catalog and the files in object storage. How the cluster behaves depends on the versions you upgrade from and to:
- From 3.10 or later: Nodes on the old version keep reading and writing the catalog until the last of them is upgraded. Features added by the new version stay unavailable until every running node is on it. The cluster then commits the new feature level, and binaries on the old version can no longer start against the catalog.
- To 3.9 or earlier: Upgrades that cross the catalog format change in 3.1 or 3.4 block writes that add tables, tags, or fields on nodes on the old version until they’re upgraded. Other upgrades to 3.9 or earlier don’t affect the catalog.
- From 3.9 or earlier to 3.10 or later: Not a rolling upgrade. The first node on the new version migrates the catalog, and nodes on 3.9 or earlier can’t read the migrated catalog. Stop every node, upgrade them all, and then start the cluster. See Upgrading to InfluxDB 3.10 is a one-way migration.
Multi-node upgrade procedure
Follow these steps to upgrade your InfluxDB 3 Enterprise deployment with minimal downtime.
Recommended node upgrade order
The order depends on the versions you upgrade from and to.
Upgrading from 3.10 or later:
Upgrade the nodes that read other nodes’ output before the nodes that write it. Within a mode, upgrade one node at a time so the others keep serving.
- Query nodes
- Process nodes
- Compactor nodes
- Ingest nodes
A node that runs ingest mode together with query or process mode (a plugin directory adds process mode) both reads and writes files. Upgrade such nodes back to back, or stop them together when the release notes announce a file format change.
Upgrading to 3.9 or earlier across the catalog format change in 3.1 or 3.4:
Upgrade ingest nodes first to restore writes that add tables, tags, or fields, then query, compactor, and process nodes. For other upgrades to 3.9 or earlier, the order doesn’t matter.
Perform a rolling upgrade
Follow these steps to upgrade each node in your deployment:
# 1. Stop the service
sudo systemctl stop influxdb3-enterprise
# 2. Install the new version
# Follow the installation instructions for your platform:
# https://docs.influxdata.com/influxdb3/enterprise/install/
# 3. Start the service
sudo systemctl start influxdb3-enterprise
# 4. Verify the version
influxdb3 --version
# 5. Check the node's health
influxdb3 query \
--database _internal \
--token ADMIN_TOKEN \
"SELECT * FROM system.queries LIMIT 5"Replace the following:
ADMIN_TOKEN: An admin token
# 1. Stop the container
docker stop CONTAINER_NAME
# 2. Pull the latest image
docker pull influxdb:enterprise
# 3. Start the container with the new image
# IMPORTANT: Adjust the docker run command to match your existing
# container configuration, including environment variables, volume mounts,
# object store settings, and network settings.
docker run -d \
--name CONTAINER_NAME \
-p 8181:8181 \
-e INFLUXDB3_LICENSE_EMAIL=your-email@example.com \
-v ~/.influxdb3/data:/var/lib/influxdb3/data \
influxdb:enterprise \
influxdb3 serve \
--node-id NODE_ID \
--cluster-id CLUSTER_ID \
--object-store OBJECT_STORE_TYPE \
--data-dir /var/lib/influxdb3/data
# 4. Verify the version
docker exec CONTAINER_NAME influxdb3 --version
# 5. Check the node's health
docker exec CONTAINER_NAME influxdb3 query \
--database _internal \
--token ADMIN_TOKEN \
"SELECT * FROM system.queries LIMIT 5"Replace the following:
CONTAINER_NAME: The name of your InfluxDB 3 Enterprise containerNODE_ID: The node identifier for this instanceCLUSTER_ID: The cluster identifier for your deploymentOBJECT_STORE_TYPE: The object store type (for example,file,s3,azure, orgoogle)ADMIN_TOKEN: An admin token
Use the influxdb:enterprise image tag
The influxdb:enterprise tag always points to the latest InfluxDB 3 Enterprise release.
Use docker pull influxdb:enterprise to pull the latest version, or specify a version tag directly (for example, influxdb:3.12.2-enterprise) to upgrade to a specific version.
If you use a cloud object store (S3, Azure, or Google Cloud), include the appropriate credentials and bucket configuration in the docker run command.
# 1. Stop the services
docker compose down
# 2. Update the image in your compose.yaml file
# Change the image version to: influxdb:enterprise
# 3. Start the services with the new image
docker compose up -d
# 4. Verify the version
docker compose exec influxdb3 influxdb3 --version
# 5. Check the node's health
docker compose exec influxdb3 influxdb3 query \
--database _internal \
--token ADMIN_TOKEN \
"SELECT * FROM system.queries LIMIT 5"Replace the following:
ADMIN_TOKEN: An admin token
Use the influxdb:enterprise image tag
The influxdb:enterprise tag always points to the latest InfluxDB 3 Enterprise release.
Update the image: field in your compose.yaml to influxdb:enterprise to pull the latest version, or specify a version tag directly (for example, influxdb:3.12.2-enterprise) to upgrade to a specific version.
The InfluxDB 3 Enterprise Helm chart
runs a separate StatefulSet for each node mode, but the image tag
(image.tag) is a single chart-wide value.
A plain helm upgrade therefore rolls every node mode at once, and Kubernetes
doesn’t order rollouts across StatefulSets—so the upgrade doesn’t follow the
recommended node upgrade order on its own.
To control the order, freeze the modes you aren’t upgrading yet with the
updateStrategy.rollingUpdate.partition field, then release them one mode at a
time.
The steps below follow the order for upgrades from 3.10 or later.
Setting partition to a value greater than or equal to a StatefulSet’s replica
count holds every pod in that StatefulSet at its current version.
A partition lower than the replica count lets the pods at or above that ordinal
update, so use a ceiling that your replica counts can’t reach.
# 1. Freeze the modes you upgrade later, then apply the new image tag.
# Any partition >= a StatefulSet's replica count holds all of its pods, so
# 10000 is a ceiling no deployment reaches. Only queriers roll.
helm upgrade RELEASE_NAME influxdata/influxdb3-enterprise \
--namespace NAMESPACE \
--reuse-values \
--set image.tag=VERSION-enterprise \
--set processingEngine.updateStrategy.rollingUpdate.partition=10000 \
--set compactor.updateStrategy.rollingUpdate.partition=10000 \
--set ingester.updateStrategy.rollingUpdate.partition=10000
# 2. Wait for the querier pods to roll and become ready
kubectl rollout status statefulset --namespace NAMESPACE \
--selector app.kubernetes.io/component=querier
# 3. Release the processing engine and wait for it to roll
helm upgrade RELEASE_NAME influxdata/influxdb3-enterprise \
--namespace NAMESPACE --reuse-values \
--set processingEngine.updateStrategy.rollingUpdate.partition=0
kubectl rollout status statefulset --namespace NAMESPACE \
--selector app.kubernetes.io/component=processor
# 4. Release the compactor and wait for it to roll
helm upgrade RELEASE_NAME influxdata/influxdb3-enterprise \
--namespace NAMESPACE --reuse-values \
--set compactor.updateStrategy.rollingUpdate.partition=0
kubectl rollout status statefulset --namespace NAMESPACE \
--selector app.kubernetes.io/component=compactor
# 5. Release the ingesters and wait for them to roll
helm upgrade RELEASE_NAME influxdata/influxdb3-enterprise \
--namespace NAMESPACE --reuse-values \
--set ingester.updateStrategy.rollingUpdate.partition=0
kubectl rollout status statefulset --namespace NAMESPACE \
--selector app.kubernetes.io/component=ingester
# 6. Verify every node re-registered and reports running
influxdb3 show nodesReplace the following:
RELEASE_NAME: Your Helm release nameNAMESPACE: The namespace of your releaseVERSION: The target version (for example,3.12.2)
Raise the termination grace period before upgrading
The chart doesn’t set terminationGracePeriodSeconds, so pods inherit the
Kubernetes default of 30 seconds.
If a node is still flushing its write-ahead log when Kubernetes sends
SIGKILL, it stops ungracefully and has to replay its WAL on restart.
Raise the grace period above your observed shutdown time before you roll a
cluster—see
Deploy with an orchestrator.
A rollout is a restart, not a removal
Each pod keeps its StatefulSet-ordinal name, so every node re-registers under
its existing node ID.
Don’t run
influxdb3 remove node
as part of an upgrade—removal permanently deletes the node’s catalog entry and
object-store files.
See Restart compared to removal.
helm rollback doesn’t undo a catalog migration
helm rollback reverts the image tag, but it can’t revert changes the newer
version already made to your cluster data.
After a node starts InfluxDB 3 Enterprise 3.10 or later, the on-disk catalog is
migrated to v3 and older binaries fail to start against it—so rolling the
release back leaves pods crash-looping on a catalog they can’t read.
Restoring the catalog objects you backed up is the only way back.
See Upgrading to InfluxDB 3.10 is a one-way migration.
Drive the upgrade one node at a time with serial: 1, and order your plays by
node mode to match the
recommended node upgrade order.
The playbook below follows the order for upgrades from 3.10 or later.
# Upgrade one host at a time, query nodes first.
- hosts: influxdb3_query
serial: 1
vars:
# Pin the target version so every host lands on the same build.
influxdb3_version: "3.12.2"
tasks:
- name: Stop influxdb3 gracefully
ansible.builtin.systemd_service:
name: influxdb3
state: stopped
# Replace this task with the install method you use--for example, a
# package from your own repository or the downloaded release archive.
# See https://docs.influxdata.com/influxdb3/enterprise/install/
- name: Install influxdb3 {{ influxdb3_version }}
ansible.builtin.include_role:
name: influxdb3_install
- name: Start influxdb3
ansible.builtin.systemd_service:
name: influxdb3
state: started
- name: Wait for the node to report healthy
ansible.builtin.uri:
url: "http://{{ inventory_hostname }}:8181/health"
status_code: 200
register: health
until: health.status == 200
retries: 30
delay: 10
# Repeat for influxdb3_process, then influxdb3_compact, then influxdb3_ingest.Because systemd escalates to SIGKILL after TimeoutStopSec, confirm your
unit file allows enough time for the final WAL flush before you roll a cluster:
[Service]
KillSignal=SIGTERM
TimeoutStopSec=300Restart in place—don’t remove nodes
Each host restarts with the same
--node-id, so it
re-registers as the same node.
Never add
influxdb3 remove node
to an upgrade playbook—see
Restart compared to removal.
Repeat these steps for each remaining node in the recommended order.
Troubleshooting cluster upgrades
Upgrade order issues
If you upgrade nodes out of the recommended order, a query or process node on the old version may encounter files in a format it can’t read. It logs errors and keeps serving the data it already loaded; if it restarts, it fails to start. Upgrade the node to recover.
New features stay unavailable after the upgrade
The cluster commits a new feature level only when every running node is on the new version.
Run influxdb3 show nodes; a node that stopped without a clean shutdown can still show as running and holds the feature level back.
Restart that node on the new version.
Nodes upgrade out of order in Helm deployments
The InfluxDB 3 Enterprise Helm chart uses a single chart-wide image.tag, so a
plain helm upgrade rolls every node mode at once instead of following the
recommended node upgrade order.
Use updateStrategy.rollingUpdate.partition to release one mode at a time, as
shown in the Helm tab of
Perform a rolling upgrade.
Nodes don’t return to running after a rollout
A node that was killed before it finished flushing its write-ahead log stops
ungracefully and replays its WAL on restart, which can extend startup.
In Kubernetes, this usually means terminationGracePeriodSeconds (default 30)
is shorter than the node’s shutdown time; with systemd, it usually means
TimeoutStopSec is too low.
See Deploy with an orchestrator.
Extra nodes appear in the catalog after an upgrade
Each restart registered a new node ID instead of reclaiming the existing one.
Verify that your deployment assigns a stable
--node-id—a
Kubernetes Deployment generates a new pod name on every rollout, so use a
StatefulSet instead.
See Kubernetes and Helm.
Version compatibility problems
If nodes fail to communicate after an upgrade, verify that all nodes are running compatible versions.
- Connect to each node and verify the version
- Review the release notes for your target version to identify any breaking changes or compatibility requirements.
Was this page helpful?
Thank you for your feedback!
Support and feedback
Thank you for being part of our community! We welcome and encourage your feedback and bug reports for InfluxDB 3 Enterprise and this documentation. To find support, use the following resources:
Customers with an annual or support contract can contact InfluxData Support. Customers using a trial license can email trial@influxdata.com for assistance.