Jump to solution
Verify

The Fix

pip install celery==4.4.2

Based on closed celery/celery issue #6019 · PR/commit linked

Production note: This usually shows up under retries/timeouts. Treat it as a side-effect risk until you can verify behavior with a canary + real traffic.

Jump to Verify Open PR/Commit
@@ -39,7 +39,9 @@ def get_engine(self, dburi, **kwargs): return engine else: - return create_engine(dburi, poolclass=NullPool) + kwargs = dict([(k, v) for k, v in kwargs.items() if + not k.startswith('pool')])
repro.py
from airflow.models import DagRun from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker e = create_engine({AIRFLOW__CELERY__SQL_ALCHEMY_CONN},connect_args= {'ssl': {'ca': '/path-to-mysql-sslcert/server-ca', 'cert': '/path-to-mysql-sslcert/client-cert', 'key': '/path-to-mysql-sslcert/client-key'}}) s = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=e)) s.query(DagRun).all()
verify
Re-run the minimal reproduction on your broken version, then apply the fix and re-run.
fix.md
Option A — Upgrade to fixed release\npip install celery==4.4.2\nWhen NOT to use: Do not use this fix if you require pooling parameters to be passed to create_engine().\n\n

Why This Fix Works in Production

  • Trigger: OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user 'airflow'@'10.x.x.xxx' (using password: YES)")
  • Mechanism: The create_engine() function was ignoring MySQL SSL parameters due to filtering of kwargs
  • Why the fix works: Fixes issue #6019 by allowing the use of MySQL SSL parameters in the create_engine() function. (first fixed release: 4.4.2).
Production impact:
  • If left unfixed, the same config can fail only in production (env differences), causing startup failures or partial feature outages.

Why This Breaks in Prod

  • Shows up under Python 2.7 in real deployments (not just unit tests).
  • The create_engine() function was ignoring MySQL SSL parameters due to filtering of kwargs
  • Surfaces as: OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user 'airflow'@'10.x.x.xxx' (using password: YES)")

Proof / Evidence

  • GitHub issue: #6019
  • Fix PR: https://github.com/celery/celery/pull/6020
  • First fixed release: 4.4.2
  • Reproduced locally: No (not executed)
  • Last verified: 2026-02-09
  • Confidence: 0.75
  • Did this fix it?: Yes (upstream fix exists)
  • Own content ratio: 0.47

Discussion

High-signal excerpts from the issue thread (symptoms, repros, edge-cases).

“I am working on a PR for the line I proposed to change.”
@alexagriffith · 2020-04-01 · source
“Finished creating the PR. https://github.com/celery/celery/pull/6020”
@alexagriffith · 2020-04-01 · source

Failure Signature (Search String)

  • OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user 'airflow'@'10.x.x.xxx' (using password: YES)")

Error Message

Stack trace
error.txt
Error Message ------------- OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user 'airflow'@'10.x.x.xxx' (using password: YES)")
Stack trace
error.txt
Error Message ------------- from airflow.models import DagRun from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker e = create_engine({AIRFLOW__CELERY__SQL_ALCHEMY_CONN},connect_args= {'ssl': {'ca': '/path-to-mysql-sslcert/server-ca', 'cert': '/path-to-mysql-sslcert/client-cert', 'key': '/path-to-mysql-sslcert/client-key'}}) s = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=e)) s.query(DagRun).all()
Stack trace
error.txt
Error Message ------------- sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user 'airflow'@'10.xx.xx.xxx' (using password: YES)") (Background on this error at: http://sqlalche.me/e/e3q8)

Minimal Reproduction

repro.py
from airflow.models import DagRun from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker e = create_engine({AIRFLOW__CELERY__SQL_ALCHEMY_CONN},connect_args= {'ssl': {'ca': '/path-to-mysql-sslcert/server-ca', 'cert': '/path-to-mysql-sslcert/client-cert', 'key': '/path-to-mysql-sslcert/client-key'}}) s = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=e)) s.query(DagRun).all()

Environment

  • Python: 2.7

What Broke

Users were unable to connect to MySQL with SSL parameters, causing connection failures.

Why It Broke

The create_engine() function was ignoring MySQL SSL parameters due to filtering of kwargs

Fix Options (Details)

Option A — Upgrade to fixed release Safe default (recommended)

pip install celery==4.4.2

When NOT to use: Do not use this fix if you require pooling parameters to be passed to create_engine().

Use when you can deploy the upstream fix. It is usually lower-risk than long-lived workarounds.

Fix reference: https://github.com/celery/celery/pull/6020

First fixed release: 4.4.2

Last verified: 2026-02-09. Validate in your environment.

Get updates

We publish verified fixes weekly. No spam.

Subscribe

When NOT to Use This Fix

  • Do not use this fix if you require pooling parameters to be passed to create_engine().

Verify Fix

verify
Re-run the minimal reproduction on your broken version, then apply the fix and re-run.

Did This Fix Work in Your Case?

Quick signal helps us prioritize which fixes to verify and improve.

Prevention

  • Capture the exact failing error string in logs and tests so you can reproduce via a minimal script.
  • Pin production dependencies and upgrade only with a reproducible test that hits the failing path.

Version Compatibility Table

VersionStatus
4.4.2 Fixed

Related Issues

No related fixes found.

Sources

We don’t republish the full GitHub discussion text. Use the links above for context.