From 7700f07f23c932262a3ac3c456f7c64c551c98a0 Mon Sep 17 00:00:00 2001
From: Brandon Rodriguez <brodriguez8774@gmail.com>
Date: Wed, 10 Mar 2021 00:58:31 -0500
Subject: [PATCH] Create mysql backup script

---
 backups/backup_mysql.sh | 181 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 181 insertions(+)
 create mode 100755 backups/backup_mysql.sh

diff --git a/backups/backup_mysql.sh b/backups/backup_mysql.sh
new file mode 100755
index 0000000..81b9e97
--- /dev/null
+++ b/backups/backup_mysql.sh
@@ -0,0 +1,181 @@
+#!/usr/bin/env bash
+###
+ # Creates a compressed backup of the provided MySQL database.
+ #
+ #
+ # Required Args:
+ #  * Database User
+ #  * Database Password
+ #  * Database Name
+ #
+ # Optional Kwargs:
+ #  * Database Ip - Ip address for MySQL server. Defaults to 127.0.0.1 if not provided.
+ #      * Accepted Kwargs: database_ip / db_ip / ip
+ #  * Database Port - Port for MySQL server. Defaults to 3306 if not provided.
+ #      * Accepted Kwargs: database_port / db_port / port
+ #  * Backup Folder - Folder to backup database to.
+ #      * Accepted Kwargs: backup_folder / backup_location / backup_path
+ #
+ # Optional Flags:
+ #  * Force - Force script to execute without confirmation of provided args.
+ #      * Accepted Flags: f / force
+ #  * Delete Previous Backups - Clear backups folder of all files that match corresponding database, prior to backup.
+ #      * Accepted Flags: d / delete_previous_backups / delete_prev_backups / delete_prev
+ #
+ #
+ # https://git.brandon-rodriguez.com/scripts/bash/server_management
+ # Version 1.0
+ ##
+
+
+# Define possible flag values for script.
+possible_flags=("-f" "-force" "-d" "-delete_previous_backups" "-delete_prev_backups" "-delete_prev")
+
+
+# Import utils script.
+. $(dirname ${0})/../utils.sh
+
+
+# Stop on error.
+set -e
+
+
+# Global Variables.
+db_user=""
+db_pass=""
+db_name=""
+db_ip="127.0.0.1"
+db_port="3306"
+get_absolute_path "./"
+backup_folder=${return_value}
+current_date=`date +%Y-%m-%d`
+
+
+###
+ # Script entry point.
+ ##
+function main () {
+
+    # Check for provided args.
+    validate_args
+
+    # Confirm args if force flag was not provided.
+    if [[ ! ${flags[@]} =~ "f" && ! ${flags[@]} =~ "force" ]]
+    then
+        confirm_args
+    fi
+
+    backup_db
+}
+
+
+
+###
+ # Validate provided script args.
+ ##
+function validate_args () {
+
+    # Check for minimum number of args.
+    if [[ ${#args[@]} < 3 ]]
+    then
+        echo -e "{$text_red}Missing one or more args. Require at minimum [ db_user db_password db_name ].${text_reset}"
+        exit 0
+    fi
+
+    # Grab args.
+    db_user="${args[0]}"
+    db_pass="${args[1]}"
+    db_name="${args[2]}"
+
+    # Check for database ip kwarg.
+    if [[ "${!kwargs[@]}" =~ "ip" ]]
+    then
+        db_ip="${kwargs[ip]}"
+
+    elif [[ "${!kwargs[@]}" =~ "db_ip" ]]
+    then
+        db_ip="${kwargs[db_ip]}"
+
+    elif [[ "${!kwargs[@]}" =~ "database_ip" ]]
+    then
+        db_ip="${kwargs[database_ip]}"
+    fi
+
+    # Check for database port kwarg.
+    if [[ "${!kwargs[@]}" =~ "port" ]]
+    then
+        db_port="${kwargs[port]}"
+
+    elif [[ "${!kwargs[@]}" =~ "db_port" ]]
+    then
+        db_port="${kwargs[db_port]}"
+
+    elif [[ "${!kwargs[@]}" =~ "database_port" ]]
+    then
+        db_port="${kwargs[database_port]}"
+    fi
+
+    # Check for backup folder kwarg.
+    if [[ "${!kwargs[@]}" =~ "backup_folder" ]]
+    then
+        get_absolute_path "${kwargs[backup_folder]}"
+        backup_folder="${return_value}"
+
+    elif [[ "${!kwargs[@]}" =~ "backup_location" ]]
+    then
+        get_absolute_path "${kwargs[backup_location]}"
+        backup_folder="${return_value}"
+
+    elif [[ "${!kwargs[@]}" =~ "backup_path" ]]
+    then
+        get_absolute_path "${kwargs[backup_path]}"
+        backup_folder="${return_value}"
+    fi
+}
+
+
+###
+ # Prompts user to confirm input args.
+ # Skipped if the -f flag is provided.
+ ##
+function confirm_args () {
+
+    echo ""
+    echo "Found provided args:"
+    echo "    db_user: ${db_user}"
+    echo "    db_name: ${db_name}"
+    echo "    db_ip:   ${db_ip}"
+    echo "    db_port: ${db_port}"
+    echo "    backup_folder: ${backup_folder}"
+    echo ""
+
+    get_user_confirmation "Is this correct?"
+    if [[ ${return_value} == false ]]
+    then
+        echo -e "${text_orange}Please correct provided args and rerun script.${text_reset}"
+        exit 0
+    fi
+}
+
+
+
+###
+ # Logic to backup database.
+ ##
+function backup_db () {
+
+    # Check for "delete previous backups" flags.
+    if [[ ${flags[@]} =~ "d" || ${flags[@]} =~ "delete_previous_backups" || ${flags[@]} =~ "delete_prev_backups" || ${flags[@]} =~ "delete_prev" ]]
+    then
+        echo "clearing out backups at ${backup_folder}/${db_name}__*"
+
+    fi
+
+    # Execute backup.
+    mysqldump -h ${db_ip} -P ${db_port} -u ${db_user} --password=${db_pass} ${db_name} | gzip > "${backup_folder}/${db_name}__${current_date}.sql.gz"
+    echo -e "${text_blue}MySQL database contents backed up to \"${backup_location}/${db_name}__${current_date}.sql.gz\".${text_reset}"
+
+}
+
+
+main
-- 
GitLab