Airflow was built to interact with its metadata using SqlAlchemy.
The document below describes the database engine configurations, the necessary changes to their configuration to be used with Airflow, as well as changes to the Airflow configurations to connect to these databases.
1. Choosing database backend
If you want to take a real test drive of Airflow, you should consider setting up a database backend to MySQL and PostgresSQL. By default, Airflow uses SQLite, which is intended for development purposes only.
Airflow supports the following database engine versions, so make sure which version you have. Old versions may not support all SQL statements.
- PostgreSQL: 9.6, 10, 11, 12, 13
- MySQL: 5.7, 8
- SQLite: 3.15.0+
If you plan on running more than one scheduler, you have to meet additional requirements. For details, see Scheduler HA Database Requirements.
2. Database URI
Airflow uses SQLAlchemy to connect to the database, which requires you to configure the Database URL. You can do this in option sql_alchemy_conn
in section [core]
. It is also common to configure this option with AIRFLOW__CORE__SQL_ALCHEMY_CONN
environment variable.
:::tips 🔖 Note: ::: :::info For more information on setting the configuration, see Setting Configuration Options. :::
If you want to check the current value, you can use airflow config get-value core sql_alchemy_conn
command as in the example below.
$ airflow config get-value core sql_alchemy_conn
sqlite:////tmp/airflow/airflow.db
The exact format description is described in the SQLAlchemy documentation, see Database Urls. We will also show you some examples below.
3. Setting up a SQLite Database
SQLite database can be used to run Airflow for development purpose as it does not require any database server (the database is stored in a local file). There are a few limitations of using the SQLite database (for example it only works with Sequential Executor) and it should NEVER be used for production.
There is a minimum version of sqlite3 required to run Airflow 2.0+ - minimum version is 3.15.0. Some of the older systems have an earlier version of sqlite installed by default and for those system you need to manually upgrade SQLite to use version newer than 3.15.0. Note, that this is not a python library
version, it’s the SQLite system-level application that needs to be upgraded. There are different ways how SQLite might be installed, you can find some information about that at the official website of SQLite and in the documentation specific to distribution of your Operating System.
Troubleshooting Sometimes even if you upgrade SQLite to higher version and your local python reports higher version, the python interpreter used by Airflow might still use the older version available in the
LD_LIBRARY_PATH
set for the python interpreter that is used to start Airflow.
You can make sure which version is used by the interpreter by running this check:
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.27.2'
But be aware that setting environment variables for your Airflow deployment might change which SQLite library is found first, so you might want to make sure that the “high-enough” version of SQLite is the only version installed in your system.
An example URI for the sqlite database:
sqlite:////home/airflow/airflow.db
4. Setting up a MySQL Database
You need to create a database and a database user that Airflow will use to access this database. In the example below, a database airflow_db
and user with username airflow_user
with password airflow_pass
will be created
CREATE DATABASE airflow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'airflow' IDENTIFIED BY 'airflow';
GRANT ALL PRIVILEGES ON airflow.* TO 'airflow';
:::tips 🔖 Note: ::: :::info The database must use a UTF-8 character set :::
We rely on more strict ANSI SQL settings for MySQL in order to have sane defaults. Make sure to have specified explicit_defaults_for_timestamp=1
option under [mysqld]
section in your my.cnf
file. You can also activate these options with the --explicit-defaults-for-timestamp
switch passed to mysqld
executable
We recommend using the mysqlclient
driver and specifying it in your SqlAlchemy connection string.
# mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
mysql+mysqldb://airflow:airflow@localhost:3306/airflow
But we also support the mysql-connector-python
driver, which lets you connect through SSL without any cert options provided.
# mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
mysql+mysqlconnector://airflow:airflow@localhost:3306/airflow
However if you want to use other drivers visit the MySQL Dialect in SQLAlchemy documentation for more information regarding download and setup of the SqlAlchemy connection.
In addition, you also should pay particular attention to MySQL’s encoding. Although the utf8mb4
character set is more and more popular for MySQL (actually, utf8mb4
becomes default character set in MySQL8.0), using the utf8mb4
encoding requires additional setting in Airflow 2+ (See more details in #7570.). If you use utf8mb4
as character set, you should also set sql_engine_collation_for_ids=utf8mb3_general_ci
.
5. Setting up a PostgreSQL Database
You need to create a database and a database user that Airflow will use to access this database. In the example below, a database airflow_db
and user with username airflow_user
with password airflow_pass
will be created
CREATE DATABASE airflow;
CREATE USER airflow WITH PASSWORD 'airflow';
GRANT ALL PRIVILEGES ON DATABASE airflow TO airflow;
:::tips 🔖 Note: ::: :::info The database must use a UTF-8 character set :::
You may need to update your Postgres pg_hba.conf
to add the airflow
user to the database access control list; and to reload the database configuration to load your change. See The pg_hba.conf File in the Postgres documentation to learn more.
We recommend using the psycopg2
driver and specifying it in your SqlAlchemy connection string.
# postgresql+psycopg2://<user>:<password>@<host>/<db>
postgresql+psycopg2://airflow:airflow@localhost/airflow
Also note that since SqlAlchemy does not expose a way to target a specific schema in the database URI, you may want to set a default schema for your role with a SQL statement similar to:
ALTER ROLE username SET search_path = airflow, foobar;
For more information regarding setup of the PostgresSQL connection, see PostgreSQL dialect in SQLAlchemy documentation.
6. Other configuration options
There are more configuration options for configuring SQLAlchemy behavior. For details, see reference documentation for sqlalchemy_*
option in [core]
section.
7. Initialize the database
After configuring the database and connecting to it in Airflow configuration, you should create the database schema.
$ airflow db init
8. What’s next?
By default, Airflow uses SequentialExecutor
, which does not provide parallelism. You should consider configuring a different executor for better performance.