diff options
Diffstat (limited to 'docker')
| -rw-r--r-- | docker/mariadb/mariadb-server/backup.sh | 59 | ||||
| -rw-r--r-- | docker/mariadb/mariadb-server/backup_replica.sh | 65 |
2 files changed, 77 insertions, 47 deletions
diff --git a/docker/mariadb/mariadb-server/backup.sh b/docker/mariadb/mariadb-server/backup.sh index 30796fa4e..be63cd938 100644 --- a/docker/mariadb/mariadb-server/backup.sh +++ b/docker/mariadb/mariadb-server/backup.sh @@ -6,49 +6,66 @@ set -o pipefail # Execute a full backup backup_full() { echo "Taking a full backup" - LAST_FULL_DATE=$(date +%d-%m-%Y) + LAST_FULL_DATE=$(date +%d-%m-%Y-%s) + BACKUP_FILE="mysqlbackup-${LAST_FULL_DATE}.qp.xbc.xbs.gz" + BACKUP_PATH="$BACKUP_DIR/full-${LAST_FULL_DATE}" + mkdir -p "$BACKUP_PATH" + mariabackup \ --defaults-file=/etc/mysql/my.cnf \ --backup \ --stream=xbstream \ --history=$LAST_FULL_DATE | gzip > \ - $BACKUP_DIR/mysqlbackup-$(date +%d-%m-%Y-%s).qp.xbc.xbs.gz - echo $LAST_FULL_DATE > $BACKUP_DIR/last_full_date + "$BACKUP_PATH/$BACKUP_FILE" + + echo "$BACKUP_PATH/$BACKUP_FILE" > "$BACKUP_DIR/last_full_file" } # Execute an incremental backup backup_incremental() { echo "Taking an incremental backup" - if [ -r $BACKUP_DIR/last_full_date ]; then - LAST_FULL_DATE=$(cat $BACKUP_DIR/last_full_date) - fi - if [ -z $LAST_FULL_DATE ]; then - LAST_FULL_DATE=$(date +%d-%m-%Y) + + if [ ! -r "$BACKUP_DIR/last_full_file" ]; then + echo "Error: No full backup file found." + exit 1 fi + + FULL_BACKUP_FILE=$(cat "$BACKUP_DIR/last_full_file") + LAST_FULL_DATE=$(basename "$(dirname "$FULL_BACKUP_FILE")" | sed 's/^full-//') + NOW=$(date +%H-%M-%S-%d-%m-%Y) + INCR_DIR="$BACKUP_DIR/incr-${NOW}-since-${LAST_FULL_DATE}" + mkdir -p "$INCR_DIR" + + TMP_BASEDIR=$(mktemp -d) + echo "Decompressing full backup to temp dir: $TMP_BASEDIR" + gunzip -c "$FULL_BACKUP_FILE" | mbstream -x -C "$TMP_BASEDIR" + mariabackup \ --defaults-file=/etc/mysql/my.cnf \ --backup \ --stream=xbstream \ - --incremental-history-name=$LAST_FULL_DATE \ - --history=$LAST_FULL_DATE | gzip > \ - $BACKUP_DIR/incremental-$(date +%H)-mysqlbackup-$(date +%d-%m-%Y-%s).qp.xbc.xbs.gz + --incremental-basedir="$TMP_BASEDIR" \ + --history="incr-${NOW}" | gzip > \ + "$INCR_DIR/incremental-${NOW}-mysqlbackup-${LAST_FULL_DATE}.qp.xbc.xbs.gz" + + rm -rf "$TMP_BASEDIR" } BACKUP_DIR=/backup/ -cd $BACKUP_DIR +cd "$BACKUP_DIR" -if [ -n $BACKUP_TYPE ]; then - case $BACKUP_TYPE in +if [ -n "${BACKUP_TYPE:-}" ]; then + case "$BACKUP_TYPE" in "full") - backup_full - ;; + backup_full + ;; "incremental") - backup_incremental - ;; + backup_incremental + ;; *) - echo "Only full or incremental options are supported." - exit 1 - ;; + echo "Only full or incremental options are supported." + exit 1 + ;; esac else echo "You need to specify either full or incremental backup options." diff --git a/docker/mariadb/mariadb-server/backup_replica.sh b/docker/mariadb/mariadb-server/backup_replica.sh index 7f86a18a7..ebdcbf6b0 100644 --- a/docker/mariadb/mariadb-server/backup_replica.sh +++ b/docker/mariadb/mariadb-server/backup_replica.sh @@ -23,35 +23,48 @@ cd "${BACKUP_DIR}" backup_full() { echo "Taking a full backup" LAST_FULL_DATE=$(date +%d-%m-%Y-%s) + BACKUP_FILE="backup-full-${LAST_FULL_DATE}.mbs.gz" + BACKUP_PATH="${BACKUP_DIR}/full-${LAST_FULL_DATE}" + mkdir -p "${BACKUP_PATH}" + mariabackup \ --defaults-file="${REPLICA_MY_CNF}" \ --backup \ --stream=mbstream \ - --history="${LAST_FULL_DATE}" | gzip > \ - "${BACKUP_DIR}/mysqlbackup-${LAST_FULL_DATE}.qp.mbc.mbs.gz" && \ - echo "${LAST_FULL_DATE}" > "${BACKUP_DIR}/last_full_date" + --history="${LAST_FULL_DATE}" \ + | gzip > "${BACKUP_PATH}/${BACKUP_FILE}" + + echo "${BACKUP_PATH}/${BACKUP_FILE}" > "${BACKUP_DIR}/last_full_file" } # Execute an incremental backup backup_incremental() { - if [ -r "${BACKUP_DIR}/last_full_date" ]; then - LAST_FULL_DATE=$(cat "${BACKUP_DIR}/last_full_date") - else - LAST_FULL_DATE="" - fi - if [ ! -z "${LAST_FULL_DATE}" ]; then - echo "Taking an incremental backup" - mariabackup \ - --defaults-file="${REPLICA_MY_CNF}" \ - --backup \ - --stream=mbstream \ - --incremental-history-name="${LAST_FULL_DATE}" \ - --history="${LAST_FULL_DATE}" | gzip > \ - "${BACKUP_DIR}/incremental-$(date +%H)-mysqlbackup-${LAST_FULL_DATE}.qp.mbc.mbs.gz" - else - echo "Error: Full backup don't exist." + if [ ! -r "${BACKUP_DIR}/last_full_file" ]; then + echo "Error: No full backup file found." exit 1 fi + + FULL_BACKUP_FILE=$(cat "${BACKUP_DIR}/last_full_file") + LAST_FULL_DATE=$(basename "$(dirname "${FULL_BACKUP_FILE}")" | sed 's/^full-//') + NOW=$(date +%H-%M-%S-%d-%m-%Y) + INCR_DIR="${BACKUP_DIR}/incr-${NOW}-since-${LAST_FULL_DATE}" + mkdir -p "${INCR_DIR}" + + # Temp dir for full base restore + TMP_BASEDIR=$(mktemp -d) + + echo "Decompressing full backup to temp dir: ${TMP_BASEDIR}" + gunzip -c "${FULL_BACKUP_FILE}" | mbstream -x -C "${TMP_BASEDIR}" + + mariabackup \ + --defaults-file="${REPLICA_MY_CNF}" \ + --backup \ + --stream=mbstream \ + --incremental-basedir="${TMP_BASEDIR}" \ + --history="incr-${NOW}" \ + | gzip > "${INCR_DIR}/backup-incremental-${NOW}.mbs.gz" + + rm -rf "${TMP_BASEDIR}" } # Retry logic for database queries @@ -119,15 +132,15 @@ if [ -n "${BACKUP_TYPE}" ]; then get_and_set_replica_server case "${BACKUP_TYPE}" in "full") - backup_full - ;; + backup_full + ;; "incremental") - backup_incremental - ;; + backup_incremental + ;; *) - echo "Only full or incremental options are supported." - exit 1 - ;; + echo "Only full or incremental options are supported." + exit 1 + ;; esac else echo "You need to specify either full or incremental backup options." |
