80 lines
2.4 KiB
Bash
Executable File
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."
|