Diese Anleitung richtet sich an Proxmox-Umgebungen. Ziel:
- MSSQL 2019 Express installieren
- Backups automatisch auf NAS speichern
- Jeden Werktag mehrere Backups
- 20 Uhr zusätzlich
DBCC CHECKDB - Bei Fehler: Backup heißt
__CHECKDB_FAIL
🧱 LXC-Container vorbereiten
Container erstellen mit:
| Einstellung | Wert |
|---|---|
| Unprivileged | aus |
| Features | nesting keyctl fuse |
| RAM | 4–8 GB |
| Storage | >10 GB |
Dann in /etc/pve/lxc/CTID.conf einfügen:
lxc.apparmor.profile: unconfined
lxc.cap.drop:
lxc.mount.auto: sys:rw
lxc.cgroup.devices.allow: a
Container starten.
🛠️ MSSQL 2019 Express installieren
Microsoft Repo und Key
bash
sudo apt update
sudo apt install -y curl gnupg ca-certificates apt-transport-https
sudo install -d -m 0755 /usr/share/keyrings
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc \
| sudo gpg –dearmor -o /usr/share/keyrings/microsoft.gpg
bash
Code kopieren
echo „deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/ubuntu/20.04/mssql-server-2019 focal main“ \
| sudo tee /etc/apt/sources.list.d/mssql-server.list
bash
sudo apt update
sudo apt install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
Edition: Express wählen
📦 SQL Tools installieren (sqlcmd)
bash
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add –
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list \
| sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt update
sudo apt install -y mssql-tools unixodbc-dev
Pfad setzen:
bash
echo ‚export PATH=“$PATH:/opt/mssql-tools/bin“‚ >> ~/.bashrc
source ~/.bashrc
Test:
bash
sqlcmd -S localhost -U SA -P „PASSWORT“ -Q „SELECT @@VERSION“
🖴 NAS-Freigabe einbinden
bash
sudo apt install -y cifs-utils
sudo mkdir -p /mnt/sqlbackup
Creds Datei:
bash
sudo nano /root/.smbcred
Inhalt:
ini
username=NASUSER
password=NASPASS
domain=WORKGROUP
bash
sudo chmod 600 /root/.smbcred
Eintrag in /etc/fstab:
bash
echo „//192.168.1.100/sqlbackup /mnt/sqlbackup cifs credentials=/root/.smbcred,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0“ \
| sudo tee -a /etc/fstab
sudo mount -a
💾 Backup-Script inkl. CHECKDB
/usr/local/bin/mssql_backup.sh:
bash
!/bin/bash
set -euo pipefail
SA_USER=“SA“
SA_PASS=“DEIN_SA_PASSWORT“
SQLHOST=“localhost“
DEST=“/mnt/sqlbackup/mssql“
RETENTION_DAYS=7
LOG_CHECKDB=“/var/log/mssql_checkdb.log“
exec 9>/var/lock/mssql_backup.lock
flock -n 9 || exit 0
mkdir -p „$DEST“ „$(dirname „$LOG_CHECKDB“)“
SQLCMD=“/opt/mssql-tools/bin/sqlcmd“
[ -x „$SQLCMD“ ] || SQLCMD=“$(command -v sqlcmd || true)“
[ -z „$SQLCMD“ ] && echo „sqlcmd fehlt!“ && exit 1
ts(){ date „+%Y-%m-%d %H:%M:%S“; }
DBLIST=“$(
$SQLCMD -S „$SQLHOST“ -U „$SA_USER“ -P „$SA_PASS“ \
-Q „SET NOCOUNT ON; SELECT name FROM sys.databases WHERE name NOT IN (‚master‘,’model‘,’msdb‘,’tempdb‘)“ \
-h -1 -W
)“
[ -z „$DBLIST“ ] && exit 0
declare -A CHECKDB_STATUS
HOUR_NOW=“$(date +%H)“
if [ „$HOUR_NOW“ = „20“ ]; then
echo „[$(ts)] === CHECKDB START ===“ | tee -a „$LOG_CHECKDB“
while read -r DB; do
DB=“$(echo „$DB“|xargs)“
[ -z „$DB“ ] && continue
echo „[$(ts)] CHECKDB: $DB“ | tee -a „$LOG_CHECKDB“
if ! $SQLCMD -S „$SQLHOST“ -U „$SA_USER“ -P „$SA_PASS“ \
-Q „DBCC CHECKDB(‚$DB‘) WITH NO_INFOMSGS, ALL_ERRORMSGS;“ \
-b -V 16 >>“$LOG_CHECKDB“ 2>&1; then
CHECKDB_STATUS[„$DB“]=“FAIL“
echo „[$(ts)] FAIL: $DB“ | tee -a „$LOG_CHECKDB“
else
CHECKDB_STATUS[„$DB“]=“OK“
echo „[$(ts)] OK: $DB“ | tee -a „$LOG_CHECKDB“
fi
done <<< „$DBLIST“
echo „[$(ts)] === CHECKDB END ===“ | tee -a „$LOG_CHECKDB“
fi
DATE_STR=“$(date +%F_%H-%M)“
echo „[$(ts)] BACKUP START $DATE_STR“
for DB in $DBLIST; do
DB=“$(echo „$DB“|xargs)“
SUFFIX=““
if [ „$HOUR_NOW“ = „20“ ] && [ „${CHECKDB_STATUS[$DB]:-OK}“ = „FAIL“ ]; then
SUFFIX=“_CHECKDB_FAIL“ fi OUT=“$DEST/${DB}${DATE_STR}${SUFFIX}.bak“
echo „[$(ts)] BACKUP $DB -> $OUT“
$SQLCMD -S „$SQLHOST“ -U „$SA_USER“ -P „$SA_PASS“ \
-Q „BACKUP DATABASE [$DB] TO DISK=N’$OUT‘ WITH INIT, STATS=5;“
done
find „$DEST“ -type f -name „*.bak“ -mtime +$RETENTION_DAYS -delete
echo „[$(ts)] BACKUP END“
Speichern:
bash
sudo chmod +x /usr/local/bin/mssql_backup.sh
⏱️ Systemd-Timer
Service
bash
sudo bash -c ‚cat > /etc/systemd/system/mssql-backup.service < /etc/systemd/system/mssql-backup.timer <<EOF
[Unit]
Description=Run MSSQL backups
[Timer]
OnCalendar=Mon..Fri –-* 09,11,13,15,17:00:00
OnCalendar=–-* 20:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF‘
Aktivieren:
bash
sudo systemctl daemon-reload
sudo systemctl enable –now mssql-backup.timer
Manuell testen:
bash
systemctl start mssql-backup.service
