Skip to content
Snippets Groups Projects
Commit 7700f07f authored by Brandon Rodriguez's avatar Brandon Rodriguez
Browse files

Create mysql backup script

parent b8cc82e6
Branches
No related merge requests found
#!/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
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment