diff --git a/concourse/pipelines/create-cloudfoundry.yml b/concourse/pipelines/create-cloudfoundry.yml
index 360f7ae58b..8be7066c9d 100644
--- a/concourse/pipelines/create-cloudfoundry.yml
+++ b/concourse/pipelines/create-cloudfoundry.yml
@@ -5281,6 +5281,9 @@ jobs:
               - -c
               - |
                 DB_PLAN="tiny-unencrypted-12"
+                if [ "${DEPLOY_ENV}" = "stg-lon" ] || [ "${DEPLOY_ENV}" = "prod" ] || [ "${DEPLOY_ENV}" = "prod-lon" ]; then
+                  DB_PLAN="small-ha-12"
+                fi
 
                 cf api "${API_ENDPOINT}"
                 cf auth "${CF_ADMIN}" "${CF_PASS}"
diff --git a/scripts/migrate-db.sh b/scripts/migrate-db.sh
new file mode 100755
index 0000000000..f2f6a822d1
--- /dev/null
+++ b/scripts/migrate-db.sh
@@ -0,0 +1,134 @@
+#!/usr/bin/env bash
+
+usage() {
+  echo "  usage: $0 -e {cf-endpoint} -o {cf-org} -s {cf-space} -n {db-name} -p {db-plan} -a {app-name} [ -h (help)]"
+}
+
+error_exit() {
+  local msg="${1:-ERROR}"
+  echo "$msg"
+  exit 1
+}
+
+while getopts ":e:o:s:n:p:a:h" opt; do
+  case $opt in
+    e) cf_endpoint="$OPTARG" ;;
+    o) cf_org="$OPTARG" ;;
+    s) cf_space="$OPTARG" ;;
+    n) source_db_name="$OPTARG" ;;
+    p) target_db_plan="$OPTARG" ;;
+    a) app_name="$OPTARG" ;;
+    h) usage && exit 1 ;;
+    \?) error_exit "ERROR: invalid option --$OPTARG" ;;
+    :) error_exit "ERROR: option --$OPTARG requires an argument" ;;
+  esac
+done
+
+if [[ -z $cf_endpoint || -z $cf_org || -z $cf_space || -z $source_db_name || -z $target_db_plan || -z $app_name ]]; then
+  usage
+  error_exit "ERROR: missing arg(s)"
+fi
+
+uuid=$(uuidgen)
+source_db_rename="$source_db_name-MIGRATION_SOURCE_DB-$uuid"
+target_db_name="$source_db_name-MIGRATION_TARGET_DB-$uuid"
+pg_dump_file="$source_db_rename.pg_dump"
+
+if [[ -f "$pg_dump_file" ]]; then
+  error_exit "ERROR: pg_dump file exists: $pg_dump_file"
+fi
+
+cf_endpoint_targeted=$(jq -r '.Target' < ~/.cf/config.json)
+if [[ "$cf_endpoint" != "$cf_endpoint_targeted" ]]; then
+  error_exit "ERROR: the currently targeted cf endpoint does not match the argument given at script invocation!"
+fi
+
+cf_org_targeted=$(jq -r '.OrganizationFields.Name' < ~/.cf/config.json)
+if [[ "$cf_org" != "$cf_org_targeted" ]]; then
+  error_exit "ERROR: the currently targeted cf org does not match the argument given at script invocation!"
+fi
+
+cf_space_targeted=$(jq -r '.SpaceFields.Name' < ~/.cf/config.json)
+if [[ "$cf_space" != "$cf_space_targeted" ]]; then
+  error_exit "ERROR: the currently targeted cf space does not match the argument given at script invocation!"
+fi
+
+if ! cf orgs >/dev/null 2>&1; then
+  error_exit "ERROR: no valid session for currently targetted cf env: $cf_endpoint"
+fi
+
+if ! cf service "$source_db_name" >/dev/null 2>&1; then
+  error_exit "ERROR: source db does not exist: $source_db_name"
+fi
+
+if cf service "$source_db_rename" >/dev/null 2>&1; then
+  error_exit "ERROR: service already exists with the migration temp name: $source_db_rename"
+fi
+
+if cf service "$target_db_name" >/dev/null 2>&1; then
+  echo "WARNING: target db already exists: $target_db_name"
+  read -r -p "Continue? (y/N): " confirm && [[ $confirm = "y" ]] || exit 1
+fi
+
+if ! cf app "$app_name" >/dev/null 2>&1; then
+  error_exit "ERROR: app does not exist: $app_name"
+fi
+
+echo "starting migration process..."
+
+echo "creating target db: $target_db_name..."
+if ! cf create-service -w postgres "$target_db_plan $target_db_name" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "stopping app: $app_name..."
+if ! cf stop "$app_name" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "renaming db: $source_db_name -> $source_db_rename..."
+if ! cf rename-service "$source_db_name" "$source_db_rename" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "unbinding: $app_name -> $source_db_rename"
+if ! cf unbind-service "$app_name" "$source_db_rename" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "starting pg_dump: $source_db_rename -> $pg_dump_file"
+if ! cf conduit "$source_db_rename" -- pg_dump --file "$pg_dump_file" --no-acl --no-owner >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "loading pg_dump data: $pg_dump_file -> $target_db_name"
+if ! cf conduit "$target_db_name" -- psql < "$pg_dump_file" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "binding $app_name -> $target_db_name"
+if ! cf bind-service "$app_name" "$target_db_name" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "renaming db: $target_db_name -> $source_db_name"
+if ! cf rename-service "$target_db_name" "$source_db_name" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "starting app: $app_name"
+if ! cf start "$app_name" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "deleting db: $source_db_rename"
+if ! cf delete-service -f "$source_db_rename" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "deleting pg_dump file: $pg_dump_file"
+if ! rm -f "$pg_dump_file" >/dev/null 2>&1; then
+  error_exit
+fi
+
+echo "done."