Skip to content

Instantly share code, notes, and snippets.

@tony4d
Last active June 11, 2019 03:28
Show Gist options
  • Save tony4d/6043609 to your computer and use it in GitHub Desktop.
Save tony4d/6043609 to your computer and use it in GitHub Desktop.
Backup all databases on a mysql server excluding information/performance_schema and including UDFs/stored procedures. Most useful scheduling this on a slave db.
#!/bin/bash
# No username or passwords in this script, you should use mysql_config_editor
# to store it securely. The login-path in this script is set to "local-backup" so when you create
# your .mylogin.cnf with the mysql-config-editor make sure it is set the same
# See http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html
# An example to create your config for a mysql user "backup":
# shell> sudo mysql_config_editor set --login-path=local-backup --host=localhost --user=backup --password
# The backup user in the mysql server needs these privileges: SELECT, RELOAD, SHOW DATABASES, REPLICATION CLIENT
DB_BACKUP_DIR_ROOT="/opt/mysql-backups"
DB_BACKUP_DIR_TODAY="$DB_BACKUP_DIR_ROOT/`date +%Y-%m-%d`"
HN=`hostname | awk -F. '{print $1}'`
# Create the backup directory
mkdir -p $DB_BACKUP_DIR_TODAY
# Remove backups older than 1 day
find $DB_BACKUP_DIR_ROOT/ -maxdepth 1 -type d -mtime +1 -exec rm -rf {} \;
# Backup each db in the server, skip schema dbs though
for db in $(mysql --login-path=local-backup -Bse 'show databases'|egrep -vi 'information_schema|performance_schema');
do mysqldump --login-path=local-backup -xQce -R --master-data=2 --max-allowed-packet=1024M -B $db | gzip > "$DB_BACKUP_DIR_TODAY/$HN-$db-$(date +%Y-%m-%dT%H:%M:%S).sql.gz";
done
@Jolly-Pirate
Copy link

Jolly-Pirate commented Mar 30, 2017

Very handy, thanks.

@tenfef
Copy link

tenfef commented May 15, 2017

Be careful with this. I accidentally entered an invalid backup directory and it somehow ended up trying to run rm -rf on "/" 🤦‍♂️
Luckily it didn't actually delete anything, but I shat my pants for a few seconds 😑

@xZero707
Copy link

Be careful with this. I accidentally entered an invalid backup directory and it somehow ended up trying to run rm -rf on "/"
Luckily it didn't actually delete anything, but I shat my pants for a few seconds

Line 19 is dangerous. If "find" fails, it might run dreaded "rm -rf"

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