Skip to content
Snippets Groups Projects
configuring-application-database.md 7.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • title: Configuring the Metabase application database
    
    redirect_from:
      - /docs/latest/operations-guide/configuring-application-database
    
    # Configuring the Metabase application database
    
    
    The application database is where Metabase stores information about users, saved questions, dashboards, and any other
    data needed to run the application. The default settings use an embedded H2 database, but this is configurable.
    
    
    ## Notes
    
    - Using Metabase with an H2 application database is not recommended for production deployments. For production
    
      deployments, we highly recommend using PostgreSQL. If you decide to continue to use H2, please be sure to back up the database file regularly.
    
    - You cannot change the application database while the application is running. Connection configuration information is
      read only once when the application starts up and will remain constant throughout the running of the application.
    
    - Metabase provides limited support for migrating from H2 to Postgres if you decide to upgrade to a more
      production-ready database. See [Migrating from H2 to PostgreSQL](migrating-from-h2.md) for more details.
    
    ## [H2](https://www.h2database.com/) (default)
    
    > **For production installations of Metabase we recommend that people [replace the H2 database with PostgreSQL](./migrating-from-h2.md)**. Postgres offers a greater degree of performance and reliability when Metabase is running with many users.
    
    To use the H2 database for your Metabase instance you don't need to do anything at all. When the application is first launched it will attempt to create a new H2 database in the same filesystem location the application is launched from.
    
    
    You can see these database files from the terminal:
    
        ls metabase.*
    
    You should see the following files:
    
        metabase.db.h2.db  # Or metabase.db.mv.db depending on when you first started using Metabase.
        metabase.db.trace.db
    
    
    If for any reason you want to use an H2 database file in a separate location from where you launch Metabase you can do so using an environment variable. For example:
    
    
        export MB_DB_TYPE=h2
        export MB_DB_FILE=/the/path/to/my/h2.db
        java -jar metabase.jar
    
    
    Bryan Ricker's avatar
    Bryan Ricker committed
    Note that H2 automatically appends `.mv.db` or `.h2.db` to the path you specify; do not include those in your path! In other words, `MB_DB_FILE` should be something like `/path/to/metabase.db`, rather than something like `/path/to/metabase.db.mv.db` (even though this is the file that actually gets created).
    
    ## [Postgres](https://www.postgresql.org/)
    
    
    You can change the application database to use Postgres using a few simple environment variables. For example:
    
        export MB_DB_TYPE=postgres
        export MB_DB_DBNAME=metabase
        export MB_DB_PORT=5432
        export MB_DB_USER=<username>
        export MB_DB_PASS=<password>
        export MB_DB_HOST=localhost
        java -jar metabase.jar
    
    
    Metabase will not create this database for you. Example command to create the database:
    
    
    This will tell Metabase to look for its application database using the supplied Postgres connection information.
    Metabase also supports providing a full JDBC connection string if you have additional parameters:
    
        export MB_DB_CONNECTION_URI="jdbc:postgresql://localhost:5432/metabase?user=<username>&password=<password>"
        java -jar metabase.jar
    
    `MB_DB_CONNECTION_URI` can also be used in combination with `MB_DB_USER` and/or `MB_DB_PASS` if you want to pass one
    or both separately from the rest of the JDBC connection string (useful if the password contains special characters):
    
        export MB_DB_CONNECTION_URI="jdbc:postgresql://localhost:5432/metabase"
        export MB_DB_USER=<username>
        export MB_DB_PASS=<password>
    
        java -jar metabase.jar
    
    
    ## Upgrading from a Metabase version pre-0.38
    
    If you’re upgrading from a previous version of Metabase, note that for Metabase 0.38 we've removed the use of the PostgreSQL `NonValidatingFactory` for SSL validation. It’s possible that you could experience a failure either at startup (if you're using a PostgreSQL application database) or when querying a PostgreSQL data warehouse.
    
    
    You can resolve this failure in one of two ways:
    
    1. Configuring the PostgreSQL connection to use SSL certificate validation,
    2. Or manually enabling the `NonValidatingFactory`. WARNING: this method is insecure. We're including it here only to assist in troubleshooting, or for situations in which security is not a priority.
    
    How you configure your connection depends on whether you're using Postgres as Metabase's application database or as a data warehouse connected to Metabase:
    
    **For Postgres application databases**:
    
    To use SSL certificate validation, you'll need to use the `MB_DB_CONNECTION_URI` method to configure your database connection. Here's an example:
    
    ```
    export MB_DB_CONNECTION_URI="postgres://localhost:5432/metabase?user=<username>&password=<password>&sslmode=verify-ca&sslrootcert=<path to CA root or intermediate root certificate>"
    ```
    
    If you cannot enable certificate validation, you can enable the `NonValidatingFactory` for your application database via the same environment variable as above:
    
    ```
    export MB_DB_CONNECTION_URI="postgres://localhost:5432/metabase?user=<username>&password=<password>&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory"
    ```
    
    **For Postgres data warehouse databases**
    
    
    You can do the same inside the Metabase Admin page for the connection to your Postgres database. Add the following to the end of your JDBC connection string for your database:
    
    
    ```
    &sslmode=verify-ca&sslrootcert=<path to CA root or intermediate root certificate>
    ```
    
    If that does not work, you can enable `NonValidatingFactory` by adding the following to the end of your connection URI for your database:
    
    ```
    &ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
    ```
    
    
    For more options to further tune the SSL connection parameters,
    
    see the [PostgreSQL SSL client documentation](https://jdbc.postgresql.org/documentation/ssl/#configuring-the-client).
    
    ## [MySQL](https://www.mysql.com/) or [MariaDB](https://www.mariadb.org/)
    
    We recommend PostgreSQL, but you can also use MySQL or MariaDB. The minimum recommended version is MySQL 8.0.17 or MariaDB
    
    10.2.2, and the `utf8mb4` character set is required. You can change the application database to use MySQL using
    environment variables like this:
    
    
        export MB_DB_TYPE=mysql
        export MB_DB_DBNAME=metabase
        export MB_DB_PORT=3306
        export MB_DB_USER=<username>
        export MB_DB_PASS=<password>
        export MB_DB_HOST=localhost
        java -jar metabase.jar
    
    
    Metabase will not create this database for you. Example SQL statement to create the database:
    
        CREATE DATABASE metabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
    This will tell Metabase to look for its application database using the supplied MySQL connection information. Metabase
    also supports providing a full JDBC connection string if you have additional parameters:
    
        export MB_DB_CONNECTION_URI="jdbc:mysql://localhost:3306/metabase?user=<username>&password=<password>"
        java -jar metabase.jar
    
    As with Postgres, `MB_DB_CONNECTION_URI` can also be used in combination with `MB_DB_USER` and/or `MB_DB_PASS` if you
    want to pass one or both separately from the rest of the JDBC connection string:
    
        export MB_DB_CONNECTION_URI="jdbc:mysql://localhost:5432/metabase"
        export MB_DB_USER=<username>
        export MB_DB_PASS=<password>
    
        java -jar metabase.jar