#!/bin/bash # Copyright (c) 2002, 2003, 2004, 2005 Peter Palfrader # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. umask 037 set -e set -u DATE=`date "+%Y%m%d-%H%M%S"` if [ -d /var/backups/local/mysql ]; then TARGET=/var/backups/local/mysql elif [ -d /var/local/backup/mysql ]; then TARGET=/var/local/backup/mysql elif [ -d /aux/dbbackup/mysql ]; then TARGET=/aux/dbbackup/mysql else echo "Cannot find a backup target directory" >&2 exit 1 fi HOSTS="$@" if [ -z "$HOSTS" ]; then HOSTS="localhost" fi if [ -z "${CONCURRENCY_LEVEL:-}" ]; then CONCURRENCY_LEVEL=1 fi for host in $HOSTS; do if [ "$host" = "localhost" ]; then prefix=""; postfix=""; else shorthost=`echo "$host" | sed -e 's/\..*//'` prefix="$shorthost--"; postfix="--$shorthost"; fi mysqlcnf="$HOME/.my.cnf$postfix" if ! [ -e "$mysqlcnf" ]; then echo "Cannot find my.cnf for host $host: $mysqlcnf" >&2 exit 1 fi if grep '^host=' "$mysqlcnf" > /dev/null; then hostarg="" else hostarg="--host=$host" fi DBs=$( echo 'SHOW DATABASES;' | mysql --defaults-file="$mysqlcnf" ${hostarg:+"$hostarg"} | tail -n +2 | while read db; do if [ "$db" = "innodb" ] || [ "$db" = "test" ] || [ "$db" = "lost+found" ] ; then continue; fi echo $db; done ); for db in $DBs; do file="$TARGET/$DATE-$prefix$db" mysqldump --defaults-file="$mysqlcnf" ${hostarg:+"$hostarg"} --opt --lock-tables -- "$db" > "$file" done for db in $DBs; do file="$TARGET/$DATE-$prefix$db" echo $file done | xargs --no-run-if-empty --max-procs "$CONCURRENCY_LEVEL" -n 1 bzip2 for db in $DBs; do file="$TARGET/$DATE-$prefix$db" md5=`md5sum -- "$file.bz2" | awk '{print $1}'` if [ -e "$TARGET/MD5-$md5" ]; then rm -- "$file.bz2" ln "$TARGET/MD5-$md5" "$file.bz2" else ln "$file.bz2" "$TARGET/MD5-$md5" fi done done