Skip to content

Instantly share code, notes, and snippets.

@rogerioadris
Created May 31, 2022 23:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rogerioadris/3b11021b4c31f9dcd467f02e1673bd35 to your computer and use it in GitHub Desktop.
Save rogerioadris/3b11021b4c31f9dcd467f02e1673bd35 to your computer and use it in GitHub Desktop.
Restaurar banco de dados MSSQL no contêiner Docker
#!/bin/bash
echo "Restaurando banco de dados..."
RED='\033[0;31m'
GRE='\033[0;32m'
NC='\033[0m'
DATABASE=""
FILE_FULL=""
FILE_DIFF=""
FILES_LOG=()
#
# Encontrar arquivos
#
function find_files {
echo "Encontrando arquivos"
for restoreFile in /var/opt/mssql/backup/*.{bak,trn}
do
fileName=${restoreFile##*/}
if [[ $restoreFile == *"_Dados_"* && $restoreFile != *"_Diferencial_Dados_"* ]]; then
DATABASE=${fileName%%_Dados*.bak}
FILE_FULL=$restoreFile
elif [[ $restoreFile == *"_Diferencial_Dados_"* ]]; then
FILE_DIFF=$restoreFile
else
FILES_LOG+=($restoreFile)
fi
done
LOGS_TOTAL=$(( ${#FILES_LOG[*]} - 1 ))
LOGS_LAST=${FILES_LOG[$LOGS_TOTAL]}
echo "Arquivos encontrados: "
echo -e "\t Banco dados: ${GRE}${DATABASE}${NC}"
echo -e "\t\tFull: ${GRE}${FILE_FULL}${NC}"
echo -e "\t\tDiff: ${GRE}${FILE_DIFF}${NC}"
echo -e " Arquivos de logs: ${GRE}${LOGS_TOTAL}${NC}"
}
#
# Montar SQL
#
function generate_command {
command=""
command="${command}USE [master];"
# Arquivo FULL
command="$command RESTORE DATABASE [${DATABASE}] "
command="$command FROM DISK = N'$FILE_FULL' "
command="$command WITH FILE = 1, "
command="$command MOVE N'${DATABASE}' TO N'/var/opt/mssql/data/${DATABASE}.mdf', "
command="$command MOVE N'${DATABASE}_log' TO N'/var/opt/mssql/data/${DATABASE}_log.ldf', "
command="$command NORECOVERY, NOUNLOAD, REPLACE, STATS = 5 "
# Arquivo Diff
command="$command RESTORE DATABASE [${DATABASE}] FROM DISK = N'${FILE_DIFF}' "
command="$command WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5 "
# Arquivos de log
for file in "${FILES_LOG[@]}"; do
# Verificar se é último arquivo de log, não deve ter NORECOVERY no comando
if [[ $file == $LOGS_LAST ]]; then
command="${command} RESTORE LOG [${DATABASE}] FROM DISK = N'$file' WITH FILE = 1, NOUNLOAD, STATS = 5 "
break
else
command="${command} RESTORE LOG [${DATABASE}] FROM DISK = N'$file' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5 "
fi
done
#
command="${command};"
# command="${command}ALTER DATABASE [${DATABASE}] SET MULTI_USER;"
echo $command;
}
#
# Executar
#
function execute {
command=$1
if [ ! -f "/var/opt/mssql/data/${DATABASE}.mdf" ]; then
touch "/var/opt/mssql/data/${DATABASE}.mdf"
fi
if [ ! -f "/var/opt/mssql/data/${DATABASE}_log.ldf" ]; then
touch "/var/opt/mssql/data/${DATABASE}_log.ldf"
fi
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $MSSQL_SA_PASSWORD -Q "$command"
}
#
#
#
find_files
command=$(generate_command)
execute "$command"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment