#!/bin/sh #========================================================================= # hourly & daily backup of specified mysql databases #========================================================================= # run from cron: 'full' once a day (3am), 'incremental' hourly (4am - 2am) # script user needs RELOAD privilege for flush-logs # --ignore-table = MyISAM tables (not compatible with single-transaction) # --master-data records the binary log position in the resulting dump file # (=2 causes this line to be a comment in the dump file) # http://dev.mysql.com/doc/refman/5.1/en/backup-strategy-example.html # to view bin-logs: mysqlbinlog /path/to/bin-log.000001 > bin_log.sql # to restore full db(s): # see RESTORE_DB_PROCEDURE.txt DBUSER=raj DBPASS=adm1n NOW=$(date +"%Y-%m-%d") # increased security if ARCHIVEPATH on another system: ARCHIVEPATH=/backups/mysql case $1 in full) # daily backup cd $ARCHIVEPATH for i in outreach hmrn hilis4 uclh genomics bristol do mysqldump -u $DBUSER -p$DBPASS \ --single-transaction \ --quick \ --add-locks \ --flush-logs \ --routines \ --master-data=2 \ --ignore-table=${i}.sessions \ --ignore-table=${i}.email_addresses \ ${i} > ${i}.sql done # --databases $i | gzip -9 - >$ARCHIVEPATH/${NOW}_${i}.sql.gz # -9 = best compression tar czf ${NOW}.tar.gz *.sql # --delete-master-logs | gzip > $ARCHIVEPATH/full-$DATE.sql.gz # DANGEROUS echo 'PURGE MASTER LOGS BEFORE DATE_SUB( NOW(), INTERVAL 2 DAY);' \ | /usr/bin/mysql -u $DBUSER -p$DBPASS ;; incremental) # hourly backup mysqladmin -u $DBUSER -p$DBPASS flush-logs ;; *) echo "Usage: mysql_backup [full|incremental]" ;; esac