Scripts to locally clone a remote Postgres DB, through an SSH tunnel.
https://spin.atomicobject.com/2020/11/10/scripts-to-clone-prod-data-locally/
Scripts to locally clone a remote Postgres DB, through an SSH tunnel.
https://spin.atomicobject.com/2020/11/10/scripts-to-clone-prod-data-locally/
#! /usr/bin/env bash | |
if [[ -z "${DB_PASSWORD}" ]]; then | |
echo "Please set a DB_PASSWORD environment variable in order to connect to the RDS Database." | |
echo "You may be able to retrieve it with:" | |
echo " aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:xx:xx:xx:xx" | |
exit 1 | |
fi | |
if [[ -z "${DB_SSH_KEY}" ]]; then | |
echo "Please set an DB_SSH_KEY environment variable to the path to the db-ssh-key.pem file. (you can find it in the team password manager)" | |
exit 1 | |
fi | |
export PGPASSWORD=$DB_PASSWORD | |
export PGUSER=pguser | |
export PGDATABASE=project-db | |
db_host=project-db-dev.xx.xx.rds.amazonaws.com | |
ssh_host=xx.xx.compute.amazonaws.com | |
ssh_user=ec2-user | |
db_port=5432 | |
date=$(date '+%Y-%m-%d.%H-%M-%S') | |
filename=$date.dev.dump.sql | |
#### Establish SSH Tunnel | |
ssh -f -o ExitOnForwardFailure=yes -L localhost:5433:"$db_host":$db_port $ssh_user@"$ssh_host" -i "$DB_SSH_KEY" sleep 10 | |
#### Dump DB | |
# The `--no-privileges` option is important to avoid an error upon restore like: | |
# psql:2020-10-27.22-50-38.dev.dump.sql:575: ERROR: role "rdsadmin" does not exist | |
# | |
# ( https://www.postgresql.org/docs/12/app-pgdump.html#PG-DUMP-OPTIONS ) | |
pg_dump --no-privileges -h localhost -p 5433 --file "$filename" |
#! /usr/bin/env bash | |
if [ "$#" -ne 1 ]; then | |
echo "Usage:" | |
echo "./load-dump.sh backup.sql" | |
exit 1 | |
fi | |
DUMP_FILE=$1 | |
export PGHOST=localhost | |
export PGPORT=5432 | |
export PGUSER=root | |
export PGPASSWORD=password | |
DATABASE_NAME=my-project-dev | |
#### Terminate Connections | |
# This avoids errors like: | |
# ERROR: database "my-project-dev" is being accessed by other users | |
# DETAIL: There is 1 other session using the database.`) | |
psql -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '${DATABASE_NAME}' AND pid <> pg_backend_pid();" | |
#### Drop / Recreate | |
psql -c "DROP DATABASE IF EXISTS \"${DATABASE_NAME}\"" | |
echo "SELECT 'CREATE DATABASE \"${DATABASE_NAME}\"' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${DATABASE_NAME}')\gexec" | psql | |
#### Load from dump | |
psql -f "$DUMP_FILE" "$DATABASE_NAME" |