title: apache airflow: initdb vs resetdb
body: <p>What precisely is the difference between the "airflow initdb" command and the "airflow resetdb" command?</p>
  
  <p>Is it really necessary to have 2 different commands?</p>
  
  <p>When is it appropriate to use one vs the other?</p>
  
  <p>The <a href="https://readthedocs.org/projects/andrewmchen-incubator-airflow/downloads/pdf/latest/" rel="noreferrer">doc</a> says ...</p>
  
  <blockquote>
    <p><strong>airflow initdb</strong>: Initialize the metadata database</p>
    
    <p><strong>airflow resetdb</strong>: Burn down and rebuild the metadata database</p>
  </blockquote>
  
  <p>This doesn't tell me much.</p>
  
  <p>My best guess is that </p>
  
  <blockquote>
    <p><strong>airflow initdb</strong> is to be used only the first time that the database is created from the airflow.cfg<br>
    <strong>airflow resetdb</strong> is to be used if any changes to that configuration are required.</p>
  </blockquote>
  
  <p>When I run them, neither changes the timestamp on the sqlite database but resetdb seems to be much noisier.</p>
  
  <p><strong>airflow initdb</strong>:</p>
  
  <pre><code>(.sandbox) [airflow@localhost airflow]$ airflow initdb
  [2020-01-01 21:49:21,603] {settings.py:252} INFO - settings.configure_orm(): Using pool settings. pool_size=5, max_overflow=10, pool_recycle=1800, pid=24917
  DB: postgresql+psycopg2://airflow@localhost:5432/airflow_mdb
  [2020-01-01 21:49:22,257] {db.py:368} INFO - Creating tables
  INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
  INFO  [alembic.runtime.migration] Will assume transactional DDL.
  Done.
  </code></pre>
  
  <p><strong>airflow resetdb</strong>:</p>
  
  <pre><code>(.sandbox) [airflow@localhost airflow]$ airflow resetdb
  [2020-01-01 21:49:46,579] {settings.py:252} INFO - settings.configure_orm(): Using pool settings. pool_size=5, max_overflow=10, pool_recycle=1800, pid=25045
  DB: postgresql+psycopg2://airflow@localhost:5432/airflow_mdb
  This will drop existing tables if they exist. Proceed? (y/n)y
  [2020-01-01 21:49:49,984] {db.py:389} INFO - Dropping tables that exist
  [2020-01-01 21:49:50,062] {migration.py:154} INFO - Context impl PostgresqlImpl.
  [2020-01-01 21:49:50,063] {migration.py:161} INFO - Will assume transactional DDL.
  [2020-01-01 21:49:50,070] {db.py:368} INFO - Creating tables
  INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
  INFO  [alembic.runtime.migration] Will assume transactional DDL.
  INFO  [alembic.runtime.migration] Running upgrade  -&gt; e3a246e0dc1, current schema
  INFO  [alembic.runtime.migration] Running upgrade e3a246e0dc1 -&gt; 1507a7289a2f, create is_encrypted
  INFO  [alembic.runtime.migration] Running upgrade 1507a7289a2f -&gt; 13eb55f81627, maintain history for compatibility with earlier migrations
  INFO  [alembic.runtime.migration] Running upgrade 13eb55f81627 -&gt; 338e90f54d61, More logging into task_instance
  INFO  [alembic.runtime.migration] Running upgrade 338e90f54d61 -&gt; 52d714495f0, job_id indices
  INFO  [alembic.runtime.migration] Running upgrade 52d714495f0 -&gt; 502898887f84, Adding extra to Log
  INFO  [alembic.runtime.migration] Running upgrade 502898887f84 -&gt; 1b38cef5b76e, add dagrun
  INFO  [alembic.runtime.migration] Running upgrade 1b38cef5b76e -&gt; 2e541a1dcfed, task_duration
  INFO  [alembic.runtime.migration] Running upgrade 2e541a1dcfed -&gt; 40e67319e3a9, dagrun_config
  INFO  [alembic.runtime.migration] Running upgrade 40e67319e3a9 -&gt; 561833c1c74b, add password column to user
  INFO  [alembic.runtime.migration] Running upgrade 561833c1c74b -&gt; 4446e08588, dagrun start end
  INFO  [alembic.runtime.migration] Running upgrade 4446e08588 -&gt; bbc73705a13e, Add notification_sent column to sla_miss
  INFO  [alembic.runtime.migration] Running upgrade bbc73705a13e -&gt; bba5a7cfc896, Add a column to track the encryption state of the 'Extra' field in connection
  INFO  [alembic.runtime.migration] Running upgrade bba5a7cfc896 -&gt; 1968acfc09e3, add is_encrypted column to variable table
  INFO  [alembic.runtime.migration] Running upgrade 1968acfc09e3 -&gt; 2e82aab8ef20, rename user table
  INFO  [alembic.runtime.migration] Running upgrade 2e82aab8ef20 -&gt; 211e584da130, add TI state index
  INFO  [alembic.runtime.migration] Running upgrade 211e584da130 -&gt; 64de9cddf6c9, add task fails journal table
  INFO  [alembic.runtime.migration] Running upgrade 64de9cddf6c9 -&gt; f2ca10b85618, add dag_stats table
  INFO  [alembic.runtime.migration] Running upgrade f2ca10b85618 -&gt; 4addfa1236f1, Add fractional seconds to mysql tables
  INFO  [alembic.runtime.migration] Running upgrade 4addfa1236f1 -&gt; 8504051e801b, xcom dag task indices
  INFO  [alembic.runtime.migration] Running upgrade 8504051e801b -&gt; 5e7d17757c7a, add pid field to TaskInstance
  INFO  [alembic.runtime.migration] Running upgrade 5e7d17757c7a -&gt; 127d2bf2dfa7, Add dag_id/state index on dag_run table
  INFO  [alembic.runtime.migration] Running upgrade 127d2bf2dfa7 -&gt; cc1e65623dc7, add max tries column to task instance
  INFO  [alembic.runtime.migration] Running upgrade cc1e65623dc7 -&gt; bdaa763e6c56, Make xcom value column a large binary
  INFO  [alembic.runtime.migration] Running upgrade bdaa763e6c56 -&gt; 947454bf1dff, add ti job_id index
  INFO  [alembic.runtime.migration] Running upgrade 947454bf1dff -&gt; d2ae31099d61, Increase text size for MySQL (not relevant for other DBs' text types)
  INFO  [alembic.runtime.migration] Running upgrade d2ae31099d61 -&gt; 0e2a74e0fc9f, Add time zone awareness
  INFO  [alembic.runtime.migration] Running upgrade d2ae31099d61 -&gt; 33ae817a1ff4, kubernetes_resource_checkpointing
  INFO  [alembic.runtime.migration] Running upgrade 33ae817a1ff4 -&gt; 27c6a30d7c24, kubernetes_resource_checkpointing
  INFO  [alembic.runtime.migration] Running upgrade 27c6a30d7c24 -&gt; 86770d1215c0, add kubernetes scheduler uniqueness
  INFO  [alembic.runtime.migration] Running upgrade 86770d1215c0, 0e2a74e0fc9f -&gt; 05f30312d566, merge heads
  INFO  [alembic.runtime.migration] Running upgrade 05f30312d566 -&gt; f23433877c24, fix mysql not null constraint
  INFO  [alembic.runtime.migration] Running upgrade f23433877c24 -&gt; 856955da8476, fix sqlite foreign key
  INFO  [alembic.runtime.migration] Running upgrade 856955da8476 -&gt; 9635ae0956e7, index-faskfail
  INFO  [alembic.runtime.migration] Running upgrade 9635ae0956e7 -&gt; dd25f486b8ea, add idx_log_dag
  INFO  [alembic.runtime.migration] Running upgrade dd25f486b8ea -&gt; bf00311e1990, add index to taskinstance
  INFO  [alembic.runtime.migration] Running upgrade 9635ae0956e7 -&gt; 0a2a5b66e19d, add task_reschedule table
  INFO  [alembic.runtime.migration] Running upgrade 0a2a5b66e19d, bf00311e1990 -&gt; 03bc53e68815, merge_heads_2
  INFO  [alembic.runtime.migration] Running upgrade 03bc53e68815 -&gt; 41f5f12752f8, add superuser field
  INFO  [alembic.runtime.migration] Running upgrade 41f5f12752f8 -&gt; c8ffec048a3b, add fields to dag
  INFO  [alembic.runtime.migration] Running upgrade c8ffec048a3b -&gt; dd4ecb8fbee3, Add schedule interval to dag
  INFO  [alembic.runtime.migration] Running upgrade dd4ecb8fbee3 -&gt; 939bb1e647c8, task reschedule fk on cascade delete
  INFO  [alembic.runtime.migration] Running upgrade c8ffec048a3b -&gt; a56c9515abdc, Remove dag_stat table
  INFO  [alembic.runtime.migration] Running upgrade 939bb1e647c8 -&gt; 6e96a59344a4, Make TaskInstance.pool not nullable
  INFO  [alembic.runtime.migration] Running upgrade 6e96a59344a4 -&gt; 74effc47d867, change datetime to datetime2(6) on MSSQL tables
  INFO  [alembic.runtime.migration] Running upgrade 939bb1e647c8 -&gt; 004c1210f153, increase queue name size limit
  (.sandbox) [airflow@localhost airflow]$ 
  </code></pre>
  
  <p>Of course you might move database from say sqlite to postgres.<br>
  It is unclear which is appropriate for that circumstance.<br>
  It is also unclear how the webserver and scheduler know where to look for the configuration?<br>
  Perhaps they look in airflow.cfg first to find out where the database is and then look into the database? This seems redundant.</p>