From a4bf03e3f82a5e83d58ece2006b35285cdb2c081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?= Date: Mon, 1 Jun 2020 15:13:12 -0300 Subject: [PATCH] =?UTF-8?q?Script=20para=20restaura=C3=A7=C3=A3o=20da=20ba?= =?UTF-8?q?se=20de=20dados=20(#3133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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> --- .gitignore | 2 + scripts/restore_db.sh | 124 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100755 scripts/restore_db.sh diff --git a/.gitignore b/.gitignore index e59540379..fc095f5ef 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,5 @@ solr-*/ # ignora tudo dentro de media, mas cria a pasta no checkout media/* !media/.gitkeep + +restauracoes/* diff --git a/scripts/restore_db.sh b/scripts/restore_db.sh new file mode 100755 index 000000000..d2c787141 --- /dev/null +++ b/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 [-p ]" + 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