Changeset 190

Show
Ignore:
Timestamp:
10/14/10 15:02:54 (4 years ago)
Author:
ssteinpreis
Message:

tid13485 consolidated version of various zbackup.sh scripts

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/tools/zbackup.sh

    r177 r190  
    22 
    33BASESNAP=lastfull 
    4 BACKUPCONF=/home/postgres/etc/zbackup.conf 
    5 BFILE=/home/postgres/pgshared3-backup.filelist 
     4INCREMENTAL=no 
     5BACKUPCONF=/export/home/postgres/etc/zbackup.conf 
     6BFILE=/var/log/pgods-backup.filelist 
     7BPCMD=/usr/openv/netbackup/bin/bpbackup 
     8BPLOG=/var/log/netbackup_backup.log 
     9BPCLASS=PGods 
     10BPSCHED=PGODS.UserBackup 
    611RUN=true 
    7 PGBINDIR=/opt/pgsql/bin 
     12INCDUMPDIR=/tmp 
     13BMODE=ONLINE 
     14DATAPREFIX='' 
     15#DATAPREFIX=data/zfs_backups/userscape/ 
     16SEND='' 
     17TARGET='' 
     18PATH=$PATH:/usr/sbin 
     19PGBINDIR=/opt/pgsql8311/bin 
    820DATABASE_PORT=5432 
    921 
    10 usage() { 
     22Usage() { 
    1123cat <<EOF 
    12 $0: [-f] [-n] -p <port_number> [-s] -l <label> 
     24$0: [-f] [-i] [-n] -p <port_number> -m <online> <offline> -s <netbackup> <zfs> -t <zfs send target> -l <label> 
     25        -m              backup mode <online> or <offline>  (default online) 
    1326        -n              just describe the process (don't do it). 
    14         -p              port which database runs on (default 5432) 
    15         -s              use ZFS send. 
     27        -p              port which database runs on (default 5432) 
     28        -s              use Netbackup or ZFS send. 
     29        -t              target for ZFS send. 
    1630        -f              force a backup even if one is running. 
     31        -i              perform an incremental since the last full (implies -s). 
    1732        -l <label>      backup using label: <label> 
    1833EOF 
    1934} 
    2035 
    21   set -- `getopt fisnp:l: $*` 
     36  set -- `getopt fis:t:m:np:l: $*` 
    2237  if [ $? != 0 ] 
    2338  then 
    24     usage 
     39    Usage 
    2540    exit 2 
    2641  fi 
     
    2944    case $i in 
    3045      -f)           FORCE=yes; shift;; 
    31       -s)           SEND=yes; shift;; 
     46      -s)           SEND=`echo $2 | tr '[:lower:]' '[:upper:]'`; shift 2;; 
     47      -t)           TARGET=$2; shift 2;; 
     48      -i)           INCREMENTAL=yes; shift;; 
    3249      -l)           BACKUPLABEL=$2; shift 2;; 
    3350      -p)           DATABASE_PORT=$2; shift 2;; 
     51      -m)           BMODE=`echo $2 | tr '[:lower:]' '[:upper:]'`; shift 2;; 
    3452      -n)           RUN=false; shift;; 
    3553      --)           shift; break;; 
     
    3755  done 
    3856 
     57if test "$SEND" = "ZFS" -a -z "$TARGET"; then 
     58        echo "\nZFS send requires -t TARGET\n" 
     59        Usage 
     60        exit 1 
     61fi 
     62 
    3963if test -z "$BACKUPLABEL"; then 
    40   usage 
    41   exit 
     64  BACKUPLABEL=`date +%Y%m%d` 
    4265fi 
    4366 
    4467echo "$0:" 
    4568echo "  backuplabel: $BACKUPLABEL" 
    46 SNAPNAME=$BASESNAP 
    47 echo "  full" 
     69if test "$INCREMENTAL" = "yes"; then 
     70  SNAPNAME="incremental"_$BACKUPLABEL 
     71  HISNAP=`zfs list -t snapshot -o name | egrep -i 'lastfull|incremental' | cut -f2 -d"@" | cut -f2 -d'_' | uniq | sort | tail -1` 
     72  BASESNAP=`zfs list -t snapshot -o name | grep $HISNAP | cut -f2 -d"@" | tail -1` 
     73  BFILE="$BFILE.i" 
     74  echo "  incremental" 
     75else 
     76  SNAPNAME=${BASESNAP}_${BACKUPLABEL} 
     77  echo "  full" 
     78fi 
     79 
     80sanity() { 
     81  if test -f $BFILE -a "x$FORCE" != "xyes" ; then 
     82    echo "backup in progress ($BFILE exists)." 
     83    exit 
     84  fi 
     85 
     86  for ZPOOL in `zfs list -o name,mountpoint | sed '/^NAME/d;s/  */:/g' | grep -v '@'` 
     87        do 
     88            REPORT_POOL=`echo ${ZPOOL} | cut -f1 -d':'` 
     89            REPORT_MOUNT=`echo ${ZPOOL} | cut -f2 -d':'` 
     90            FOUND=`grep "${REPORT_POOL} ${REPORT_MOUNT}" $BACKUPCONF`  
     91            if test -z "$FOUND"; then 
     92                echo "WARNING: ${REPORT_POOL} on ${REPORT_MOUNT} is not present in $BACKUPCONF" 
     93            fi 
     94        done 
     95 
     96 
     97  for LINE in `grep "^Y" $BACKUPCONF | sed 's/ /:/'g | cut -f2 -d':'` 
     98  do 
     99        FULL_EXISTS=`zfs list -t snapshot -o name | grep -i lastfull | grep ${LINE}` 
     100        if test "$INCREMENTAL" != "yes" -a "$FULL_EXISTS"  ; then 
     101        echo "Base snapshot for "${LINE}" already exists." 
     102        exit 
     103        fi 
     104        if test "$INCREMENTAL" = "yes" -a -z "$FULL_EXISTS"; then 
     105        echo "We don't have a base snap for "${LINE}" for incremental backups." 
     106        exit 
     107        fi 
     108  done 
     109
    48110 
    49111postgres_start_backup() { 
    50112  echo "starting postgres backup on label $BACKUPLABEL" 
    51   $RUN && su - postgres -c "$PGBINDIR/psql -p $DATABASE_PORT -c \"SELECT pg_start_backup('$BACKUPLABEL');\"" 
     113  $RUN && su - postgres -c "${PGBINDIR}/psql -p $DATABASE_PORT -c \"CHECKPOINT;\"" 
     114  $RUN && su - postgres -c "${PGBINDIR}/psql -p $DATABASE_PORT -c \"SELECT pg_start_backup('$BACKUPLABEL');\"" 
    52115} 
    53116postgres_stop_backup() { 
    54117  echo "stopping postgres backup on label $BACKUPLABEL" 
    55   $RUN && su - postgres -c "$PGBINDIR/psql -p $DATABASE_PORT -c \"SELECT pg_stop_backup();\"" 
     118  $RUN && su - postgres -c "${PGBINDIR}/psql -p $DATABASE_PORT -c \"SELECT pg_stop_backup();\"" 
    56119} 
    57120 
    58121snap() { 
     122  for line in `sed -e 's/ /:/g;' < $BACKUPCONF` 
     123  do 
     124    DO=`echo $line | awk -F: '{print $1;}'` 
     125    ZFS=`echo $line | awk -F: '{print $2;}'` 
     126#    MOUNT=`echo $line | awk -F: '{print $3;}'` 
     127    if test "$DO" = "Y"; then 
     128      echo "zfs snapshot $ZFS@$SNAPNAME" 
     129      $RUN && /sbin/zfs snapshot $ZFS@$SNAPNAME 
     130    fi 
     131  done 
     132} 
     133 
     134clear_full() { 
     135  if test "$INCREMENTAL" != "yes"; then 
     136    FULL_DATE=`date +%Y%m%d` 
     137    for line in `sed -e 's/ /:/g;' < $BACKUPCONF | grep "^Y"` 
     138        do 
     139          ZFS=`echo $line | awk -F: '{print $2;}'` 
     140          for OLD_SNAPNAME in `zfs list -t snapshot -o name | grep -i lastfull | grep -i ${ZFS} |  grep -v ${FULL_DATE}` 
     141        do 
     142          echo "zfs destroy $OLD_SNAPNAME" 
     143          $RUN && /sbin/zfs destroy $OLD_SNAPNAME 
     144        done 
     145        done 
     146  fi 
     147} 
     148 
     149clear_incrementals() { 
     150  zfs list -t snapshot -o name,creation | grep "incremental_" | cut -f1 -d' ' | grep -v $BACKUPLABEL | 
     151   while read SNAPLABEL  
     152       do 
     153             echo "zfs destroy $SNAPLABEL"; 
     154             $RUN && /sbin/zfs destroy $SNAPLABEL 
     155       done 
     156} 
     157 
     158backup() { 
     159  BACKEDUP="no" 
     160  $RUN && touch $BFILE 
    59161  for line in `sed -e 's/ /:/g;' < $BACKUPCONF` 
    60162  do 
     
    63165    MOUNT=`echo $line | awk -F: '{print $3;}'` 
    64166    if test "$DO" = "Y"; then 
    65       echo "zfs snapshot $ZFS@$SNAPNAME" 
    66       $RUN && /sbin/zfs snapshot $ZFS@$SNAPNAME 
     167      if test "$INCREMENTAL" = "yes"; then 
     168        FILE=`echo $ZFS | sed -e 's/\//:/g;'` 
     169        echo "/sbin/zfs send -i $ZFS@$BASESNAP $ZFS@$SNAPNAME  >> $INCDUMPDIR/$FILE.$SNAPNAME.incremental" 
     170        $RUN && mkfifo $INCDUMPDIR/$FILE.$SNAPNAME.incremental 
     171        $RUN && /sbin/zfs send -i $ZFS@$BASESNAP $ZFS@$SNAPNAME  >> $INCDUMPDIR/$FILE.$SNAPNAME.incremental & 
     172        $RUN && $BPCMD -w -c $BPCLASS -s $BPSCHED -k "INCREMENTAL" -L $BPLOG $INCDUMPDIR/$FILE.$SNAPNAME.incremental & 
     173        elif test "$INCREMENTAL" != "yes"; then 
     174#elif test "$SEND" = "NETBACKUP"; then 
     175        FILE=`echo $ZFS | sed -e 's/\//:/g;'` 
     176        echo "/sbin/zfs send $ZFS@$SNAPNAME  >> $INCDUMPDIR/$FILE.$SNAPNAME.full" 
     177        $RUN && mkfifo $INCDUMPDIR/$FILE.$SNAPNAME.full 
     178        $RUN && /sbin/zfs send $ZFS@$SNAPNAME  >> $INCDUMPDIR/$FILE.$SNAPNAME.full & 
     179        $RUN && $BPCMD -w -c $BPCLASS -s $BPSCHED -k "FULL" -L $BPLOG $INCDUMPDIR/$FILE.$SNAPNAME.full & 
     180      else 
     181        # Normal tar-like backups happen "on the spot" and in parallel 
     182        echo $MOUNT/.zfs/snapshot/$SNAPNAME 
     183        $RUN && $BPCMD -w -c $BPCLASS -s $BPSCHED -k "FULL" -L $BPLOG $MOUNT/.zfs/snapshot/$SNAPNAME & 
     184      fi 
    67185    fi 
    68186  done 
    69 
    70  
    71 clear_full() { 
     187 
     188  # Wait for our ZFS send commands to finish (they should be done already) 
     189  wait 
     190  $RUN && rm $BFILE 
     191
     192 
     193zfs_send() { 
    72194    for line in `sed -e 's/ /:/g;' < $BACKUPCONF` 
    73195    do 
     
    75197      ZFS=`echo $line | awk -F: '{print $2;}'` 
    76198      if test "$DO" = "Y"; then 
    77         echo "zfs destroy $ZFS@$SNAPNAME" 
    78         $RUN && /sbin/zfs destroy $ZFS@$SNAPNAME 
     199        if test "$SEND" = "ZFS"; then 
     200        if test "$INCREMENTAL" = "yes"; then 
     201          echo "ssh $TARGET zfs rollback -r $DATAPREFIX$ZFS@$BASESNAP" 
     202          echo "zfs send -i $ZFS@$BASESNAP $ZFS@$SNAPNAME | ssh $TARGET zfs receive -F $DATAPREFIX$ZFS@$SNAPNAME" 
     203          $RUN && ssh $TARGET zfs rollback -r $DATAPREFIX$ZFS@$BASESNAP 
     204          $RUN && /sbin/zfs send -i $ZFS@$BASESNAP $ZFS@$SNAPNAME | ssh $TARGET zfs receive -F $DATAPREFIX$ZFS@$SNAPNAME 
     205        else 
     206          echo "zfs send $ZFS@$SNAPNAME | ssh $TARGET zfs receive -F $DATAPREFIX$ZFS@$SNAPNAME" 
     207          $RUN && /sbin/zfs send $ZFS@$SNAPNAME | ssh $TARGET zfs receive -F $DATAPREFIX$ZFS@$SNAPNAME 
     208        fi 
     209        fi 
    79210      fi 
    80211    done 
    81212} 
    82213 
     214 
    83215# This clears the full snapshot only if -i (and -n) isn't specified 
     216 
    84217clear_full 
     218sanity 
    85219echo "Backing up as '$BACKUPLABEL'" 
    86 postgres_start_backup 
    87 snap 
    88 postgres_stop_backup 
    89  
     220 
     221if test "$BMODE" = "ONLINE" ; then 
     222        postgres_start_backup 
     223        snap 
     224        postgres_stop_backup 
     225else 
     226        snap 
     227fi 
     228 
     229if test "$SEND" = "NETBACKUP" -a -f $BPCMD; then 
     230backup 
     231fi 
     232 
     233if test "$SEND" = "ZFS"; then 
     234zfs_send 
     235fi 
     236 
     237clear_incrementals