Skip to content

Instantly share code, notes, and snippets.

@zzf01
Created August 3, 2025 15:32
Show Gist options
  • Select an option

  • Save zzf01/df314a48a6d9f73e26784755d2a69d4c to your computer and use it in GitHub Desktop.

Select an option

Save zzf01/df314a48a6d9f73e26784755d2a69d4c to your computer and use it in GitHub Desktop.
mariadb-backup backup
#!/bin/bash
# === CONFIGURATION ===
ZSTD_COMPRESSION_LEVEL=3
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <backup_dir> [full|inc]"
exit 1
fi
# === VALIDATE ARGUMENTS ===
BACKUP_BASE="$1"
MODE="$2"
if [ ! -d "$BACKUP_BASE" ]; then
echo "$BACKUP_BASE is not a valid directory"
echo "Usage: $0 <backup_dir> [full|inc]"
exit 1
fi
if [[ "$MODE" != "full" && "$MODE" != "inc" ]]; then
echo "Usage: $0 <backup_dir> [full|inc]"
exit 1
fi
FULL_BACKUP_DIR="$BACKUP_BASE/full"
INCREMENTAL_BASE_DIR="$BACKUP_BASE/inc"
LOG_BASE="$BACKUP_BASE/logs"
# === FUNCTIONS ===
log() {
echo "[$(date '+%F %T')] $1" >> "$LOGFILE"
}
latest_archive() {
find "$BACKUP_BASE" -type d -name '*.lsndir' | sort | tail -n 1
}
get_half_cores() {
cores=$(nproc)
echo $((cores / 2))
}
# === EXECUTION ===
mkdir -p "$LOG_BASE"
TIMESTAMP=$(date '+%F_%H-%M-%S')
ZSTD_THREADS=$(get_half_cores)
if [[ "$MODE" == "full" ]]; then
mkdir -p "$FULL_BACKUP_DIR"
LOGFILE="$LOG_BASE/full_$TIMESTAMP.log"
BACKUP_LOG="$LOG_BASE/full_$TIMESTAMP.mariabackup.log"
OUTNAME="full_$TIMESTAMP"
rm -rf "$FULL_BACKUP_DIR"/* "$INCREMENTAL_BASE_DIR"/* "$LOG_BASE"/*
log "Removing old backups..."
OUTFILE="$FULL_BACKUP_DIR/$OUTNAME.mbstream.zst"
log "Creating full backup with compression - $OUTFILE with lsndir ${FULL_BACKUP_DIR}/${OUTNAME}.lsndir"
mariabackup --backup --stream=mbstream --extra-lsndir=${FULL_BACKUP_DIR}/${OUTNAME}.lsndir 2>> "$BACKUP_LOG" | zstd -q -T$ZSTD_THREADS -$ZSTD_COMPRESSION_LEVEL -o "$OUTFILE"
if [ $? -eq 0 ]; then
log "✅ Full backup completed"
else
log "❌ Full backup failed! See $BACKUP_LOG for details."
exit 1
fi
elif [[ "$MODE" == "inc" ]]; then
mkdir -p "$INCREMENTAL_BASE_DIR"
LOGFILE="$LOG_BASE/inc_$TIMESTAMP.log"
BACKUP_LOG="$LOG_BASE/inc_$TIMESTAMP.mariabackup.log"
BASE_ARCHIVE=$(latest_archive)
if [ ! -d "$BASE_ARCHIVE" ]; then
log "❌ No base backup found. Run a full backup first."
exit 1
fi
OUTNAME="inc_$TIMESTAMP"
OUTFILE="$INCREMENTAL_BASE_DIR/$OUTNAME.mbstream.zst"
log "Creating incremental backup based on $BASE_ARCHIVE - $OUTFILE with lsndir ${INCREMENTAL_BASE_DIR}/${OUTNAME}.lsndir"
mariabackup --backup --incremental-basedir="$BASE_ARCHIVE" --stream=mbstream --extra-lsndir=${INCREMENTAL_BASE_DIR}/${OUTNAME}.lsndir 2>> "$BACKUP_LOG" | zstd -q -T$ZSTD_THREADS -$ZSTD_COMPRESSION_LEVEL -o "$OUTFILE"
if [ $? -eq 0 ]; then
log "✅ Incremental backup completed"
else
log "❌ Incremental backup failed! See $BACKUP_LOG for details."
exit 1
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment