[[_migrate_db]]

== Database migration

{project_name} can automatically migrate the database schema, or you can choose to do it manually. By default the
database is automatically migrated when you start the new installation for the first time.

=== Automatic relational database migration

To perform an automatic migration, start the server connected to the desired database.
If the database schema has changed for the new version of the server, it will be migrated.

Creating an index on huge tables with millions of records can easily take a huge amount of time
and potentially cause major service disruption on upgrades.
For those cases, we added a threshold (the number of records) for automated index creation.
By default, this threshold is `300000` records.
When the number of records is higher than the threshold, the index is not created automatically,
and there will be a warning message in server logs including SQL commands which can be applied later manually.

To change the threshold, set the `index-creation-threshold` property, value for the default `connections-liquibase` provider:

[source,bash]
----
kc.[sh|bat] start --spi-connections-liquibase-default-index-creation-threshold=300000
----

=== Manual relational database migration

To enable manual upgrading of the database schema, set the `migration-strategy` property value to "manual" for the
default `connections-jpa` provider:

[source,bash]
----
kc.[sh|bat] start --spi-connections-jpa-quarkus-migration-strategy=manual
----

When you start the server with this configuration it checks if the database needs to be migrated.
The required changes are written to the `bin/keycloak-database-update.sql` SQL file that you can review and manually run against the database.

To change the path and name of the exported SQL file, set the `migration-export` property for the
default `connections-jpa` provider:

[source,bash]
----
kc.[sh|bat] start --spi-connections-jpa-quarkus-migration-export=<path>/<file.sql>
----

For further details on how to apply this file to the database, see the documentation for the relational database you're using.
After the changes have been written to the file, the server exits.

