Skip to content

Instantly share code, notes, and snippets.

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 jackbillstrom/6ed7cdfda5bc230c37f0d07a00120497 to your computer and use it in GitHub Desktop.
Save jackbillstrom/6ed7cdfda5bc230c37f0d07a00120497 to your computer and use it in GitHub Desktop.
Backup multiple MS SQL Databases from a Docker Container on Ubuntu
#!/bin/bash
DATE=$(printf '%(%Y-%m-%d)T\n')
CONTAINER_NAME="mssql"
SA_PASSWORD="PASSWORD"
DB_NAMES=("DB1" "DB1")
HOME_DIR="/home/ubuntu"
backup_database() {
for DB_NAME in "${DB_NAMES[@]}"; do
EXPORT_NAME_FINAL="${DB_NAME}_full_${DATE}"
CONTAINER_PATH="/var/opt/mssql/backup/${DB_NAME}_${DATE}.bak"
echo "Utför backup utav $DB_NAME i docker container $CONTAINER_NAME ..."
sudo docker exec -i $CONTAINER_NAME /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P $SA_PASSWORD \
-Q "BACKUP DATABASE [$DB_NAME] TO DISK = N'$CONTAINER_PATH' WITH NOFORMAT, NOINIT, NAME = '$EXPORT_NAME_FINAL', SKIP, NOREWIND, NOUNLOAD, STATS = 10" &
if [ $? -eq 0 ]; then
echo "Extraherar backup från container till hosten..."
sudo docker cp $CONTAINER_NAME:$CONTAINER_PATH $HOME_DIR/sql_backups/$EXPORT_NAME_FINAL.bak &
if [ $? -eq 0 ]; then
echo "✅ Backup utav $DB_NAME från $CONTAINER_NAME är nu slutförd!"
else
echo "❌ Det gick inte att extrahera backup för $DB_NAME"
fi
else
echo "❌ Det gick inte att skapa backup för $DB_NAME"
fi
done
wait # Vänta på att alla bakgrundsprocesser ska slutföras
}
restore_database() {
# Läs in alla .bak-filer i en array
mapfile -t files < <(ls /home/ubuntu/sql_backups/*.bak)
# Skapa en meny och fråga användaren att välja en fil
echo "Välj en backupfil att återställa:"
select file in "${files[@]}"; do
# Om användaren inte valde en giltig fil, avsluta
[[ -n $file ]] || { echo "Ogiltigt val." >&2; exit 1; }
# Extrahera databasnamnet från filnamnet
DB_NAME=$(basename "$file" | cut -d'_' -f1)
# Återställ databasen
echo "Återställer $DB_NAME från $file ..."
CONTAINER_PATH="/var/opt/mssql/backup/$(basename "$file")"
sudo docker cp "$file" "$CONTAINER_NAME:$CONTAINER_PATH"
sudo docker exec -it $CONTAINER_NAME /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P $SA_PASSWORD \
-Q "RESTORE DATABASE [$DB_NAME] FROM DISK = N'$CONTAINER_PATH' WITH MOVE '$DB_NAME' TO '/var/opt/mssql/data/$DB_NAME.mdf', MOVE '$DB_NAME_UserData' TO '/var/opt/mssql/data/$DB_NAME_userdata.ndf', MOVE '$DB_NAME_Log' TO '/var/opt/mssql/data/$DB_NAME.ldf', STATS = 10"
echo "Validerar återställning..."
sudo docker exec -it $CONTAINER_NAME /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P $SA_PASSWORD \
-Q 'SELECT Name FROM sys.Databases'
done
}
if [[ $# -gt 0 ]]; then
case $1 in
backup)
backup_database
;;
restore)
restore_database
;;
*)
echo "ogiltigt val"
;;
esac
else
# Skapa en huvudmeny för att välja mellan backup och restore
echo "Välj en operation:"
select opt in "Backup" "Restore"; do
case $opt in
Backup)
backup_database
break
;;
Restore)
restore_database
break
;;
*) echo "ogiltigt val";;
esac
done
fi
@jackbillstrom
Copy link
Author

Now updated on a "restore" select option

./backup_ms_sql_database_inside_a_docker_container.sh backup for quick backups

@jackbillstrom
Copy link
Author

Included variable for home folder and running backup-jobs in parallel

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment