diff --git a/.gitlab/ci/database.gitlab-ci.yml b/.gitlab/ci/database.gitlab-ci.yml
index 39065d1c9db1eaa7c55896511744a37a18e70154..7806cc15b183796dd5804067cc350cea78c935c4 100644
--- a/.gitlab/ci/database.gitlab-ci.yml
+++ b/.gitlab/ci/database.gitlab-ci.yml
@@ -1,6 +1,21 @@
 include:
   - local: .gitlab/ci/rails/shared.gitlab-ci.yml
 
+db:setup pg14:
+  stage: prepare
+  needs: []
+  extends:
+    - .use-pg14
+    - .default-before_script
+    - .ruby-cache
+    - .rails:rules:setup-test-env
+  script:
+    - source scripts/utils.sh
+    - run_timed_command "pg_dumpall -h postgres -U postgres > pg_dumpall.sql"
+  artifacts:
+    paths:
+      - pg_dumpall.sql
+
 db:rollback single-db-ci-connection:
   extends:
     - db:rollback
diff --git a/.gitlab/ci/rails/shared.gitlab-ci.yml b/.gitlab/ci/rails/shared.gitlab-ci.yml
index b7cb464675fb562cae9e40cf90fd0a9e374f3506..ddbbbac9b00e3a8bbbf6f2632c48448c33646f68 100644
--- a/.gitlab/ci/rails/shared.gitlab-ci.yml
+++ b/.gitlab/ci/rails/shared.gitlab-ci.yml
@@ -210,6 +210,10 @@ include:
     - !reference [.rspec-base, after_script]
 
 .rspec-base-pg14:
+  needs:
+    - !reference [.rspec-base, needs]
+    - job: "db:setup pg14"
+      optional: true
   extends:
     - .rspec-base
     - .use-pg14
diff --git a/scripts/utils.sh b/scripts/utils.sh
index e93fdb96b4db0a23cd4436a62dcaaeb60daf625e..d8b2ff466dd0f93957b319b4797c9e0332b537f0 100644
--- a/scripts/utils.sh
+++ b/scripts/utils.sh
@@ -198,6 +198,16 @@ function setup_db_praefect() {
 function setup_db() {
   section_start "setup-db" "Setting up DBs"
 
+  if [ -f pg_dumpall.sql ]; then
+    echo "Found pg_dumpall.sql, applying!"
+
+    psql -h postgres -U postgres -q < pg_dumpall.sql > /dev/null
+    rm pg_dumpall.sql
+
+    section_end "setup-db"
+    return 0
+  fi
+
   setup_db_user_only
   run_timed_command_with_metric "bundle exec rake db:drop db:create db:schema:load db:migrate gitlab:db:lock_writes" "setup_db"
   setup_db_praefect