Bastelgedöhns

Installation & Backup-Setup: SQL Server 2019 Express in Proxmox LXC

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:

EinstellungWert
Unprivilegedaus
Featuresnesting keyctl fuse
RAM4–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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.