Files
Ansible-Build/roles/postgres/files/docker-postgres-duplicate
T

80 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
set -e
SCRIPT=$(basename "$0")
VERSION="1.0.0"
# Display Help
Help() {
echo
echo "$SCRIPT"
echo
echo "Description: Duplicate database in Postgres Docker container."
echo "Syntax: $SCRIPT [-c|-s|-t|-r|-u|-V|help]"
echo "Example: $SCRIPT -c postgres01 -s keycloak-main -t keycloak-int -r -u"
echo "options:"
echo " -c Docker container."
echo " -s Source database name."
echo " -t Target database name."
echo " -r Replace existing database."
echo " -V Show $SCRIPT version."
echo " help Show $SCRIPT manual."
echo
}
# Show help and exit
if [[ "$1" == "help" ]]; then
Help
exit
fi
# Initialise option flag with a false value
REPLACE='false'
# Process params
while getopts ":c: :s: :t: :r :V" opt; do
case $opt in
c) CONTAINER="$OPTARG";;
s) SOURCE_DATABASE="$OPTARG";;
t) TARGET_DATABASE="$OPTARG";;
r) REPLACE='true';;
V) echo "$SCRIPT version $VERSION"
exit 0
;;
\?) echo "Invalid option -$OPTARG" >&2
Help
exit;;
esac
done
# Verify variables
[[ -z "$CONTAINER" ]] && { echo "Parameter -c|container is empty" ; exit 1; }
[[ -z "$SOURCE_DATABASE" ]] && { echo "Parameter -s|source is empty" ; exit 1; }
[[ -z "$TARGET_DATABASE" ]] && { echo "Parameter -t|target is empty" ; exit 1; }
[[ "$TARGET_DATABASE" == "$SOURCE_DATABASE" ]] && { echo "Parameter -s|source and -t|target cannot be the same" ; exit 1; }
# Switch container name with id
CONTAINER_ID=$(docker ps -f "name=${CONTAINER}$" -q | tail -n1)
[[ -z "$CONTAINER_ID" ]] && { echo "Container id for $CONTAINER not found." ; exit 1; }
# Set alias
docker_exec_bash="docker exec $CONTAINER_ID /bin/bash -c"
docker_exec_root_bash="docker exec --user root $CONTAINER_ID /bin/bash -c"
# Clear database
if $REPLACE; then
docker-postgres-drop -c "$CONTAINER" -d "$TARGET_DATABASE"
fi
# Kill datbase connections
echo "Kill database connections on $SOURCE_DATABASE."
QUERY="SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$SOURCE_DATABASE';"
$docker_exec_bash "psql postgres://\$POSTGRES_USER:\$POSTGRES_PASSWORD@\$HOSTNAME:5432/postgres -c \"$QUERY\""
# Duplicate database
echo "Duplicate database from $SOURCE_DATABASE to $TARGET_DATABASE."
$docker_exec_bash "createdb -U \$POSTGRES_USER -T $SOURCE_DATABASE $TARGET_DATABASE"
# Notify if backup has finished
echo "The duplication for Postgres database $TARGET_DATABASE has finished."