133 lines
3.9 KiB
Bash
Executable File
133 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# MySQL-BU - MySQL Backup Scripts
|
|
|
|
action="$1"
|
|
FOLDER='/opt/mysqlbu'
|
|
VERS='4.11232018'
|
|
|
|
source /opt/mysqlbu/settings.conf
|
|
source /dev/stdin <<< "$(curl -sL http://scity.xyz/colorsinc)"
|
|
source /dev/stdin <<< "$(curl -sL http://scity.xyz/defaultinc)"
|
|
|
|
# ========================================================= #
|
|
|
|
if [ $(id -u) != "0" ]; then
|
|
echo "Sorry, I need root privileges!"
|
|
fi
|
|
|
|
MYSQLDATA="`grep --perl-regexp --only-match '(?<=datadir=).+' "$MYSQLCFG"`"
|
|
DAY_BACKUP_DIR="${BACKUP_PATH}`date +%Y-%m-%d`/"
|
|
BASE_BACKUP="`ls -1 $DAY_BACKUP_DIR 2> /dev/null | grep --max-count=1 --perl-regexp '^.+_BASE'`"
|
|
|
|
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 "${CS[color,Green]}Daily base backup already done. Running incremental backup...${CS[color,Default]}"
|
|
$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"
|
|
;;
|
|
'backup-incremental')
|
|
DEST_DIR="${DAY_BACKUP_DIR}`date +%H-%M-%S`"
|
|
|
|
if [ "$BASE_BACKUP" = "" ]; then
|
|
echo -e "${CS[color,Green]}Daily base backup not found. Running base backup...${CS[color,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
|
|
;;
|
|
'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 "${CS[color,Red]}Backup not found!${CS[color,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')
|
|
echo -e "${CS[color,Yellow]}============ Available Backups ============${CS[color,Default]}"
|
|
for day in $BACKUP_PATH* ; do
|
|
tdt=`sed 's/.*\///' <<< $day`
|
|
echo -e "${CS[bg,Blue]}${CS[color,White]}-> `date -d"${tdt}" +"%a, %b, %d %Y"` ${CS[color,Default]}${CS[bg,Default]}"
|
|
|
|
for hour in $day/* ; do
|
|
echo $hour
|
|
thr=`sed 's/.*\///' <<< ${hour//_BASE/}`
|
|
echo -e "${CS[color,Green]} -> `date -d"${tdt} ${thr//-/:}" +"%I:%M %P"`${CS[color,Default]}"
|
|
done
|
|
done
|
|
echo -e "${CS[color,Yellow]}===========================================${CS[color,Default]}"
|
|
;;
|
|
*)
|
|
echo "Usage: $0 { backup | backup-base | backup-incremental | restore | list }"
|
|
;;
|
|
esac
|
|
|
|
exit 0 |