Created
August 3, 2025 15:32
-
-
Save zzf01/df314a48a6d9f73e26784755d2a69d4c to your computer and use it in GitHub Desktop.
mariadb-backup backup
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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