#!/usr/bin/env bash # MySQL-BU - MySQL Backup Scripts action="$1" FOLDER='/opt/nodemgmt' VERS='1.01272019' CERT_DAEMON='/usr/bin/certbot' source ${folder}/settings.conf source ${folder}/ids-defaults/colors.conf source ${folder}/ids-defaults/default.conf # ========================================================= # MAIN_MENU() { while : do clear echo "" echo -e "${idsCL[LightGreen]} NodeMgmt - G a l e r a / N G I N X N o d e M a n a g e m e n t${idsCL[Default]} ${idsCL[DarkGray]}(ver-${VERS})${idsCL[Default]}" echo -e "${idsCL[LightGreen]}---------------------------------------------------------------------------${idsCL[Default]}" echo -e "Node hostname: ${node_hostname}" echo -e "${idsCL[LightGreen]}---------------------------------------------------------------------------${idsCL[Default]}" echo "" echo " [1] Change Backup Location" echo " [2] Change MySQL User" echo " [3] Change MySQL Password" echo " [4] Change MySQL Config File Location" echo " [5] Change The Number of Backup Days to Keep" echo "" echo " [B] Run Backup" echo " [L] List Backups" echo " [D] Delete Backups" echo "" echo " [C] Add Crontab Entry to run every 3 Hours" echo -e " ${idsCL[DarkGray]}(edit crontab manually to adjust the backup frequency)${idsCL[Default]}" echo "" echo " [Q] Quit" echo "" echo "" echo -e -n "${idsCL[LightYellow]}Please select an [ActionItem] from above:${idsCL[Default]} " read -n 1 opt echo "" case $opt in 1) WEBMIN_INSTALL INSTALL_MENU;; 2) GLANCES_INSTALL INSTALL_MENU;; 3) X11VNC_INSTALL INSTALL_MENU;; 4) FW_INSTALL INSTALL_MENU;; 5) LINUPX_UNINSTALL INSTALL_MENU;; [Bb]) RUN_BACKUP;; [Ll]) LIST_BACKUPS;; [Dd]) DELETE_MENU;; [Cc]) ADD_CRONTAB;; [Qq]) EXIT1 exit 1;; *) echo "Thats an invaild option,"; echo "please select a valid option only."; sleep 1;; esac done } case $1 in 'backup') if [ "$BASE_BACKUP" = "" ]; then $0 backup-base else $0 backup-incremental fi allfiles=`ls -1 ${BACKUP_PATH}` files=(`ls -1 ${BACKUP_PATH} | tail -${BACKUPSTOKEEP}`) for i in $allfiles; do keep=0; for a in ${files[@]}; do if [ $i == $a ]; then keep=1; fi; done; if [ $keep == 0 ]; then rm -rf ${BACKUP_PATH}$i; fi; done ;; 'backup-base') DEST_DIR="${DAY_BACKUP_DIR}`date +%H-%M-%S`_BASE" if [ "$BASE_BACKUP" != "" ]; then echo -e "${idsCL[Green]}Daily base backup already done. Running incremental backup...${idsCL[Default]}" sleep 3 $0 backup-incremental exit 1 fi if [ ! -d "$DAY_BACKUP_DIR" ]; then mkdir -p "$DAY_BACKUP_DIR" fi # innobackupex --defaults-file="$MYSQLCFG" --user="$MYSQLUSER" --password="$MYSQLPASS" --no-timestamp "$DEST_DIR" mariabackup --backup --target-dir="$DEST_DIR" --user="$MYSQLUSER" --password="$MYSQLPASS" ;; 'backup-incremental') DEST_DIR="${DAY_BACKUP_DIR}`date +%H-%M-%S`" if [ "$BASE_BACKUP" = "" ]; then echo -e "${idsCL[Green]}Daily base backup not found. Running base backup...${idsCL[Default]}" $0 backup-base exit 1 fi #innobackupex --defaults-file="$MYSQLCFG" --user="$MYSQLUSER" --password="$MYSQLPASS" \ #--incremental-basedir="${DAY_BACKUP_DIR}${BASE_BACKUP}" \ #--incremental "$DEST_DIR" \ #--no-timestamp mariabackup --backup --target-dir="$DEST_DIR" --incremental-basedir="${DAY_BACKUP_DIR}${BASE_BACKUP}" --user="$MYSQLUSER" --password="$MYSQLPASS" ;; 'restore') if [ "`ps aux | grep --only-match mysqld`" != "" ]; then read -p "I think mysql-server still running. It's STRONGLY recommended to stop it before restoring any backup to avoid corrupted files. Do you want to continue anyway? [Y/N]" yn case $yn in [Yy]* ) break;; * ) exit;; esac fi REQUEST_BACKUP="${BACKUP_PATH}${2}/${3}" BASE_BACKUP="${BACKUP_PATH}${2}/`ls ${BACKUP_PATH}${2} | grep --max-count=1 --perl-regexp '^.+_BASE'`" TMP_BACKUP="${BACKUP_PATH}${2}/.current_backup" if [ ! -d "$REQUEST_BACKUP" ] || [ ! $2 ] || [ ! $3 ]; then echo -e "${idsCL[Red]}Backup not found!${idsCL[Default]}" echo "Usage: $0 restore 2019-01-05 13-00-10" exit 1 fi if [ -d "$MYSQLDATA" ]; then mv "$MYSQLDATA" "`grep --perl-regexp --only-match '^.*(?=/$)' <<< ${MYSQLDATA}`_restore-`date +%Y-%m-%d_%H-%M-%S`" mkdir "$MYSQLDATA" fi if [ -d "$TMP_BACKUP" ]; then rm -rf "$TMP_BACKUP" fi cp --recursive "$BASE_BACKUP" "$TMP_BACKUP" innobackupex --apply-log --redo-only "$TMP_BACKUP" if [ REQUEST_BACKUP != BASE_BACKUP ]; then innobackupex --apply-log "$TMP_BACKUP" --incremental-dir="$REQUEST_BACKUP" fi innobackupex --apply-log "$TMP_BACKUP" innobackupex --copy-back "$TMP_BACKUP" chown -R mysql:mysql "$MYSQLDATA" rm -rf "$TMP_BACKUP" ;; 'list') clear echo "" echo -e " ${idsCL[LightGreen]}MySQL-BU - M y S Q L B A C K U P S C R I P T S${idsCL[Default]} ${idsCL[DarkGray]}(ver-${VERS})${idsCL[Default]}" echo -e "${idsCL[LightGreen]}---------------------------------------------------------------------------${idsCL[Default]}" echo "" echo -e "${idsCL[LightYellow]}============ Available MySQL Backups ============${idsCL[Default]}" for day in $BACKUP_PATH* ; do tdt=`sed 's/.*\///' <<< $day` bsz=`du -sh ${day} | awk '{print $1}'` echo -e "${idsBG[Blue]}${idsCL[White]}-> `date -d"${tdt}" +"%a, %B %d, %Y"` - ${bsz} ${idsCL[Default]}${idsBG[Default]}" for hour in $day/* ; do thr=`sed 's/.*\///' <<< ${hour//_BASE/}` bsz=`du -sh ${hour} | awk '{print $1}'` if [ ${hour: -5} = "_BASE" ]; then echo -e "${idsCL[LightGreen]}${idsST[Bold]} -> `date -d"${tdt} ${thr//-/:}" +"%I:%M %P"` - FULL BACKUP${idsST[Reset]}${idsCL[LightGreen]} - ${bsz}${idsCL[Default]}" else echo -e "${idsCL[Cyan]} -> `date -d"${tdt} ${thr//-/:}" +"%I:%M %P"` - Incremental - ${bsz}${idsCL[Default]}" fi done done echo -e "${idsCL[Yellow]}=================================================${idsCL[Default]}" echo "" ;; 'gui') MAIN_MENU ;; 'delete') DELETE_MENU ;; *) echo "Usage: $0 { gui | backup | backup-base | backup-incremental | restore | list }" ;; esac exit 0