# Script ```bash #!/bin/bash # usage: ./mysql_backup.sh if [ $# -ne 3 ]; then echo "Error: Missing required parameters" echo "Usage: $0 " exit 1 fi # configuration MYSQL_HOST="" MYSQL_PORT="3306" MYSQL_USER="$1" MYSQL_PASS="$2" DATABASE_NAME="$3" BACKUP_DIR="/mnt/backup" BACKUP_FILE="$BACKUP_DIR/pms.sql" TEMP_BACKUP_FILE="$BACKUP_DIR/backup_temp.sql" # check if backup directory exists if [ ! -d "$BACKUP_DIR" ]; then echo "Error: Backup directory $BACKUP_DIR does not exist" exit 1 fi # check if backup directory is writable if [ ! -w "$BACKUP_DIR" ]; then echo "Error: Backup directory $BACKUP_DIR is not writable" exit 1 fi # test mysql connection before proceeding mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" -e "SELECT 1;" "$DATABASE_NAME" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error: Cannot connect to MySQL database" exit 1 fi # Remove old backup file if it exists if [ -f "$BACKUP_FILE" ]; then rm "$BACKUP_FILE" fi # perform database dump with optimized settings for minimal locking # --single-transaction: Uses consistent read for InnoDB tables # --routines: Include stored procedures and functions # --triggers: Include triggers # --lock-tables=false: Don't lock tables (relies on single-transaction) # --quick: Retrieve rows one at a time rather than buffering entire result set # --extended-insert: Use multiple-row INSERT syntax for faster restores mysqldump \ -h "$MYSQL_HOST" \ -P "$MYSQL_PORT" \ -u "$MYSQL_USER" \ -p"$MYSQL_PASS" \ --single-transaction \ --routines \ --triggers \ --lock-tables=false \ --quick \ --extended-insert \ --no-tablespaces \ --default-character-set=utf8mb4 \ "$DATABASE_NAME" > "$TEMP_BACKUP_FILE" # check if mysqldump completed successfully if [ $? -eq 0 ] && [ -s "$TEMP_BACKUP_FILE" ]; then # move temporary backup to final location mv "$TEMP_BACKUP_FILE" "$BACKUP_FILE" # return succesfull backup echo "Backup completed successfully: $BACKUP_FILE" echo "Backup size: $(du -h "$BACKUP_FILE" | cut -f1)" exit 0 else # clean up temporary file on failure if [ -f "$TEMP_BACKUP_FILE" ]; then rm "$TEMP_BACKUP_FILE" fi # return failed backup echo "Error: Database backup failed" exit 1 fi ```