#!/bin/bash
#Script for SecureTransport - Online MySQL backup with Parcona XtraBackup
#Created by Genata 2019
#Make sure to have enough free space for backups.

FDH=/opt/Axway/SecureTransport
hd=/root/percona-xtrabackup-2.4.13-Linux-x86_64/bin/
ld=/percona/logs
#Location where backups will be greated
bd=/percona/backup
#Number of days for incremental backups
days=6
#Number of percona parallel threads for performance increase
pp=4
#MySQL user credentials
dbuser=root
dbpass=tumbleweed
hn=`uname -n`

echo "[`date -Iseconds`]" Backup start... >>$ld/ST_percona_backup.log
date -Iseconds >$ld/e_backup_percona

#Get current date in format YYYY-MM-DD
#Created directory structure is:
# -YYYY-MM-DD
#   |-full
#   |-inc1
#   |-inc2
#   ...
#   |-incN
#where N=days configured. Set days=6 for weekly cycle.

bp=`date +%F`
if [ -d "$bd/$bp" ]; then
  if [ -d "$bd/$bp/full" ]; then
    echo "[`date -Iseconds`]" Full backup for today $bp already exist. Exiting. >>$ld/ST_percona_backup.log
    echo "[`date -Iseconds`]" Backup done. >>$ld/ST_percona_backup.log
    rm $ld/e_backup_percona 2>/dev/null
    exit 0
  else
    echo "[`date -Iseconds`]" Full backup for today do not exist. Removing ${bp}. >>$ld/ST_percona_backup.log
    rm -r -f "$bd/$bp"
    bp=""
  fi
else
  bp=""
fi

for i in `seq 1 $days`; do
  bp1=`date -d "-$i day" +%F`
  if [ -d "$bd/$bp1" ]; then
    bp=$bp1
    bi=$i
    break
  fi
done
if [ -z "$bp" ]; then
  #Perform Full backup
  bp=`date +%F`
  echo "[`date -Iseconds`]" Will create full backup $bd/$bp/full >>$ld/ST_percona_backup.log
  mkdir -p $bd/$bp
  echo "[`date -Iseconds`]" Start full backup $bd/$bp/full >>$ld/ST_percona_xtrabackup.log
  ${hd}xtrabackup --defaults-file=$FDH/conf/mysql.conf --backup --user=$dbuser --password=$dbpass --parallel=$pp --target-dir=$bd/$bp/full >>$ld/ST_percona_xtrabackup.log 2>&1
  pxe=$?
  if [ $pxe -eq 0 ]; then
    echo "[`date -Iseconds`]" Backup created sucessfully. Hostname: $hn >>$ld/ST_percona_backup.log
	echo $hn >$bd/$bp/full/backup_hostname
  else
    rm -r -f "$bd/$bp/full"
    echo "[`date -Iseconds`]" Error creating backup. xtrabackup exit code: $pxe >>$ld/ST_percona_backup.log
  fi
else
  #Perform Incremental backup
  if [ -d "$bd/$bp/full" ]; then
    if [ -d "$bd/$bp/inc$bi" ]; then
      echo "[`date -Iseconds`]" Incremental backup for today already exist. Exiting. >>$ld/ST_percona_backup.log
      echo "[`date -Iseconds`]" Backup done. >>$ld/ST_percona_backup.log
      rm $ld/e_backup_percona 2>/dev/null
      exit 0
    else
      if [ "$bi" -eq "1" ]; then
        #Perform first incremental from full backup
        echo "[`date -Iseconds`]" Will create incremental backup $bd/$bp/inc$bi from $bd/$bp/full >>$ld/ST_percona_backup.log
        mkdir -p $bd/$bp/inc$bi
        echo "[`date -Iseconds`]" Start incremental backup $bd/$bp/inc$bi from $bd/$bp/full >>$ld/ST_percona_xtrabackup.log
        ${hd}xtrabackup --defaults-file=$FDH/conf/mysql.conf --backup --user=$dbuser --password=$dbpass --parallel=$pp --target-dir=$bd/$bp/inc$bi --incremental-basedir=$bd/$bp/full >>$ld/ST_percona_xtrabackup.log 2>&1
        pxe=$?
        if [ $pxe -eq 0 ]; then
          echo "[`date -Iseconds`]" Backup created sucessfully. Hostname: $hn >>$ld/ST_percona_backup.log
		  echo $bd/$bp/inc$bi/backup_hostname
        else
          rm -r -f "$bd/$bp/inc$bi"
          echo "[`date -Iseconds`]" Error creating backup. xtrabackup exit code: $pxe >>$ld/ST_percona_backup.log
        fi
      else
        bi1=$((bi -1))
        if [ -d "$bd/$bp/inc$bi1" ]; then
          #Perform N -th incremental from N-1 -th backup
          echo "[`date -Iseconds`]" Will create incremental backup $bd/$bp/inc$bi from $bd/$bp/inc$bi1 >>$ld/ST_percona_backup.log
          mkdir -p $bd/$bp/inc$bi
          echo "[`date -Iseconds`]" Start incremental backup $bd/$bp/inc$bi from $bd/$bp/inc$bi1 >>$ld/ST_percona_xtrabackup.log
          ${hd}xtrabackup --defaults-file=$FDH/conf/mysql.conf --backup --user=$dbuser --password=$dbpass --parallel=$pp --target-dir=$bd/$bp/inc$bi --incremental-basedir=$bd/$bp/inc$bi1 >>$ld/ST_percona_xtrabackup.log 2>&1
          pxe=$?
          if [ $pxe -eq 0 ]; then
            echo "[`date -Iseconds`]" Backup created sucessfully. Hostname: $hn >>$ld/ST_percona_backup.log
			echo $bd/$bp/inc$bi/backup_hostname
          else
            rm -r -f "$bd/$bp/inc$bi"
            echo "[`date -Iseconds`]" Error creating backup. xtrabackup exit code: $pxe >>$ld/ST_percona_backup.log
          fi
        else
          #Searching for previous backup.
          echo "[`date -Iseconds`]" Incremental backup "$bd/$bp/inc$bi1" do not exist. Searching for previous backup. >>$ld/ST_percona_backup.log
          bd1=`ls -1trd $bd/$bp/inc* 2>/dev/null | tail -1`
          if [ -z "$bd1" ]; then
            #Perform first incremental from full backup
            echo "[`date -Iseconds`]" Will create incremental backup $bd/$bp/inc$bi from $bd/$bp/full >>$ld/ST_percona_backup.log
            mkdir -p $bd/$bp/inc$bi
            echo "[`date -Iseconds`]" Start incremental backup $bd/$bp/inc$bi from $bd/$bp/full >>$ld/ST_percona_xtrabackup.log
            ${hd}xtrabackup --defaults-file=$FDH/conf/mysql.conf --backup --user=$dbuser --password=$dbpass --parallel=$pp --target-dir=$bd/$bp/inc$bi --incremental-basedir=$bd/$bp/full >>$ld/ST_percona_xtrabackup.log 2>&1
            pxe=$?
            if [ $pxe -eq 0 ]; then
              echo "[`date -Iseconds`]" Backup created sucessfully. Hostname: $hn >>$ld/ST_percona_backup.log
			  echo $bd/$bp/inc$bi/backup_hostname
            else
              rm -r -f "$bd/$bp/inc$bi"
              echo "[`date -Iseconds`]" Error creating backup. xtrabackup exit code: $pxe >>$ld/ST_percona_backup.log
            fi
          else
            #Perform N -th incremental from N-1 -th backup
            echo "[`date -Iseconds`]" Will create incremental backup $bd/$bp/inc$bi from $bd1 >>$ld/ST_percona_backup.log
            mkdir -p $bd/$bp/inc$bi
            echo "[`date -Iseconds`]" Start incremental backup $bd/$bp/inc$bi from $bd1 >>$ld/ST_percona_xtrabackup.log
            ${hd}xtrabackup --defaults-file=$FDH/conf/mysql.conf --backup --user=$dbuser --password=$dbpass --parallel=$pp --target-dir=$bd/$bp/inc$bi --incremental-basedir=$bd1 >>$ld/ST_percona_xtrabackup.log 2>&1
            pxe=$?
            if [ $pxe -eq 0 ]; then
              echo "[`date -Iseconds`]" Backup created sucessfully. Hostname: $hn >>$ld/ST_percona_backup.log
			  echo $bd/$bp/inc$bi/backup_hostname
            else
              rm -r -f "$bd/$bp/inc$bi"
              echo "[`date -Iseconds`]" Error creating backup. xtrabackup exit code: $pxe >>$ld/ST_percona_backup.log
            fi
          fi
        fi
      fi
    fi
  else
    echo "[`date -Iseconds`]" Full backup for $bp do not exist. Removing ${bp}. Please run this script again. Exiting. >>$ld/ST_percona_backup.log
    rm -r -f "$bd/$bp"
    echo "[`date -Iseconds`]" Backup done. >>$ld/_ST_percona_backup.log
    rm $ld/e_backup_percona 2>/dev/null
    exit 2
  fi
fi
echo "[`date -Iseconds`]" Backup done. >>$ld/ST_percona_backup.log
rm $ld/e_backup_percona 2>/dev/null

exit $pxe
