Commands for dumping data to an H2 file from app database.

Run this as follows (h2 filename is optional):

clojure -M:run dump-to-h2 '/path/to/metabase.db/'

or

java --add-opens java.base/java.nio=ALL-UNNAMED -jar metabase.jar dump-to-h2

Validate with:

clojure -M:run load-from-h2 '"/path/to/metabase.db"'

(ns metabase.cmd.dump-to-h2
  (:require
   [clojure.java.jdbc :as jdbc]
   [metabase.cmd.copy :as copy]
   [metabase.cmd.copy.h2 :as copy.h2]
   [metabase.cmd.rotate-encryption-key :as rotate-encryption]
   [metabase.db :as mdb]
   [metabase.util.log :as log]))
(set! *warn-on-reflection* true)

Transfer data from existing database specified by connection string to the H2 DB specified by env vars. Intended as a tool for migrating from one instance to another using H2 as serialization target.

Defaults to using [[metabase.db.env/db-file]] as the connection string.

Target H2 DB will be deleted if it exists, unless keep-existing? is truthy.

(defn dump-to-h2!
  ([h2-filename]
   (dump-to-h2! h2-filename nil))
  ([h2-filename {:keys [keep-existing? dump-plaintext?]
                 :or   {keep-existing? false dump-plaintext? false}}]
   (let [h2-filename    (or h2-filename "metabase_dump.h2")
         h2-data-source (copy.h2/h2-data-source h2-filename)]
     (log/infof "Dumping from configured Metabase db to H2 file %s" h2-filename)
     (when-not keep-existing?
       (copy.h2/delete-existing-h2-database-files! h2-filename))
     (copy/copy! (mdb/db-type) (mdb/data-source) :h2 h2-data-source)
     (when dump-plaintext?
       (mdb/with-application-db (mdb/application-db :h2 h2-data-source)
         (rotate-encryption/rotate-encryption-key! nil)))
     ;; Flush h2 to disk
     (jdbc/execute! {:datasource h2-data-source} "CHECKPOINT SYNC"))))