Skip to content

Instantly share code, notes, and snippets.

@dgoguerra
Last active February 8, 2016 14:04
Show Gist options
  • Save dgoguerra/ce1603b9ef99b498a669 to your computer and use it in GitHub Desktop.
Save dgoguerra/ce1603b9ef99b498a669 to your computer and use it in GitHub Desktop.
Dump a MySQL database and upload the compressed output to S3
#!/bin/bash
# File name
readonly PROGNAME=$(basename $0)
# File name, without the extension
readonly PROGBASENAME=${PROGNAME%.*}
# Arguments
readonly ARGS="$@"
# Arguments number
readonly ARGNUM="$#"
usage() {
echo
echo "Dump a MySQL database and upload it compressed to AWS S3."
echo
echo "Usage: $PROGNAME -i <file> -o <file> [options]..."
echo
echo "Main Options:"
echo
echo " -h, --help"
echo " This help text."
echo
echo " -d <database>, --database <database>"
echo " Database name."
echo
echo " --output-prefix <prefix>"
echo " Output file prefix."
echo
echo " --s3-bucket <bucket name>"
echo " Destination bucket name."
echo
echo " --s3-folder <bucket folder>"
echo " Destination bucket folder."
echo
echo
echo "Extra Options:"
echo
echo " --dry-run"
echo " Pretend to execute the actions, outputting the commands instead."
echo
echo " --dump-extra-args <extra args>"
echo " Dump command extra arguments."
echo
echo " --dump-folder <folder>"
echo " Folder to use to download the dump."
echo
echo " --preserve-raw-dump"
echo " Don't delete the raw database dump file after execution."
echo
echo " --preserve-zip-dump"
echo " Don't delete the compressed database dump file after execution."
echo
echo " --preserve-all"
echo " Don't delete any temporary files after execution. This option"
echo " equals to using --preserve-raw-dump and --preserve-zip-dump."
echo
echo " --"
echo " Do not interpret any more arguments as options."
echo
}
makeFolderIfNotExists() {
local folder="$1"
if [ ! -d "$folder" ]; then
if [ "$dry_run" == "1" ]; then
echo "mkdir -p \"$folder\""
else
mkdir -p "$folder"
fi
fi
}
dumpDb() {
local db_name="$1"
local output="$2"
if [ "$dry_run" == "1" ]; then
echo "mysqldump configtool $dump_extra_args --single-transaction > \"$output\""
else
mysqldump configtool $dump_extra_args --single-transaction > "$output"
fi
}
# crear un fichero comprimido a partir del source dado. No elimina el source.
compressFile() {
local source="$1"
local dest="$2"
if [ "$dry_run" == "1" ]; then
echo "tar -cvzf \"$dest\" \"$source\""
else
tar -cvzf "$dest" "$source"
fi
}
getBucketRegion() {
local bucket_name="$1"
/usr/local/bin/aws s3api get-bucket-location --bucket $bucket_name --output text
}
moveToS3() {
local source="$1"
local bucket_name="$2"
local dest_folder="$3"
if [ "$dry_run" == "1" ]; then
echo "/usr/local/bin/aws s3 cp --region $(getBucketRegion $bucket_name) \"$source\" \"s3://${bucket_name}${dest_folder}\""
else
/usr/local/bin/aws s3 cp --region $(getBucketRegion $bucket_name) "$source" "s3://${bucket_name}${dest_folder}"
fi
}
while [ "$#" -gt 0 ]
do
case "$1" in
-h|--help)
usage
exit 0
;;
-d|--database)
db_name="$2"
;;
--dump-extra-args)
dump_extra_args="$2"
# saltar el siguiente elemento en el bucle (el argumento de
# la opción actual) por si comienza también por '--'
shift
;;
--output-prefix)
output_prefix="$2"
;;
--s3-bucket)
bucket_name="$2"
;;
--s3-folder)
bucket_folder="$2"
;;
--dry-run)
dry_run="1"
;;
--dump-folder)
dump_folder="$2"
;;
--preserve-raw-dump)
preserve_raw="1"
;;
--preserve-zip-dump)
preserve_zip="1"
;;
--preserve-all)
preserve_raw="1"
preserve_zip="1"
;;
--)
break
;;
-*)
echo "Invalid option '$1'. Use --help to see the valid options" >&2
exit 1
;;
# an option argument, continue
*) ;;
esac
shift
done
if [ "$db_name" == "" ]; then
echo "error: database must be set" > /dev/stderr
usage
exit 0
fi
if [ "$bucket_name" == "" ]; then
echo "error: S3 bucket name must be set" > /dev/stderr
usage
exit 0
fi
if [ "$bucket_folder" == "" ]; then
echo "error: S3 bucket output folder must be set" > /dev/stderr
usage
exit 0
fi
# si no se ha dado un prefijo, se usa el nombre de la db
if [ "$output_prefix" == "" ]; then
output_prefix="$db_name"
fi
# si no se ha dado un directorio para los dumps, usamos /tmp por defecto
if [ "$dump_folder" == "" ]; then
dump_folder="/tmp"
fi
# crear el directorio si no existe...
makeFolderIfNotExists "$dump_folder"
# solo nos movemos al directorio si no estamos en --dry-run
# (para evitar que falle si no existe)
[ ! "$dry_run" == "1" ] && cd "$dump_folder"
datetime=$(date +%Y%m%d_%H%M%S)
dump_filename="${output_prefix}_${datetime}.sql"
dump_zip_filename="$dump_filename.tar.gz"
dumpDb "$db_name" "$dump_filename"
compressFile "$dump_filename" "$dump_zip_filename"
moveToS3 "$dump_zip_filename" "$bucket_name" "$bucket_folder"
# a no ser que esté el flag --preserve-raw-dump, borramos el dump hecho
if [ ! "$preserve_raw" == "1" ] && [ ! "$dry_run" == "1" ]; then
rm "$dump_filename"
fi
# a no ser que esté el flag --preserve-zip-dump, borramos el fichero
# comprimido hecho del dump.
if [ ! "$preserve_zip" == "1" ] && [ ! "$dry_run" == "1" ]; then
rm "$dump_zip_filename"
fi
@dgoguerra
Copy link
Author

Not maintained here, check https://github.com/dgoguerra/shell-mysql-dump-s3 instead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment