108 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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
 |