Script to backup all current databases, not including some built-in ones, and backup to S3.
Usage:
./backup_mysql_to_s3.sh s3://example_bucket/folder/
Source code:
#!/bin/bash
# Initialize things
mysql_password=""
target_bucket=$1
timestamp=`date +"%s_%d-%B-%Y_%A@%H%M"`
if [ -z "$1" ]; then
echo "Argument containing target S3 bucket path must be passed. Exiting."
exit 0
fi
command -v aws >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "AWS CLI not installed. Exiting."
exit 0
fi
echo `date +"%d-%B-%Y@%H:%M:%S"`" - Starting backups."
# List all the databases
databases=`mysql -uroot -e "SHOW DATABASES;" | tr -d "| " | grep -v "(Database\|information_schema\|performance_schema\|mysql\|test)"`
# Loop the databases
for db in $databases; do
echo `date +"%d-%B-%Y@%H:%M:%S"`" - Processing database $db."
filename="${timestamp}_$db.sql.gz"
tmp=/tmp/$filename
# Dump
echo `date +"%d-%B-%Y@%H:%M:%S"`" - Dumping $db to $tmp."
mysqldump -uroot --force --opt --databases $db | gzip -c > $tmp
size=`stat -c "%s" $tmp`
echo `date +"%d-%B-%Y@%H:%M:%S"`" - File size of $tmp is $size bytes."
# Upload
echo `date +"%d-%B-%Y@%H:%M:%S"`" - Uploading $tmp to $target_bucket$filename."
aws s3 cp $tmp $target_bucket$filename
# Cleanup
echo `date +"%d-%B-%Y@%H:%M:%S"`" - Cleaning up $tmp."
rm $tmp
done;
# All done
echo `date +"%d-%B-%Y@%H:%M:%S"`" - All done."
You can find some more helpers here: infra_helpers GitLab repo.