Add mssql-backup.sh
This commit is contained in:
commit
b66d01ebc1
165
mssql-backup.sh
Normal file
165
mssql-backup.sh
Normal file
@ -0,0 +1,165 @@
|
||||
#!/bin/bash
|
||||
# Script per il backup di database MS SQL Server
|
||||
# Autore: Lorenzo Paciotti & Mattia Tadini
|
||||
# Nome del file: mssql-backup.sh
|
||||
# Revisione: 1.00
|
||||
|
||||
# Configuration
|
||||
BACKUP_DIR="/zucchetti/backupdb/bkfiles"
|
||||
SQLCMD="/opt/mssql-tools18/bin/sqlcmd"
|
||||
USER="sa"
|
||||
PASSWORD="DBP0l01nf0.."
|
||||
HOST="localhost"
|
||||
RETENTION=1 # Retention per i backup locali
|
||||
REMOTE_RETENTION=2 # Retention per i backup remoti
|
||||
DATE=$(LC_TIME=C date +%Y%m%d%H%M%S) # Forza il formato della data
|
||||
SERVER_NAME="DBSQL01" # Identificativo del server fisico
|
||||
LOG_FILE="/zucchetti/backupdb/backup_log.txt"
|
||||
ERROR_LOG_FILE="/zucchetti/backupdb/backup_err.txt"
|
||||
FTP_SERVER="terni.poloinformatico.it"
|
||||
FTP_USER="backupmssqldb"
|
||||
FTP_PASSWORD="!Li'D/i%2&*QkvK!"
|
||||
REMOTE_DIR="/BackupDB"
|
||||
SMTP_SERVER="smtp://relay.poloinformatico.it:587"
|
||||
SMTP_USER="brass@relay.poloinformatico.it"
|
||||
SMTP_PASS="DMKqP9vUYn8s"
|
||||
|
||||
# Check if a database name is provided as an argument
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <database_name>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DB_NAME=$1
|
||||
LOCAL_DB_DIR="$BACKUP_DIR/$DB_NAME"
|
||||
REMOTE_DB_DIR="$REMOTE_DIR/$DB_NAME"
|
||||
|
||||
# Create local backup directory if it doesn't exist
|
||||
mkdir -p "$LOCAL_DB_DIR"
|
||||
chown mssql:mssql "$LOCAL_DB_DIR"
|
||||
# Create remote directory on FTP server if it doesn't exist
|
||||
ftp -inv $FTP_SERVER <<EOF >> $LOG_FILE 2>> $ERROR_LOG_FILE
|
||||
user $FTP_USER $FTP_PASSWORD
|
||||
mkdir "$REMOTE_DB_DIR"
|
||||
bye
|
||||
EOF
|
||||
|
||||
BACKUP_FILE="$LOCAL_DB_DIR/${DB_NAME}_backup_$DATE.bak"
|
||||
REMOTE_BACKUP_FILE="${DB_NAME}_backup_$DATE.bak"
|
||||
LOCAL_STATUS=0
|
||||
FTP_STATUS=0 # Indica lo stato dell'upload FTP (0: success, 1: failure)
|
||||
|
||||
# Function to send email with msmtp
|
||||
send_email() {
|
||||
SUBJECT="Backup [${EMAIL_STATUS}] for $DB_NAME on $SERVER_NAME - $(LC_TIME=C date)"
|
||||
MESSAGE="Backup process completed. Check the details below:\n\n$(cat $LOG_FILE)"
|
||||
|
||||
echo -e "Subject: $SUBJECT\nFrom: $SMTP_USER\nTo: $SMTP_USER\n\n$MESSAGE" | msmtp --debug --from="$SMTP_USER" -t
|
||||
}
|
||||
|
||||
# Start time for the backup
|
||||
START_TIME=$(date +%s)
|
||||
echo "$(LC_TIME=C date): Starting backup for database: $DB_NAME on server $SERVER_NAME" > $LOG_FILE
|
||||
|
||||
# Perform database backup with CHECK option
|
||||
$SQLCMD -S $HOST -U $USER -P $PASSWORD -Q "BACKUP DATABASE [$DB_NAME] TO DISK = N'$BACKUP_FILE' WITH CHECKSUM, COMPRESSION, INIT" -C >> $LOG_FILE 2>> $ERROR_LOG_FILE
|
||||
|
||||
# Check if the local backup was successful
|
||||
if [ $? -eq 0 ]; then
|
||||
LOCAL_STATUS=0
|
||||
echo "$(LC_TIME=C date): Local backup completed successfully for $DB_NAME." >> $LOG_FILE
|
||||
else
|
||||
LOCAL_STATUS=1
|
||||
echo "$(LC_TIME=C date): Error during local backup of $DB_NAME. Check error log." >> $LOG_FILE
|
||||
fi
|
||||
|
||||
# End time and duration
|
||||
END_TIME=$(date +%s)
|
||||
DURATION=$((END_TIME - START_TIME))
|
||||
echo "$(LC_TIME=C date): Backup ended for $DB_NAME." >> $LOG_FILE
|
||||
echo "Start time: $(LC_TIME=C date -d @$START_TIME)" >> $LOG_FILE
|
||||
echo "End time: $(LC_TIME=C date -d @$END_TIME)" >> $LOG_FILE
|
||||
echo "Duration: $((DURATION / 60)) minutes and $((DURATION % 60)) seconds" >> $LOG_FILE
|
||||
|
||||
# Upload backup to remote FTP server
|
||||
echo "$(LC_TIME=C date): Starting FTP upload for $DB_NAME." >> $LOG_FILE
|
||||
ftp -inv $FTP_SERVER >> $LOG_FILE 2>> $ERROR_LOG_FILE <<EOF
|
||||
user $FTP_USER $FTP_PASSWORD
|
||||
cd $REMOTE_DB_DIR
|
||||
put $BACKUP_FILE $REMOTE_BACKUP_FILE
|
||||
bye
|
||||
EOF
|
||||
|
||||
# Check FTP status
|
||||
if [ $? -eq 0 ]; then
|
||||
FTP_STATUS=0
|
||||
echo "$(LC_TIME=C date): FTP upload completed successfully for $DB_NAME." >> $LOG_FILE
|
||||
else
|
||||
FTP_STATUS=1
|
||||
echo "$(LC_TIME=C date): Error during FTP upload for $DB_NAME. Check error log." >> $LOG_FILE
|
||||
fi
|
||||
|
||||
# Local retention policy
|
||||
ls -1tr $LOCAL_DB_DIR/${DB_NAME}_backup_*.bak | head -n -$RETENTION | xargs -d '\n' rm -f >> $LOG_FILE 2>> $ERROR_LOG_FILE
|
||||
|
||||
# Remote retention policy
|
||||
echo "$(LC_TIME=C date): Performing remote retention check." >> $LOG_FILE
|
||||
|
||||
# Otteniamo la lista dei file remoti (escludiamo informazioni non rilevanti come dati FTP)
|
||||
ftp -inv $FTP_SERVER <<EOF > /tmp/ftp_file_list.txt 2>> $ERROR_LOG_FILE
|
||||
user $FTP_USER $FTP_PASSWORD
|
||||
cd $REMOTE_DB_DIR
|
||||
ls
|
||||
bye
|
||||
EOF
|
||||
|
||||
# Filtriamo la lista per estrarre solo i nomi dei file (ignoriamo righe di tipo 'drwxr-xr-x', 'total', etc.)
|
||||
grep -E -o '\S+_backup_[0-9]{14}\.bak' /tmp/ftp_file_list.txt | while read -r file; do
|
||||
# Verifica se il nome del file contiene il nome del database
|
||||
if [[ "$file" =~ ^$DB_NAME ]]; then
|
||||
# Estrai la data dal nome del file (formato DBNAME_backup_DATE.bak)
|
||||
file_date=$(echo "$file" | sed -n 's/.*_backup_\([0-9]\{14\}\)\.bak/\1/p')
|
||||
|
||||
# Verifica che la data sia stata estratta correttamente
|
||||
if [ -n "$file_date" ]; then
|
||||
# Aggiungi un messaggio di debug per verificare la data estratta
|
||||
echo "$(LC_TIME=C date): Data estratta dal file remoto $file: $file_date" >> $LOG_FILE
|
||||
|
||||
# Confrontiamo direttamente la data come numeri (formato YYYYMMDDHHMMSS)
|
||||
retention_date=$(LC_TIME=C date -d "-$REMOTE_RETENTION days" +%Y%m%d%H%M%S)
|
||||
|
||||
# Verifica se la data estratta è più vecchia della retention
|
||||
if [ "$file_date" -lt "$retention_date" ]; then
|
||||
# Elimina il file remoto se è troppo vecchio
|
||||
ftp -inv $FTP_SERVER <<EOF >> $LOG_FILE 2>> $ERROR_LOG_FILE
|
||||
user $FTP_USER $FTP_PASSWORD
|
||||
cd $REMOTE_DB_DIR
|
||||
delete "$file"
|
||||
bye
|
||||
EOF
|
||||
echo "$(LC_TIME=C date): File remoto $file eliminato perché più vecchio di $REMOTE_RETENTION giorni." >> $LOG_FILE
|
||||
fi
|
||||
else
|
||||
echo "$(LC_TIME=C date): Data non estratta correttamente dal nome del file remoto $file. Skipping file." >> $LOG_FILE
|
||||
fi
|
||||
else
|
||||
echo "$(LC_TIME=C date): Il file remoto $file non appartiene al database $DB_NAME. Skipping file." >> $LOG_FILE
|
||||
fi
|
||||
done
|
||||
|
||||
# Determine email status
|
||||
if [ $LOCAL_STATUS -eq 0 ] && [ $FTP_STATUS -eq 0 ]; then
|
||||
EMAIL_STATUS="SUCCESS"
|
||||
elif [ $LOCAL_STATUS -eq 1 ] || [ $FTP_STATUS -eq 1 ]; then
|
||||
EMAIL_STATUS="FAILED"
|
||||
else
|
||||
EMAIL_STATUS="WARNING"
|
||||
fi
|
||||
|
||||
# Send the email with the log
|
||||
send_email
|
||||
|
||||
# Remove the log file after sending the email
|
||||
rm -f $LOG_FILE
|
||||
|
||||
echo "Backup process complete, local status: $LOCAL_STATUS, FTP status: $FTP_STATUS, and email sent."
|
||||
Loading…
Reference in New Issue
Block a user