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.
Tenho um servidor de bando de dados (vou chamá-lo de SVA) e um outro somente para backup deste (vou chamá-lo de SVB). O SVB roda uma tarefa pelo cron a cada hora executando um bash. Basicamente ele exporta 3 bancos (20gb) do SVA para o SVB, depois compacta e salva-os em uma pasta específica ("BKP_09_04_2019_16h"). O SVB tem 3 hd´s disponíveis, onde gostaria de automatizar a escolha destes (ao completar o primeiro HD, escolhe o segundo, se este estiver cheio, escolhe o terceiro, se este estiver cheio, apaga e escolhe o primeiro, e assim sucessivamente).
Sei que muitos poderão dizer sobre a necessidade de manter esse número de backups e até de apagar os mais antigos, uma vez que estou guardando por um bom tempo, porém como sou apenas um funcionário, não tenho muito direito a votos (kkkkkkkk), ficando difícil convencê-los a adotar uma medida melhor, até por desconhecimento de qual seria.
Enfim, fiz um script (segue abaixo) que aparentemente está funcionando, mas gostaria da ajuda de vocês para verificar se estou fazendo correto ou se da pra melhorar de alguma maneira, ou ainda se alguém sabe se existe um software que faça algo semelhante rsrs.
Desde já agradeço a ajuda.
Tenho um servidor de bando de dados (vou chamá-lo de SVA) e um outro somente para backup deste (vou chamá-lo de SVB). O SVB roda uma tarefa pelo cron a cada hora executando um bash. Basicamente ele exporta 3 bancos (20gb) do SVA para o SVB, depois compacta e salva-os em uma pasta específica ("BKP_09_04_2019_16h"). O SVB tem 3 hd´s disponíveis, onde gostaria de automatizar a escolha destes (ao completar o primeiro HD, escolhe o segundo, se este estiver cheio, escolhe o terceiro, se este estiver cheio, apaga e escolhe o primeiro, e assim sucessivamente).
Sei que muitos poderão dizer sobre a necessidade de manter esse número de backups e até de apagar os mais antigos, uma vez que estou guardando por um bom tempo, porém como sou apenas um funcionário, não tenho muito direito a votos (kkkkkkkk), ficando difícil convencê-los a adotar uma medida melhor, até por desconhecimento de qual seria.
Enfim, fiz um script (segue abaixo) que aparentemente está funcionando, mas gostaria da ajuda de vocês para verificar se estou fazendo correto ou se da pra melhorar de alguma maneira, ou ainda se alguém sabe se existe um software que faça algo semelhante rsrs.
Desde já agradeço a ajuda.
#!/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 #########################################