#!/bin/bash
#
# license: GPL V2.0
# version: 1.3.7
# script author: Koshuba V - stvixfree@gmail.com
# 2022
## only pgsql & mysql
#
## dependencies scripts
#
pkgdep=( "postgresql-client" "mariadb-client" "pigz" ); # packages
get_tools=( "pg_dump" "mysqldump" "pigz" ); # tools for script
#
## only pgsql & mysql
## the array database name
DBDATA=( "dbname1" "dbname2" "dbname3" );
## the array backup paths
BACKPATH=( "/arhiv" "/arhiv" "/arhiv" );
## the array login for databases
LOGINDB=( "dblogin1" "dblogin2" "dblogin3" );
## the array pass for databases
PASSWDB=( "dbpass1" "dbpass2" "dbpass2" );
## the array type databases
TYPEDB=( "pgsql" "pgsql" "mysql" )
## the array hosts
HOSTDB=( "127.0.0.1" "127.0.0.1" "10.1.0.1" )
## system values
## log file
LOG_FILE="/var/log/syslog.log";
# - type compress xz (tar) or gz (pigz)
type_arh="xz";
# - core active for pigz
cpu_arh="2";
## email admin
adminmail="admindb@mydomen.ru";
#
MESS_OK="Резервное копирвание базы $DBNAME выполнено"; # Backup database $ DBNAME done
MESS_FAIL="Ошибка резервного копирования базы $DBNAME"; # Backup database $ DBNAME error
dbname="none";
#########################################################
#
function getTools() {
for ((itools=0; itools != ${#get_tools[@]}; itools++))
do
checktool=$(whereis -b ${get_tools[$itools]}|awk '/^'${get_tools[$itools]}':/{print $2}')
if [[ $checktool = "" ]];
then
sudo apt install ${pkgdep[$itools]};
fi
checktool=$(whereis -b ${get_tools[$itools]}|awk '/^'${get_tools[$itools]}':/{print $2}')
if [[ $checktool != "" ]];
then
eval get_${get_tools[$itools]}=$(whereis -b ${get_tools[$itools]}|awk '/^'${get_tools[$itools]}':/{print $2}');
list_tools[${#list_tools[@]}]="$(whereis -b ${get_tools[$itools]}|awk '/^'${get_tools[$itools]}':/{print $2}')";
else
echo "Sorry, there are no required packages to work, please install: ${pkgdep[@]}"
exit 0;
fi
done
backDB;
}
function backDB() {
## switch type arh
case "$type_arh" in
## type gz
"gz" | "gz" )
for ((dbinx=0; dbinx != ${#DBDATA[@]}; dbinx++))
do
rdate=$(date +%d-%m-%y_%H-%M);
dbname=${DBDATA[$dbinx]};
rpath=${BACKPATH[$dbinx]};
dbtype=${TYPEDB[$dbinx]};
dblogin=${LOGINDB[$dbinx]}
dbpass=${PASSWDB[$dbinx]}
dbhost=${HOSTDB[$dbinx]}
cd $rpath;
if [ "$dbtype" = "pgsql" ];
then
if [ ! -d $rpath/$dbname ];
then
mkdir -p $rpath/$dbname;
fi
if sudo PGPASSWORD=$dbpass pg_dump -C --host=$dbhost --username=$dblogin --dbname=$dbname |pigz -p$cpu_arh -c9 >$rpath/$dbname/$dbname"-pg_"$rdate.sql.gz
then
echo "$(date) -- backup pgbase (.gz) $MESS_OK">>$LOG_FILE
date|mailx -a "Content-Type: text/plain; charset=UTF-8" -s "$(date) -- backup pgbase (.gz) $MESS_OK" $adminmail
else
echo "$(date) -- backup pgbase (.gz) $MESS_FAIL">>$LOG_FILE
date|mailx -a "Content-Type: text/plain; charset=UTF-8" -s "$(date) -- backup pgbase (.gz) $MESS_FAIL" $adminmail
fi
fi
if [ "$dbtype" = "mysql" ];
then
if [ ! -d $rpath/$dbname ];
then
mkdir -p $rpath/$dbname;
fi
if sudo mysqldump -v -h$dbhost -u$dblogin -p$dbpass $dbname |pigz -p$cpu_arh -c9 >$rpath/$dbname/$dbname"-mysql_"$rdate.sql.gz
then
echo "$(date) -- backup mysqlbase $MESS_OK">>$LOG_FILE
date|mailx -a "Content-Type: text/plain; charset=UTF-8" -s "$(date) -- backup mysqlbase $MESS_OK" $adminmail
else
echo "$(date) -- backup mysqlbase $MESS_FAIL">>$LOG_FILE
date|mailx -a "Content-Type: text/plain; charset=UTF-8" -s "$(date) -- backup mysqlbase $MESS_FAIL" $adminmail
fi
fi
cd;
done
;;
## type xz or default
* )
for ((dbinx=0; dbinx != ${#DBDATA[@]}; dbinx++))
do
rdate=$(date +%d-%m-%y_%H-%M);
dbname=${DBDATA[$dbinx]};
rpath=${BACKPATH[$dbinx]};
dbtype=${TYPEDB[$dbinx]};
dblogin=${LOGINDB[$dbinx]}
dbpass=${PASSWDB[$dbinx]}
dbhost=${HOSTDB[$dbinx]}
cd $rpath;
if [ "$dbtype" = "pgsql" ];
then
if [ ! -d $rpath/$dbname ];
then
mkdir -p $rpath/$dbname;
fi
if sudo PGPASSWORD=$dbpass pg_dump -C --host=$dbhost --username=$dblogin --dbname=$dbname > $rpath/$dbname/$dbname"-pg_"$rdate.sql
then
tar -cJf $rpath/$dbname/$dbname"_"$rdate.tar.xz $rpath/$dbname/$dbname"-pg_"$rdate.sql;
rm $rpath/$dbname/$dbname"-pg_"$rdate.sql;
echo "$(date) -- backup pgbase $MESS_OK">>$LOG_FILE
date|mailx -a "Content-Type: text/plain; charset=UTF-8" -s "$(date) -- backup pgbase $MESS_OK" $adminmail
else
echo "$(date) -- backup pgbase $MESS_FAIL">>$LOG_FILE
date|mailx -a "Content-Type: text/plain; charset=UTF-8" -s "$(date) -- backup pgbase $MESS_FAIL" $adminmail
fi
fi
if [ "$dbtype" = "mysql" ];
then
if [ ! -d $rpath/$dbname ];
then
mkdir -p $rpath/$dbname;
fi
if sudo mysqldump -v -h$dbhost -u$dblogin -p$dbpass $dbname > $rpath/$dbname/$dbname"-mysql_"$rdate.sql
then
tar -cJf $rpath/$dbname/$dbname"-mysql_"$rdate.tar.xz $rpath/$dbname/$dbname"-mysql_"$rdate.sql;
rm $rpath/$dbname/$dbname"-mysql_"$rdate.sql;
echo "$(date) -- backup mysqlbase $MESS_OK">>$LOG_FILE
date|mailx -a "Content-Type: text/plain; charset=UTF-8" -s "$(date) -- backup mysqlbase $MESS_OK" $adminmail
else
echo "$(date) -- backup mysqlbase $MESS_FAIL">>$LOG_FILE
date|mailx -a "Content-Type: text/plain; charset=UTF-8" -s "$(date) -- backup mysqlbase $MESS_FAIL" $adminmail
fi
fi
cd;
done
;;
esac
}
getTools;
exit 0