Enviado em 09/04/2019 - 16:36h
Boa tarde caros colegas, sou iniciante em linux, estou com uma dificuldade e gostaria muito da ajuda de vocês, para isso devo explicar minha necessidade.
#!/bin/bash
################################################### ATENÇÃO ################################
## Script utilizado para backup e compactação de banco de dados mysql por hora ##
## Este segue a seguinte rotina: ##
## - BLOCO 1: Verificar qual hd está com espaço em disco ##
## - BLOCO 2: Preparar Pastas ##
## - BLOCO 3: Exportar bases em uma pasta temporária ##
## - BLOCO 4: Compactar bases ##
## - BLOCO 5: Apagar bases ##
## - BLOCO 6: Mover Backup ##
## - BLOCO 7: Finalizar ##
############################################################################################
##################################### VARIÁVEIS GERAIS #####################################
#Pasta Projeto
tempproj="/BACKUP"
#Pasta Temporária
tempfd="Temp"
#Pasta para bkp do script
pastascriptBKP="Script_e_LOG"
#Pasta do script original
pastascriptORI="Script"
#Nome do script
nomescript="BackupMysql_v2.sh"
#Ip do Servidor
ipserver="meuip"
#Usuário
user="usuario"
#Senha
senha="senha"
#Hora Atual
horaatual=$(date +%d-%m-%Y_%H)
#Nome Pasta Principal para BKP Diário
pastaDia="BackupBanco_Dia"
#Nome Pasta Principal para BKP Horário
pastaHora="BackupBanco_Hora"
#Bancos de dados
databases=(
"banco1"
"banco2"
"banco3"
)
#HDs para arquivar
hdds=(
"/mnt/hdd1"
"/mnt/hdd2"
"/mnt/hdd3"
)
#Percentual Aceitavel
percent="95"
#Nome da Pasta para BKP (por hora)
pastaBancoBkp="Bkp_"$horaatual
#Arquivo de Log
arqLog=$tempproj/$tempfd/"Log_"$horaatual".txt"
#Pasta do arquivo de marcação
marcadorArq=$tempproj/$pastascriptORI/"hd.txt"
################################### /VARIÁVEIS GERAIS #####################################
##################################### FUNÇÕES GERAIS ######################################
#Imprimir dados
function Imprimir(){
echo $* >> $arqLog
}
#Pular linha de acordo com a quantidade informada
function PularLinhas(){
#Loop
for i in $(seq 1 $*);
do
#Quebra de Linha
Imprimir -e "\n\r"
done
}
#Criar arquivo de marcação com dados do hd atual
function Marcador(){
echo $* > $marcadorArq
}
#Checar espaço em disco
function CheckSpace(){
##Guardar Informações do disco em variáveis
esp=($(df $* |awk 'NR==2 {print $2,$3,$4,$5}'|sed 's/%//'))
#Percentual utilizado
space_percent="${esp[3]}"
#Espaço livre
space_free="${esp[2]}"
#Espaço utilizado
space_occupied="${esp[1]}"
#Espaço total
space_total="${esp[0]}"
#Condição para verificar se espaço em disco
if [[ $space_percent -gt $percent ]] && PularLinhas 1
then
#Exibir informacoes
Imprimir "-- Status: Error | Message: Disco cheio | Volume: "$*" | Espaço Total: "$space_total" | Espaço Livre: "$space_free" | Espaço Ocupado: "$space_occupied" | Percentual Ocupado: "$space_percent" |"
#Variável para retorno, identificando se ocorreu erro ou não
retorno=0
else
#Exibir informações
Imprimir "-- Status: Ok | Message: Disco selecionado | Volume: "$*" | Espaço Total: "$space_total" | Espaço Livre: "$space_free" | Espaço Ocupado: "$space_occupied" | Percentual Ocupado: "$space_percent" |"
#Variável para retorno, identificando se ocorreu erro ou não
retorno=1
fi
#Retornar resultado do identificador
return $retorno
}
#Formatar disco
function FormatDisk () {
#Exibir informações
Imprimir "Apagando os arquivos em $*"
#Apagar
rm -rf $*/*
}
#Montar Loop de Array de HDs
function VarrerArrayHDD (){
# ARQUIVO DE MARCAÇÃO PARA
# VERIFICAR O HD UTILIZADO ATUALMENTE
##
#Verificar se Arquivo de marcação existe
if [ -e "$marcadorArq" ];
then
#SE EXISTIR
#Ler arquivo
while read line; do
#Selecionar Disco
disk_arq=$line
#Fim
done < $marcadorArq
else
#SE NÃO EXISTIR
#Selecionar primeiro disco
disk_arq=${hdds[0]}
#Criar arquivo de marcação
Marcador $disk_arq
fi
#
# LOOP PARA COLETAR O PRÓXIMO HD
##
#Iniciar Contador
c=0
#Loop HDs
for i in ${hdds[@]};
do
#Guardar nome em variável
disk0=$i
#Se o disco selecionado no loop for igual ao escrito no arquivo
if [ $disk0 == $disk_arq ]
then
#Condição para verificar se é o ultimo disco
if [ $disk0 == ${hdds[@]: -1} ]
then
#Selecionar próximo disco (primeiro)
disk1=${hdds[0]}
else
#Somar contador
c=$(($c+1))
#Selecionar próximo disco
disk1=${hdds[$c]}
fi
#Verificar espaço em disco
CheckSpace $disk0
#Se a função retornar 1, o primeiro disco verificado contém espaço livre
#Seleciona e o mantém no arquivo de marcação
if [ $retorno == 1 ]
then
#Disco Selecionado
selec_disk=$disk0
else
#Formatar próximo disco
FormatDisk $disk1
#Criar arquivo de marcação
Marcador $disk1
#Disco Selecionado
selec_disk=$disk1
fi
#Parar Loop
break;
else
Imprimir ""
fi
#Somar contador
c=$(($c+1))
done
}
#Criar Pastas
function CriarPasta(){
#Condição para ver se a pasta já existe
if [ -d $* ]
then
#Imprimir mensagem
Imprimir "-- Pasta já existente, não necessita ser criada."
else
#Criar Pasta
mkdir $*
#Condição informar se ouve erro ao deletar
if [[ $? == 0 ]]
then
#Imprimir mensagem
Imprimir "-- A pasta foi criada com sucesso."
else
#Imprimir mensagem
Imprimir "-- ATENÇÃO! Erro ao criar pasta."
fi
fi
}
#Montar Loop de Array de Databases
function VarrerArrayDB (){
#Loop DataBases
for i in ${databases[@]};
do
#Guardar nome em variável
database_selec=$i
#Imprimir mensagem
Imprimir "- Selecionando DataBase: "$database_selec
#Chamar SubFunção
eval $* $database_selec
#Quebra de Linha
PularLinhas 1
done
}
#Exportar DB
function ExportDB (){
#Imprimir mensagem
Imprimir "- Verificando se existe..."
#Verificar se tabela existe
mysql -h $ipserver -u $user -p$senha -e "USE $*"
#Condição para exportar database caso exista
if [[ $? == 0 ]]
then
#Imprimir mensagem
Imprimir "-- OK"
Imprimir "- Exportando..."
#Exportar database
/usr/bin/mysqldump -h $ipserver -u $user -p$senha --routines --triggers --single-transaction --quick $* > $tempproj/$tempfd/$*"_"$horaatual.sql
#Condição informar se ouve erro ao exportar database
if [[ $? == 0 ]]
then
#Imprimir mensagem
Imprimir "-- Exportado com sucesso."
else
#Imprimir mensagem
Imprimir "-- ATENÇÃO! Erro ao exportar."
fi
else
#Imprimir mensagem
Imprimir "-- ATENÇÃO! DataBase não existe."
fi
}
#Compactar DB
function CompactDB (){
#Imprimir mensagem
Imprimir "- Verificando se arquivo exportado existe..."
#Definir arquivo exportado
arq_exp=$tempproj/$tempfd/$*"_"$horaatual.sql
#Condição para verificar se arquivo exportado existe
if [ -e $arq_exp ] ; then
#Imprimir mensagem
Imprimir "-- OK"
Imprimir "- Compactando..."
#Compactar
tar Jcf $tempproj/$tempfd/$*"_"$horaatual.tar.xz $arq_exp
#Condição informar se ouve erro na compactação
if [[ $? == 0 ]]
then
#Imprimir mensagem
Imprimir "-- Compactado com sucesso."
else
#Imprimir mensagem
Imprimir "-- ATENÇÃO! Erro ao compactar."
fi
else
Imprimir "-- ATENÇÃO! Arquivo exportado deste banco não existe."
fi
}
#Deletar DB
function DeleteDB() {
#Imprimir mensagem
Imprimir "- Verificando se arquivo exportado existe..."
#Definir arquivo exportado
arq_exp=$tempproj/$tempfd/$*"_"$horaatual.sql
#Condição para verificar se arquivo exportado existe
if [ -e $arq_exp ] ; then
#Imprimir mensagem
Imprimir "-- OK"
Imprimir "- Deletando..."
#Deletar
rm $arq_exp
#Condição informar se ouve erro ao deletar
if [[ $? == 0 ]]
then
#Imprimir mensagem
Imprimir "-- Deletado com sucesso."
else
#Imprimir mensagem
Imprimir "-- ATENÇÃO! Erro ao deletar."
fi
else
Imprimir "-- ATENÇÃO! Arquivo exportado deste banco não existe."
fi
}
#Mover DB
function MoveDB() {
#Imprimir mensagem
Imprimir "- Verificando se arquivo exportado existe..."
#Definir arquivo exportado
arq_exp=$tempproj/$tempfd/$*"_"$horaatual.tar.xz
#Condição para verificar se arquivo exportado existe
if [ -e $arq_exp ] ; then
#Imprimir mensagem
Imprimir "-- OK"
Imprimir "- Movendo..."
#Mover
mv $arq_exp $pastabkp
#Condição informar se ouve erro ao mover
if [[ $? == 0 ]]
then
#Imprimir mensagem
Imprimir "-- Movido com sucesso."
else
#Imprimir mensagem
Imprimir "-- ATENÇÃO! Erro ao mover."
fi
else
Imprimir "-- ATENÇÃO! Arquivo exportado deste banco não existe."
fi
}
#################################### /FUNÇÕES GERAIS ######################################
#Quebra de Linha
PularLinhas 1
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ Backup Banco de dados v2.1 +"
Imprimir "+ Mysql - Backup +"
Imprimir "+=================================+"
#Quebra de Linha
PularLinhas 1
######################################### BLOCO 1 #########################################
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ INÍCIO DO BLOCO 1/7 +"
Imprimir "+ Verificar espaço em disco de +"
Imprimir "+ acordo com percentual ajustado +"
Imprimir "+ "$percent" +"
Imprimir "+=================================+"
#Chamar função para varrer array
VarrerArrayHDD
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ TÉRMINO DO BLOCO 1/7 +"
Imprimir "+=================================+"
######################################## /BLOCO 1 #########################################
#Quebra de Linha
PularLinhas 2
######################################### BLOCO 2 #########################################
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ INÍCIO DO BLOCO 2/7 +"
Imprimir "+ Preparar Pastas +"
Imprimir "+=================================+"
#Quebra de Linha
PularLinhas 1
#Definir Pasta Principal
if [ $(date +%H) = 23 ]
then
pastacopia=$pastaDia
Imprimir "- Selecionado Pasta Principal: Pasta Dia."
else
pastacopia=$pastaHora
Imprimir "- Selecionado Pasta Principal: Pasta Hora."
fi
#Preparar variáveis
pastaprincipal=$selec_disk/$pastacopia
pastabkp=$pastaprincipal/$pastaBancoBkp
pastascript=$pastabkp/$pastascriptBKP
#Criar pasta principal
Imprimir "- Criando pasta principal..."
CriarPasta $pastaprincipal
#Criar pasta banco bkp
Imprimir "- Criando pasta para BKP..."
CriarPasta $pastabkp
#Criar pasta banco bkp
Imprimir "- Criando pasta para script..."
CriarPasta $pastascript
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ TÉRMINO DO BLOCO 2/7 +"
Imprimir "+=================================+"
######################################## /BLOCO 2 #########################################
#Quebra de Linha
PularLinhas 2
######################################### BLOCO 3 #########################################
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ INÍCIO DO BLOCO 3/7 +"
Imprimir "+ Exportar DataBases +"
Imprimir "+=================================+"
#Chamar função para varrer array indicando qual subfunção executar
VarrerArrayDB ExportDB
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ TÉRMINO DO BLOCO 3/7 +"
Imprimir "+=================================+"
######################################## /BLOCO 3 #########################################
#Quebra de Linha
PularLinhas 2
######################################### BLOCO 4 #########################################
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ INÍCIO DO BLOCO 4/7 +"
Imprimir "+ Compactar DataBases +"
Imprimir "+=================================+"
#Chamar função para varrer array indicando qual subfunção executar
VarrerArrayDB CompactDB
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ TÉRMINO DO BLOCO 4/7 +"
Imprimir "+=================================+"
######################################## /BLOCO 4 #########################################
#Quebra de Linha
PularLinhas 2
######################################### BLOCO 5 #########################################
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ INÍCIO DO BLOCO 5/7 +"
Imprimir "+ Apagar DataBases +"
Imprimir "+=================================+"
#Chamar função para varrer array indicando qual subfunção executar
VarrerArrayDB DeleteDB
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ TÉRMINO DO BLOCO 5/7 +"
Imprimir "+=================================+"
######################################## /BLOCO 5 #########################################
#Quebra de Linha
PularLinhas 2
######################################### BLOCO 6 #########################################
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ INÍCIO DO BLOCO 6/7 +"
Imprimir "+ Mover Arquivos +"
Imprimir "+=================================+"
#Chamar função para varrer array indicando qual subfunção executar
VarrerArrayDB MoveDB
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ TÉRMINO DO BLOCO 6/7 +"
Imprimir "+=================================+"
######################################## /BLOCO 6 #########################################
#Quebra de Linha
PularLinhas 2
######################################### BLOCO 7 #########################################
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ INÍCIO DO BLOCO 7/7 +"
Imprimir "+ Finalizar +"
Imprimir "+=================================+"
Imprimir "- Copiando Script..."
cp $tempproj/$pastascriptORI/$nomescript $pastascript
#Condição informar se ouve erro ao Copiar
if [[ $? == 0 ]]
then
#Imprimir mensagem
Imprimir "-- Copiado com sucesso."
else
#Imprimir mensagem
Imprimir "-- ATENÇÃO! Erro ao copiar."
fi
Imprimir "- Movendo LOG..."
#Mover
mv $arqLog $pastascript
#Alterar Caminho do LOG
arqLog=$pastascript/"Log_"$horaatual".txt"
#Condição informar se ouve erro ao Mover
if [[ $? == 0 ]]
then
#Imprimir mensagem
Imprimir "-- Movido com sucesso."
else
#Imprimir mensagem
Imprimir "-- ATENÇÃO! Erro ao mover."
fi
Imprimir "FIM :D"
#Quebra de Linha
PularLinhas 2
#Imprimir mensagem
Imprimir "+=================================+"
Imprimir "+ TÉRMINO DO BLOCO 7/7 +"
Imprimir "+=================================+"
######################################## /BLOCO 7 #########################################