IL-0531 Microsoft Azure · 2024-04-19azuredatabasenetworking
Azure Database for MySQL Single Server and MariaDB in West US rejected every new connection for a batch of servers
All connections to Azure Database for MySQL - Single Server and Azure Database for MariaDB go through a gateway that routes each incoming connection to its server. The gateway runs on a group of stateless compute nodes behind one IP address. The hardware of the gateway is refreshed from time to time: a new ring of gateway nodes with a different IP address is built first, customers are told by email and in the Azure portal to allow the new gateway IP in their outbound rules, and once the new ring works, the DNS for existing servers is updated so that new client connections go to the new ring and the old hardware can be decommissioned.
On 19 April 2024 this move was scheduled for existing servers in West US. At 04:26 UTC the DNS update was made for a batch of MySQL and MariaDB servers, but because of a procedural error the new connections went to a newly built gateway ring whose configuration was incomplete. That ring was not ready to accept connections, logins failed at the gateway, and the gateway rejected every new incoming connection to those servers. The ring also had no telemetry or monitoring configured yet, so the failure was not detected from service telemetry until Azure Databricks reported unreachable databases at 04:46 UTC. The MySQL on-call engineers found the databases healthy at 05:14 UTC, the networking team joined at 05:44 UTC, and at 06:46 UTC the issue was correlated with the gateway move and the rollback began. The incident was mitigated at 07:30 UTC, when the change had been fully rolled back and, after validation, all connections had moved back to the previous working gateway ring. Azure Databricks, which depends on the database service, had failed logins, jobs and queries in West US, West US 2 and South Central US during the same period.
- Severity
- –
- Scope
- All new connections to a subset of Azure Database for MySQL - Single Server and Azure Database for MariaDB servers failed; Azure Databricks workspace logins, authentication, cluster operations, jobs, UI and Databricks SQL queries, SQL Serverless Warehouses and UC APIs failed or timed out
- Users affected
- A subset of Azure Database for MySQL - Single Server and Azure Database for MariaDB customers, and Azure Databricks customers
- Region
- West US; Azure Databricks in West US, West US 2 and South Central US
- Time to detect
- 20m
- Time to resolve
- 3h 4m
Symptoms
From 04:26 UTC on 19 April 2024, every new connection to a subset of Azure Database for MySQL - Single Server and Azure Database for MariaDB servers in West US failed, and retries did not help. The first report came at 04:46 UTC from Azure Databricks, which told the MySQL team that multiple databases were unreachable.
Azure Databricks depends on the affected database service, so Databricks customers in West US, West US 2 and South Central US saw workspace login and authentication requests fail or time out. Cluster CRUD requests and jobs that needed a cluster to start, resize or terminate did not run, jobs submitted through APIs or schedulers did not run, UI and Databricks SQL queries timed out, Databricks SQL Serverless Warehouses failed to launch and UC APIs could not be reached. The errors cited "Authentication is temporarily unavailable" or "TEMPORARILY_UNAVAILABLE".
At 05:14 UTC the MySQL on-call engineers found that the databases themselves were healthy but no connections were reaching them. The networking team joined at 05:44 UTC. Service telemetry showed nothing, because the gateway ring that received the connections was not fully configured and had no telemetry or monitoring yet. At 06:46 UTC the failures were linked to the move of traffic to a new gateway ring.
Root cause
Root cause Operator error
- Trigger
- At 04:26 UTC, during planned maintenance in West US, the DNS update that moves new incoming connections for a batch of MySQL and MariaDB servers to a new gateway ring was made, and a procedural error pointed it at a newly built gateway ring whose configuration was incomplete.
Detection
Service telemetry did not detect the failure because the new gateway ring had no telemetry or monitoring configured yet. At 04:46 UTC Azure Databricks reported to the MySQL team that multiple databases were unreachable.
Remediation
- Rolled back the DNS change and moved all connections back to the previous working gateway ring after validation
Action items
- Add checks, testing and sign-off procedures before switching production gateway rings
- Add Azure Databricks alerts that detect multiple databases becoming unavailable within a short time
Lessons
–
Sources
- https://azure.status.microsoft/en-us/status/history/?trackingId=QS3K-BPZ · official-status
References
Related cases
IL-0577Ficilcom's production Neon PostgreSQL database was reset by prisma migrate reset meant for the local databaseFicilcom · 2026same root cause · shared Database
IL-0576Every dataset in CareNet's production BigQuery data warehouse was deleted, and UNDROP SCHEMA could not restore themCareNet · 2025same root cause · shared Database
IL-0242Both PostgreSQL servers behind matrix.org were lost during a disk expansion, and the homeserver was down for 24 hoursMatrix.org Foundation · 2025same root cause · shared Database
IL-0348Scaleway's FR-PAR region lost public internet connectivity when one 100 Gbps backbone link was saturatedScaleway · 2025same root cause · shared Authoritative DNS servers and records
IL-0582Jobs piled up in Kanmu's PostgreSQL-based qg job queue on Aurora as dequeue slowed and dead tuples kept growingKanmu · 2024same root cause · shared Database
IL-0556A transaction left open during database maintenance stopped uploads and then downloads on Storj's US1 satelliteStorj · 2024same root cause · shared Database
IL-0565Cookie Run: Kingdom's CockroachDB cluster failed when 16 of 24 nodes lost their filesystems, causing a 36-hour outageDevsisters · 2022same root cause · shared Database
IL-0207A routine task run from an engineer's local environment switched to production and deleted GitLab.com's Consul release, so Patroni lost Consul and GitLab.com returned 5xx errors to all trafficGitLab · 2022same root cause · shared Database
IL-0221A backbone maintenance command disconnected all Facebook data centers, and its DNS servers withdrew their BGP routesMeta · 2021same root cause · shared Authoritative DNS servers and records
IL-0332A test run against the production database truncated every table and travis-ci.com was down for about 5.5 hoursTravis CI · 2018same root cause · shared Database
IL-0431During Mackerel's move to AWS, PostgreSQL failed over to a replica that had stopped replicating, losing an hour of dataHatena · 2017same root cause · shared Database
IL-0506UC Berkeley DataHub logins failed and students got empty home directories after the JupyterHub database was overwrittenUC Berkeley · 2017same root cause · shared Database
IL-0218GitLab.com's primary PostgreSQL data was wiped by mistake and, with no working backup, the site was down about 18 hoursGitLab · 2017same root cause · shared Database
IL-0573A developer's mistake dropped nine main tables of the Baemin billing MariaDB database and payments briefly stoppedWoowa Brothers · 2016same root cause · shared Database
IL-0319Dropping databases on the MySQL replica mysql2 also dropped them on mysql1, as the pair actually ran master-masterOregon State University Open Source Lab · 2015same root cause · shared Database
IL-0337EBS volumes in one US East Availability Zone got stuck after a network change cut EBS nodes off from their replicasAmazon Web Services · 2011same root cause · shared Database
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0531
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0531/similar
- MCP server (Streamable HTTP, no key):
https://incidentlib-mcp.benchlet.com/mcp
The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.