← Catalog Matrix
DevOps

Automated Bash Script to Backup and Compress MySQL Databases Automatically

A production-ready Bash script to generate secure daily MySQL database dumps, compress files into tarballs, and purge historical files over 30 days old.

Overview & Problem Matrix

Losing critical production database tables due to unexpected hardware failures, corrupted file systems, or accidental manual query drops can instantly compromise an active platform.

Manually triggering relational database exports via standard tools is highly inconsistent and prone to human error. Furthermore, allowing raw, uncompressed historical database archives to continuously accumulate on local disk nodes will eventually exhaust your server's available storage arrays.

Implementation Guide & Setup Steps

To implement this automated database protection workflow within your Linux environment, execute these administration steps:

  1. Secure Script Access Permissions: Save the blueprint file below to your administration directory as mysql_backup.sh and restrict execution access so non-privileged system users cannot read your raw database passwords:

$ chmod 700 /usr/local/bin/mysql_backup.sh

  1. Automate the Routine Lifecycle: Schedule the maintenance utility to execute quietly every night exactly at midnight by adding a new automated entry to your root system scheduler:

$ sudo crontab -e

# Append this configuration rule inside your active crontab editor: 0 0 * /usr/local/bin/mysql_backup.sh > /dev/null 2>&1

  1. Execute Manual Verification: Test the complete compression and retention pipeline immediately by manually triggering the script path using elevated permissions:

$ sudo /usr/local/bin/mysql_backup.sh

#!/bin/bash

Configuration: Define your access points and storage pathways safely

DB_USER="root" DB_PASS="your_secure_database_password_here" DB_NAME="production_app_db" BACKUP_DIR="/var/backups/mysql" RETENTION_DAYS=30

Ensure execution framework runs with root elevation permissions

if [ "$EUID" -ne 0 ]; then echo "[ERROR] Please execute this cron data architecture loop as root (sudo)." exit 1 fi

Ensure storage path matrices exist safely before running processes

mkdir -p "$BACKUP_DIR"

Establish date indexing metrics

CURRENT_DATE=$(date +"%Y-%m-%d_%H%M%S") OUTPUT_FILE="${BACKUP_DIR}/${DB_NAME}_backup_${CURRENT_DATE}.sql.gz"

echo "Initializing snapshot routing sequence for target schema: ${DB_NAME}..."

Execute safe background database extraction directly into gzip compilation layers

Optimized parameters: --single-transaction avoids locking production tables during operations

mysqldump --user="${DB_USER}" \ --password="${DB_PASS}" \ --single-transaction \ --quick \ --lock-tables=false \ --all-databases | gzip > "$OUTPUT_FILE"

Verify dump execution results exit boundaries successfully

if [ ${PIPESTATUS[0]} -eq 0 ]; then echo "[SUCCESS] Compressed backup written safely to node: ${OUTPUT_FILE}" else echo "[CRITICAL ERROR] Extraction interface failed to complete stream matrix snapshot." rm -f "$OUTPUT_FILE" exit 1 fi

Clean up structural storage leftovers older than RETENTION_DAYS

echo "Scanning for historical archival logs exceeding lifespan limitations..." find "$BACKUP_DIR" -type f -name "${DB_NAME}_backup_*.sql.gz" -mtime +$RETENTION_DAYS -exec rm -f {} \;

echo "Database protection sequence routine closed successfully."