ansible-role-mariadb-debian/files/mariadb_dump_db.sh

108 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset
set -o posix
err() {
echo >&2 "[$(date +'%Y-%m-%dT%H:%M:%S%z')] ERROR: $*"
}
echo_date() {
echo -e "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*"
}
usage() {
cat >&2 <<-EOF
Usage : $0 -d <directory> -l <db_name>
-d dump directory destination (mandatory)
-l list of db to dump (coma separated, mandatory)
-k dumps to keep (in days)
-h help
EOF
}
typeset VAR_DIR_ARGS=""
typeset VAR_DB_LIST_ARGS=""
typeset VAR_ROTATION_DAYS_ARGS=""
while getopts "d:l:k:h" OPTION; do
case $OPTION in
d)
VAR_DIR_ARGS="$OPTARG"
;;
l)
VAR_DB_LIST_ARGS="$OPTARG"
;;
k)
VAR_ROTATION_DAYS_ARGS="$OPTARG"
;;
h)
usage
exit 0
;;
*)
usage
exit 1
;;
esac
done
[[ $VAR_DIR_ARGS != "" ]] || {
usage
exit 1
}
[[ $VAR_DB_LIST_ARGS != "" ]] || {
usage
exit 1
}
# remove eventual trailing slash
typeset -r VAR_DUMPS_DST_DIR=${VAR_DIR_ARGS%/}
if [[ ! -d $VAR_DUMPS_DST_DIR ]]; then
mkdir -p "$VAR_DUMPS_DST_DIR" || {
err "mkdir -p $VAR_DUMPS_DST_DIR"
exit 1
}
fi
for cmd in mysqldump gzip; do
command -v "$cmd" >/dev/null || {
err "$cmd command not found"
exit 1
}
done
for db in ${VAR_DB_LIST_ARGS//,/ }; do
echo_date "start $db dump."
typeset DUMP_FILE=$VAR_DUMPS_DST_DIR/$db.$(date +%F_%H%M%S).sql
mysqldump --single-transaction --quick --routines "$db" >"$DUMP_FILE"
# shellcheck disable=SC2181
if (($? != 0)); then
err "unable do dump $db"
exit 1
fi
echo_date "done.\n"
done
for sql in "$VAR_DUMPS_DST_DIR/"*.sql; do
echo_date "compress $sql."
gzip -- "$sql" || {
err "gzip $sql"
exit 1
}
echo_date "done.\n"
done
if [[ -n $VAR_ROTATION_DAYS_ARGS ]]; then
# rotation
echo "Rotation of old dumps (-${VAR_ROTATION_DAYS_ARGS}d)"
if ! find "$VAR_DUMPS_DST_DIR" -name "*.sql.gz" -type f -mtime +"$((VAR_ROTATION_DAYS_ARGS - 1))" -exec /bin/rm -vf {} \;; then
err "clean old dumps"
exit 1
fi
echo -e "done.\n"
fi