Last active
May 25, 2023 20:36
-
-
Save jackbillstrom/6ed7cdfda5bc230c37f0d07a00120497 to your computer and use it in GitHub Desktop.
Backup multiple MS SQL Databases from a Docker Container on Ubuntu
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
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
Now updated on a "restore" select option
./backup_ms_sql_database_inside_a_docker_container.sh backup
for quick backups