← Catalog Matrix
DevOps / Server Config

Automated MySQL Database Backup Rotation and High-Performance Import Script

A production-ready Bash script blueprint for automated, timestamped MySQL/MariaDB backups with an optimized configuration for importing ultra-large SQL dumps.

Relying on manual database exports introduces human error into your disaster recovery matrix. Similarly, executing standard SQL imports on large databases often leads to memory exhaustion or locked table bottlenecks that take production environments offline.

To achieve high-availability infrastructure, your database management strategy must include automated backup pruning and highly tuned engine variables during importing phases.

High-Performance Database Processing Mechanics

To prevent standard server resource choking during heavy SQL dumping or importing tasks, the operations engine must tweak InnoDB behavior:

  1. Transaction Log Tuning: Temporarily disabling autocommit operations (SET AUTOCOMMIT = 0) forces the MySQL engine to process queries in batch memory blocks instead of writing to disk for every single row.
  2. Foreign Key Verification Suppression: Disabling integrity checks (SET FOREIGN_KEY_CHECKS = 0) during imports eliminates the CPU overhead of validating relational constraints line-by-line, accelerating raw data injection by up to 5x.
  3. Automated Pruning Lifecycle: Backup script logic must automatically delete archives older than a specific retention threshold (e.g., 30 days) via chronological system timestamps to prevent disk space saturation.

The DevOps shell automation blueprint below handles automated, compressed backups on a daily cron rotation and contains the precise tuning overrides needed to process ultra-large SQL dumps efficiently.

Bash DevOps Database Automation Engine

#!/bin/bash

============================================================

BLUEPRINT 1: AUTOMATED COMPRESSED BACKUP AND ROTATION ENGINE

============================================================

Configure this script to run daily via system crontab:

sudo crontab -e -> 0 2 * /usr/local/bin/db-backup.sh

DB_USER="your_secure_db_user" DB_PASS="your_secure_db_password" DB_NAME="your_production_database" BACKUP_DIR="/var/backups/mysql" RETENTION_DAYS=30 TIMESTAMP=$(date +"%Y%m%d_%H%M%S")

Ensure backup directory path matrix exists securely

mkdir -p "$BACKUP_DIR" chmod 700 "$BACKUP_DIR"

echo "[Starting Backup Matrix] Exporting: $DB_NAME..."

Execute mysqldump with single-transaction logic to prevent table locking on InnoDB

mysqldump --user="$DB_USER" --password="$DB_PASS" --single-transaction --quick --routines --triggers "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_$TIMESTAMP.sql.gz"

if [ $? -eq 0 ]; then echo "Success: Backup compiled and compressed successfully." else echo "Critical Error: Backup sequence terminated unexpectedly." >&2 exit 1 fi

Purge legacy archives exceeding the retention threshold to preserve disk blocks

echo "[Cleaning Infrastructure] Pruning backups older than $RETENTION_DAYS days..." find "$BACKUP_DIR" -type f -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -exec rm {} \;

echo "Backup Rotation Cycle Completed Successfully."

================================================================

BLUEPRINT 2: HIGH-PERFORMANCE LARGE SQL IMPORT OVERRIDE STRATEGY

================================================================

If you are importing a massive .sql dump that hangs or chokes server resources,

prepend and append these performance execution variables to your raw dump file,

or inject them directly into your database command-line session:

read -r -d '' PERFORMANCE_IMPORT_TUNING << 'EOF' -- INJECT THIS AT THE ABSOLUTE TOP OF YOUR GIANT .SQL FILE: SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';

-- [Your Massive SQL Dump Queries Execute In This High-Speed Pipeline Section]

-- INJECT THIS AT THE ABSOLUTE BOTTOM OF YOUR GIANT .SQL FILE TO RESET STATE: SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; SET AUTOCOMMIT=@OLD_AUTOCOMMIT; SET SQL_MODE=@OLD_SQL_MODE; COMMIT; EOF