Browse Source

Script para restauração da base de dados (#3133)

* Adiciona script para restaurar a base de dados e migra-lá sem erros

Separa comando em funções

Finaliza script

Adiciona alerta de operação

Troca interpretador para facilitar portabilidade

Adiciona getopts para pegar parâmetros

Adiciona alerta para migração

Adiciona mensagem de uso com erro

Corrige verificação de parâmetros

Corrige confirmação de operação

Corrige verificações e criações de diretórios de log

Adiciona parada quando há erro na restauração

Adiciona criação da role postgres

Altera padrão de nome para arquivos de logs

Altera nome de função

Corrige configuração de parâmetros

Altera espaços por \t

Altera nomes dos diretórios para as restaurações

Adiciona diretório restauracoes no gitignore

Adiciona usuário da base de dados

Corrige restauração da base de dados

Corrige verificação do esquema public

Corrige verificação da role postgres

* Update scripts/restore_db.sh

Co-authored-by: Edward <9326037+edwardoliveira@users.noreply.github.com>
pull/3367/head
Vinícius Cantuária 5 years ago
committed by João Rodrigues
parent
commit
a4bf03e3f8
  1. 2
      .gitignore
  2. 124
      scripts/restore_db.sh

2
.gitignore

@ -105,3 +105,5 @@ solr-*/
# ignora tudo dentro de media, mas cria a pasta no checkout
media/*
!media/.gitkeep
restauracoes/*

124
scripts/restore_db.sh

@ -0,0 +1,124 @@
#!/usr/bin/env bash
# shellcheck disable=SC2086
ajuda_uso() {
echo -e "\033[33mUso\033[0m: $0 [-h] -f <caminho-do-dump> [-p <porta-do-banco-de-dados>]"
echo " -h (Ajuda)"
echo -e "\tAjuda de uso."
echo " -f (Arquivo)"
echo -e "\tCaminho do arquivo do dump."
echo -e "\tEx.: ~/Downloads/teste.backup"
echo " -p (Porta)"
echo -e "\tPorta do banco de dados, valor opcional. De 1 até 65535"
echo -e "\tValor padrão é 5432."
}
valida_parametros() {
if [[ -z $CAMINHO_DUMP ]]; then
ajuda_uso
exit 1
elif [[ ! -e $CAMINHO_DUMP ]]; then
echo -e "\033[31mERRO\033[0m Dump não encontrado com o caminho fornecido!"
exit 1
fi
if [[ -z $PORTA ]]; then
PORTA="5432"
elif ! [[ $PORTA =~ ^[0-9]+$ ]] || { [[ $PORTA -lt 1 ]] || [[ $PORTA -gt 65535 ]]; }; then
ajuda_uso
exit 1
fi
}
confirma_operacao() {
echo -e "\033[33mALERTA\033[0m\t\tEsta operação apagará todo o conteúdo da base de dados atual e restaurará o dump!"
while ! [[ $ESCOLHA =~ ^[sSyYnN]+$ ]]; do
read -rp " Deseja continuar? " ESCOLHA
done
[[ $ESCOLHA =~ ^[nN]+$ ]] && exit 0
}
cria_diretorio_restauracoes() {
echo -e "\n\033[33mEXECUÇÃO\033[0m\tCriando diretório $BASE_DIR/restauracoes/\033[1mrestauracao_${HORARIO}\033[0m ..."
if mkdir -p $BASE_DIR/restauracoes/restauracao_${HORARIO} &>/dev/null; then
echo -e "\033[32mSUCESSO\033[0m\t\tDiretório \033[1mrestauracao_${HORARIO}\033[0m criado.\n"
else
echo -e "\033[31mERRO\033[0m\t\tNão foi possível criar o diretório \033[1mrestauracao_${HORARIO}\033[0m."
exit 1
fi
}
restaura_base_de_dados() {
echo -e "\033[33mEXECUÇÃO\033[0m [1/2] Restaurando a base de dados..."
HAS_SCHEMA_PUBLIC=$(psql $PGURL -tAc "SELECT 1 FROM information_schema.schemata WHERE schema_name='public'")
if [[ -n $HAS_SCHEMA_PUBLIC ]]; then
if ! psql $PGURL -c "DROP SCHEMA public CASCADE;"\
&> $BASE_DIR/restauracoes/restauracao_${HORARIO}/restauracao_$DUMP.log; then
echo -e "\033[31mERRO\033[0m\t\tHouve um erro no banco de dados."
exit 1
fi
fi
HAS_ROLE_POSTGRES=$(psql $PGURL -tAc "SELECT 1 FROM pg_roles WHERE rolname='postgres'")
if [[ -z $HAS_ROLE_POSTGRES ]]; then
psql $PGURL -c "CREATE ROLE postgres;"\
>> $BASE_DIR/restauracoes/restauracao_${HORARIO}/restauracao_$DUMP.log 2>&1
fi
if ! pg_restore -d $PGURL -e $CAMINHO_DUMP\
>> $BASE_DIR/restauracoes/restauracao_${HORARIO}/restauracao_$DUMP.log 2>&1; then
echo -e "\033[31mERRO\033[0m\t\tHouve um erro ao tentar restaurar a base de dados."
exit 1
fi
echo -e "\033[32mSUCESSO\033[0m\t\tRestauração concluida.\n"
}
gera_relatorio_base_de_dados() {
echo -e "\033[33mEXECUÇÃO\033[0m [2/2] Criando relatório da base de dados restaurada com \033[1m$DUMP\033[0m..."
psql $PGURL -P pager=off -c "
SELECT relname as tabelas,
n_live_tup as qntd_de_registros
FROM pg_stat_user_tables
ORDER BY relname ASC,
n_live_tup DESC;
" &> $BASE_DIR/restauracoes/restauracao_${HORARIO}/relatorio_$DUMP.log
echo -e "\033[32mSUCESSO\033[0m\t\tRelatório concluida.\n"
}
alerta_migracao() {
echo -e "\033[33mALERTA\033[0m\t\tExecute a migração da base de dados com o comando \033[1mpython3 manage.py migrate\033[0m."
}
HORARIO=$(date +'%Y-%m-%d_%H-%M-%S')
while getopts "h f: p:" opcao; do
case $opcao in
h)ajuda_uso
exit;;
f)CAMINHO_DUMP="$OPTARG";;
p)PORTA="$OPTARG";;
*)ajuda_uso
exit 1;;
esac
done
valida_parametros
confirma_operacao
BASE_DIR=${PWD%/scripts}
DUMP=${CAMINHO_DUMP##*/}
PGUSER=${PGUSER:-"sapl"}
PGPASSWORD=${PGPASSWORD:-"sapl"}
PGHOST=${PGHOST:-"localhost"}
PGPORT=${PORTA:-"5432"}
PGDATABASE=${PGDATABASE:-"sapl"}
PGURL="postgresql://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$PGDATABASE"
cria_diretorio_restauracoes
restaura_base_de_dados
gera_relatorio_base_de_dados
alerta_migracao
Loading…
Cancel
Save