Last active
February 8, 2016 14:04
-
-
Save dgoguerra/ce1603b9ef99b498a669 to your computer and use it in GitHub Desktop.
Dump a MySQL database and upload the compressed output to S3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Not maintained here, check https://github.com/dgoguerra/shell-mysql-dump-s3 instead.