#!/bin/bash
#Script for SecureTransport - Prepare online MySQL backup for restore with Parcona XtraBackup
#Created by Genata 2019
#Prepare can be done on another machine as long as script has full access to backups.
#Note that prepare always use a copy of original directories. Make sure to have enough free space for prepare. 

if [ -z "$1" ]; then
  echo "Usage: $(basename $0) <Restore date>"
  exit 1
fi

hd=/root/percona-xtrabackup-2.4.13-Linux-x86_64/bin/
ld=/percona/logs
#Location where backups were greated
bd=/percona/backup
#Number of days for incremental backups. Should be the same as backup script.
days=6
#Number of percona parallel threads for performance increase
pp=4
#The next value is used instead of buffer_pool_size. Recomended to use 1G or 2G or 4G based on the available memory. 
um=1G

rd=`date -d "$1" +%F 2>/dev/null`
cr=$?
if [ "$cr" -gt 0 ]; then
  echo Invalid restore date
  exit $cr
fi

bp=$rd
if [ -d "$bd/$bp" ]; then
  echo Prepare full backup from $bp
  echo "[`date -Iseconds`]" Prepare full backup start... >>$ld/ST_percona_prepare.log
  rm -r -f "$bd/prep"
  rm "$bd/prep_date" 2>/dev/null
  cp -r "$bd/$bp/full" "$bd/prep"
  echo ${hd}xtrabackup --prepare --use-memory=$um --target-dir="$bd/prep" >>$ld/ST_percona_prepare.log
  ${hd}xtrabackup --prepare --use-memory=$um --target-dir="$bd/prep" >>$ld/ST_percona_prep_xtrabackup.log 2>&1
  pxe=$?
  if [ $pxe -eq 0 ]; then
    echo ${hd}xtrabackup --prepare --use-memory=$um --target-dir="$bd/prep" >>$ld/ST_percona_prepare.log
    ${hd}xtrabackup --prepare --use-memory=$um --target-dir="$bd/prep" >>$ld/ST_percona_prep_xtrabackup.log 2>&1
    pxe=$?
    if [ $pxe -eq 0 ]; then
      echo Full backup $rd prepared sucessfully.
      echo "[`date -Iseconds`]" Full backup $rd prepared sucessfully. >>$ld/ST_percona_prepare.log
      echo $rd > "$bd/prep_date"
    else
      rm -r -f "$bd/prep"
      rm "$bd/prep_date" 2>/dev/null
      echo Error preparing full backup. xtrabackup exit code: $pxe
      echo "[`date -Iseconds`]" Error preparing full backup. xtrabackup exit code: $pxe >>$ld/ST_percona_prepare.log
    fi
  else
    rm -r -f "$bd/prep"
    rm "$bd/prep_date" 2>/dev/null
    echo Error preparing full backup. xtrabackup exit code: $pxe
    echo "[`date -Iseconds`]" Error preparing full backup. xtrabackup exit code: $pxe >>$ld/ST_percona_prepare.log
  fi
  echo "[`date -Iseconds`]" Prepare full backup done. >>$ld/ST_percona_prepare.log
  exit $pxe
else
  bp=""
fi

for i in `seq 1 $days`; do
  bp1=`date -d "$rd -$i day" +%F`
  if [ -d "$bd/$bp1" ]; then
    bp=$bp1
    bi=$i
    break
  fi
done

if [ -z "$bp" ]; then
  echo Could not find backup from $rd
  echo "[`date -Iseconds`]" Could not find backup from $rd >>$ld/ST_percona_prepare.log
  exit 2
else
  if [ -d "$bd/$bp/inc$bi" ]; then
    if [ -d "$bd/$bp/full" ]; then
      echo Prepare full backup from $bp and inc $bi
      echo "[`date -Iseconds`]" Prepare incremental backup start... >>$ld/ST_percona_prepare.log
      rm -r -f "$bd/prep"
      rm "$bd/prep_date" 2>/dev/null
      cp -r "$bd/$bp/full" "$bd/prep"
      echo ${hd}xtrabackup --prepare --apply-log-only --use-memory=$um --target-dir="$bd/prep" >>$ld/ST_percona_prepare.log
      ${hd}xtrabackup --prepare --apply-log-only --use-memory=$um --target-dir="$bd/prep" >>$ld/ST_percona_prep_xtrabackup.log 2>&1
      pxe=$?
      if [ $pxe -eq 0 ]; then
        echo "[`date -Iseconds`]" Incremental backup step full prepared sucessfully. >>$ld/ST_percona_prepare.log
      else
        rm -r -f "$bd/prep"
        rm "$bd/prep_date" 2>/dev/null
        echo Error preparing incremental backup step full. xtrabackup exit code: $pxe
        echo "[`date -Iseconds`]" Error preparing incremental backup step full. xtrabackup exit code: $pxe >>$ld/ST_percona_prepare.log
        echo "[`date -Iseconds`]" Prepare incremental backup done. >>$ld/ST_percona_prepare.log
        exit $pxe
      fi
      if [ "$bi" -gt "1" ]; then
        for i in `seq 1 $((bi-1))`; do
          if [ -d "$bd/$bp/inc$i" ]; then
            rm -r -f "$bd/inc" 2>/dev/null
            cp -r "$bd/$bp/inc$i" "$bd/inc"
            echo ${hd}xtrabackup --prepare --apply-log-only --use-memory=$um --target-dir="$bd/prep" --incremental-dir=$bd/inc \#$bp/inc$i >>$ld/ST_percona_prepare.log
            ${hd}xtrabackup --prepare --apply-log-only --use-memory=$um --target-dir="$bd/prep" --incremental-dir=$bd/inc >>$ld/ST_percona_prep_xtrabackup.log 2>&1
            pxe=$?
            if [ $pxe -eq 0 ]; then
              echo Incremental backup step inc$i prepared sucessfully.
              echo "[`date -Iseconds`]" Incremental backup step inc$i prepared sucessfully. >>$ld/ST_percona_prepare.log
            else
              rm -r -f "$bd/prep"
              rm "$bd/prep_date" 2>/dev/null
              rm -r -f "$bd/inc"
              echo Error preparing incremental backup step inc$i. xtrabackup exit code: $pxe
              echo "[`date -Iseconds`]" Error preparing incremental backup step inc$i. xtrabackup exit code: $pxe >>$ld/ST_percona_prepare.log
              echo "[`date -Iseconds`]" Prepare incremental backup done. >>$ld/ST_percona_prepare.log
              exit $pxe
            fi
          fi
        done
      fi
      rm -r -f "$bd/inc" 2>/dev/null
      cp -r "$bd/$bp/inc$bi" "$bd/inc"
      echo ${hd}xtrabackup --prepare --use-memory=$um --target-dir="$bd/prep" --incremental-dir=$bd/inc \#$bp/inc$bi >>$ld/ST_percona_prepare.log
      ${hd}xtrabackup --prepare --use-memory=$um --target-dir="$bd/prep" --incremental-dir=$bd/inc >>$ld/ST_percona_prep_xtrabackup.log 2>&1
      pxe=$?
      if [ $pxe -eq 0 ]; then
        echo Incremental backup step inc$bi prepared sucessfully.
        echo "[`date -Iseconds`]" Incremental backup step inc$bi prepared sucessfully. >>$ld/ST_percona_prepare.log
        rm -r -f "$bd/inc"
      else
        rm -r -f "$bd/prep"
        rm "$bd/prep_date" 2>/dev/null
        rm -r -f "$bd/inc"
        echo Error preparing incremental backup step inc$bi. xtrabackup exit code: $pxe
        echo "[`date -Iseconds`]" Error preparing incremental backup step inc$bi. xtrabackup exit code: $pxe >>$ld/ST_percona_prepare.log
        echo "[`date -Iseconds`]" Prepare incremental backup done. >>$ld/ST_percona_prepare.log
        exit $pxe
      fi
      echo All increments were merged sucessfully.
      echo "[`date -Iseconds`]" All increments were merged sucessfully. >>$ld/ST_percona_prepare.log
      echo ${hd}xtrabackup --prepare --use-memory=$um --target-dir="$bd/prep" >>$ld/ST_percona_prepare.log
      ${hd}xtrabackup --prepare --use-memory=$um --target-dir="$bd/prep" >>$ld/ST_percona_prep_xtrabackup.log 2>&1
      pxe=$?
      if [ $pxe -eq 0 ]; then
        echo Incremental backup $rd prepared sucessfully.
        echo "[`date -Iseconds`]" Incremental backup $rd prepared sucessfully. >>$ld/ST_percona_prepare.log
        echo $rd > "$bd/prep_date"
      else
        rm -r -f "$bd/prep"
        rm "$bd/prep_date" 2>/dev/null
        echo Error preparing incremental backup. xtrabackup exit code: $pxe
        echo "[`date -Iseconds`]" Error preparing incremental backup. xtrabackup exit code: $pxe >>$ld/ST_percona_prepare.log
      fi
      echo "[`date -Iseconds`]" Prepare incremental backup done. >>$ld/ST_percona_prepare.log
      exit $pxe
    else
      echo Could not find full backup in $bp
      echo "[`date -Iseconds`]" Could not find full backup in $bp >>$ld/ST_percona_prepare.log
      exit 2
    fi
  else
    echo Could not find backup from $rd
    echo "[`date -Iseconds`]" Could not find backup from $rd >>$ld/ST_percona_prepare.log
    exit 2
  fi
fi

exit 0
