/home/drscream

  • home
  • blog
  • gallery
  • about
  • Kleines einfaches Backup (Bash-)Script

    Es gibt sicher einiges effektivere und bessere Scripte um ein System und MySQL Backup zu machen. Das ist jetzt auch nur die erste Version des ganzen und evtl. kann es jemand gebrauchen :)

    #####################################################################
    # srv-backup.sh - backup the system and the databases               #
    # @author:  drscream@cyber-tec.org                                  #
    # @version: Thu Oct  4 11:35:39 CEST 2007                           #
    #####################################################################
    
    # CONFIGURATION
    #####################################################################
    # crontab example:
    # 21 4    * * * /opt/av-srv/av-srv-backup.sh mysql
    #  2 3 1,15 * * /opt/av-srv/av-srv-backup.sh system
    #  2 4    * * * /opt/av-srv/av-srv-backup.sh webroot
    #  3 6    * * * /opt/av-srv/av-srv-backup.sh pgsql
    
    ## log information ##################################################
    log_file="/local/backup/backup.log"
    datetime=$(date +%Y%m%d-%H%M%S)
    fqdn=$(hostname -f)
    
    ## select what to backup ############################################
    # => 0/1:          deactivate or activate the backup
    # => /srv/xxx:     path to save the backup
    # => asdf.tar.bz2: file to save the backup
    # => sysdir.txt:   text file with the directories to backup
    # => rsync:        rsync is set the file will rsynced to the backupsrv
    system=(1 '/local/backup/system' 'system.$fqdn.$datetime.tar.gz' './systemdir.txt' 'rsync')
    
    # => 0/1:          deactivate or activate the backup
    # => /srv/xxx:     path to save the backup
    # => asdf.tar.bz2: file to save the backup
    # => /web:         directory to backup
    # => rsync:        rsync is set the file will rsynced to the backupsrv
    webroot=(1 '/local/backup/webroot' 'web.$fqdn.$datetime.tar.gz' '/web' 'rsync')
    
    # => 0/1:          deactivate or activate the backup
    # => /srv/xxx:     path to save the backup
    # => user:         sql user (root)
    # => password:     sql password
    # => rsync:        rsync is set the file will rsynced to the backupsrv
    mysql=(1 '/local/backup/mysql' 'root' 'qwe123' 'rsync')
    
    # => 0/1:          deactivate or activate the backup
    # => /srv/xxx:     path to save the backup
    # => asdf.tar.bz2: file to save the backup
    # => user:         sql user (root)
    # => rsync:        rsync is set the file will rsynced to the backupsrv
    pgsql=(0 '/local/backup/pgsql' 'pgsql.$fqdn.$datetime.sql.gz' 'postgres' 'rsync')
    
    # => 0/1:                       rsync to the specified server
    # => username:      username for rsync
    # => hostname:      specified backup server host
    # => /path:                     path to save the backup ($fqdn is added)
    rsync=(1 'username' 'hostname' '/backup')
    rsync_args="--archive"
    
    ## delete the files after  days #################################
    delete_files=20
    
    ## global variables #################################################
    export LANG="en_US.utf8"
    PARAM=$1
    
    # FUNCTIONS
    #####################################################################
    function delete() {
            find $1 -type f -mtime +$delete_files | xargs rm 2>/dev/null
    }
    
    function log() {
            echo $1 >> $log_file
    }
    
    function backuprsync() {
            if [[ ${rsync[0]} == 1 && ${1} == "rsync" ]]; then
            log "($datetime) rsync to server ---------------------------"
    
                    rsync ${rsync_args} $2 ${rsync[1]}@${rsync[2]}:${rsync[3]}/${fqdn} >> $log_file
    
                    log "end rsync to server -----------------------------------"
            fi
    }
    
    # MAIN
    #####################################################################
    
    ## system ###########################################################
    if [[ ${system[0]} == 1 && ${PARAM} == "system" ]]; then
            # cleanup system backup
            delete ${system[1]}
    
            # start system backup
            log "($datetime) systembackup: ---------------------------------"
            log "backup following files:"
    
            dir_backup=$(cat ${system[3]})
            log "$dir_backup"
    
            # compress the files
            cd /
            tar cvpzf "${system[1]}/${system[2]}" $dir_backup
    
            # rsync if it is set
            backuprsync ${system[4]} ${system[1]}/${system[2]}
    
            log "end systembackup ------------------------------------------"
    fi
    
    ## webroot ##########################################################
    if [[ ${webroot[0]} == 1 && ${PARAM} == "webroot" ]]; then
        # cleanup webroot backup
        delete ${webroot[1]}
    
        # start webroot backup
        log "($datetime) webrootbackup: --------------------------------"
        log "backup following dir:"
    
        dir_backup=$(ls -la ${webroot[3]})
        log "$dir_backup"
    
        # compress the files
        cd ${webroot[3]}
        tar cvpzf "${webroot[1]}/${webroot[2]}" *
    
        # rsync if it is set
            backuprsync ${webroot[4]} ${webroot[1]}/${webroot[2]}
    
        log "end webrootbackup -----------------------------------------"
    fi
    
    ## mysql ############################################################
    if [[ ${mysql[0]} == 1 && ${PARAM} == "mysql" ]]; then
            # cleanup mysql backup
            delete ${mysql[1]}
    
            # start mysql backup
            log "($datetime) mysqlbackup -----------------------------------"
    
            mysqlshow -u ${mysql[2]} --password=${mysql[3]} |  tr -d '|' |  tr -d '+' |  tr -d ' ' | tr -d '-' > /tmp/sql-backup-list.tmp
    
            list=/tmp/sql-backup-list.tmp
            ig=3
            xr_lines=$(wc -l $list | awk '{ print $1 }')
            while [ "$ig" -le $xr_lines ];  do
                    ig=$(expr $ig + 1)
                    item=$(awk "NR == $ig {print}" $list)
    
                    mysqldump --add-drop-table --allow-keywords -q -a -c -u ${mysql[2]} --password=${mysql[3]} $item | gzip > ${mysql[1]}/$item.sql.gz
    
                    echo $item >> $dir_backup
            done
    
            # Remove a temp file
            rm -f /tmp/sql-backup-list.tmp
    
        # rsync if it is set
            backuprsync ${mysql[4]} ${mysql[1]}
    
            log "end mysqlbackup -------------------------------------------"
    fi
    
    ## pgsql ############################################################
    if [[ ${pgsql[0]} == 1 && ${PARAM} == "pgsql" ]]; then
            # cleanup pgsql backup
            delete ${pgsql[1]}
    
            # start pgsql backup
            log "($datetime) pgsqlbackup -----------------------------------"
    
            pg_dumpall -U${pgsql[3]} | gzip > "${pgsql[1]}/${pgsql[2]}.gz"
    
        # rsync if it is set
            backuprsync ${pgsql[4]} ${pgsql[1]}
    
            log "end pgsqlbackup -------------------------------------------"
    fi

    Server Backup Script Download

    Posted

    October 6, 2007

    Tags

    Backup, bash, bsd, linux, sql