260 lines
6.4 KiB
Markdown
260 lines
6.4 KiB
Markdown
# SQL Server Express Backup & Restore (DB_Keyvi)
|
|||
|
|
|
||
|
|
## Überblick
|
||
|
|
|
||
|
|
Diese Dokumentation beschreibt das produktive Backup- und Restore-Setup für:
|
||
|
|
|
||
|
|
- **VM**: `VM11-01-Keyvi`
|
||
|
|
- **SQL-Instanz**: `.\KEYVI`
|
||
|
|
- **Datenbank**: `DB_Keyvi`
|
||
|
|
- **Backup-Ziel**: `D:\SQLBackup\DB_Keyvi`
|
||
|
|
- **Backup-Script**: `C:\Script\Backup_DB_Keyvi.ps1`
|
||
|
|
- **Restore-Script**: `C:\Script\Restore_DB_Keyvi.ps1`
|
||
|
|
- **Geplanter Task**: `Backup DB_Keyvi Daily`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Hintergrund / Besonderheiten
|
||
|
|
|
||
|
|
### SQL Server Express und Compression
|
||
|
|
Auf dieser SQL Server Express Edition wird `WITH COMPRESSION` nicht unterstützt.
|
||
|
|
Backups laufen daher ohne Kompression.
|
||
|
|
|
||
|
|
### TLS/ODBC 18 (`sqlcmd`)
|
||
|
|
Auf dem System wird ODBC Driver 18 verwendet.
|
||
|
|
Daher wird `sqlcmd` mit `-C` genutzt (Zertifikat vertrauen), um Verbindungsfehler zu vermeiden.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Zielarchitektur
|
||
|
|
|
||
|
|
### Backup
|
||
|
|
- Tägliches Backup per Windows Aufgabenplanung
|
||
|
|
- Dateiname mit Zeitstempel
|
||
|
|
- Ordnerstruktur nach Jahr/Monat (`YYYY\MM`)
|
||
|
|
- Aufbewahrung: 365 Tage
|
||
|
|
- Automatisches Löschen alter `.bak`-Dateien
|
||
|
|
- Automatisches Löschen leerer Ordner nach Cleanup
|
||
|
|
|
||
|
|
### Restore
|
||
|
|
- Ein Restore-Script mit Modusumschaltung:
|
||
|
|
- `Test` → Restore nach `DB_Keyvi_RestoreTest`
|
||
|
|
- `Production` → Restore nach `DB_Keyvi` (mit Sicherheitsabfrage)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Rechte- und Sicherheitsmodell
|
||
|
|
|
||
|
|
## Windows-Benutzer
|
||
|
|
- Laufender Benutzer für Task: `VM11-01-Keyvi\Keyvi`
|
||
|
|
|
||
|
|
## SQL-Rechte
|
||
|
|
Für **Backup** erforderlich:
|
||
|
|
- DB-Rolle: `db_backupoperator` auf `DB_Keyvi`
|
||
|
|
|
||
|
|
Für **Test-Restore auf neue DB** erforderlich:
|
||
|
|
- Serverrolle: `dbcreator` (oder alternativ `sysadmin`)
|
||
|
|
|
||
|
|
## NTFS-Rechte auf Backup-Pfad
|
||
|
|
Auf `D:\SQLBackup\DB_Keyvi` benötigen Schreibrechte:
|
||
|
|
- `VM11-01-Keyvi\Keyvi`
|
||
|
|
- `NT Service\MSSQL$KEYVI` (SQL-Dienstkonto)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Verzeichnisstruktur
|
||
|
|
|
||
|
|
Beispiel nach einigen Läufen:
|
||
|
|
|
||
|
|
```text
|
||
|
|
D:\SQLBackup\DB_Keyvi\
|
||
|
|
└── 2026\
|
||
|
|
└── 07\
|
||
|
|
├── DB_Keyvi_20260729_205555.bak
|
||
|
|
├── DB_Keyvi_20260730_020000.bak
|
||
|
|
└── ...
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Script 1: Backup (`C:\Script\Backup_DB_Keyvi.ps1`)
|
||
|
|
|
||
|
|
Dieses Script:
|
||
|
|
1. Erzeugt Zielordner `YYYY\MM`
|
||
|
|
2. Führt Backup aus
|
||
|
|
3. Löscht `.bak` älter als 365 Tage
|
||
|
|
4. Löscht leere Ordner rekursiv
|
||
|
|
|
||
|
|
> Dieses Script wird täglich über den Scheduled Task ausgeführt.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Script 2: Restore (`C:\Script\Restore_DB_Keyvi.ps1`)
|
||
|
|
|
||
|
|
Dieses Script:
|
||
|
|
1. Nutzt eine fest konfigurierte Backup-Datei (`$BackupFile`)
|
||
|
|
2. Nutzt einen Modus (`$Mode = Test|Production`)
|
||
|
|
3. Liest logische Dateinamen aus dem Backup (T-SQL intern)
|
||
|
|
4. Stellt Datenbank mit `MOVE ... REPLACE ... RECOVERY` wieder her
|
||
|
|
|
||
|
|
### Restore-Modi
|
||
|
|
|
||
|
|
- **Testmodus**
|
||
|
|
- Ziel-DB: `DB_Keyvi_RestoreTest`
|
||
|
|
- Keine Produktionsüberschreibung
|
||
|
|
|
||
|
|
- **Production-Modus**
|
||
|
|
- Ziel-DB: `DB_Keyvi`
|
||
|
|
- Sicherheitsabfrage (`JA`) vor Überschreiben
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Installation / Einrichtung (einmalig)
|
||
|
|
|
||
|
|
## 1) SQL-Login/Benutzer vorbereiten (falls noch nicht vorhanden)
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Als sysadmin in SSMS ausführen
|
||
|
|
IF NOT EXISTS (SELECT 1 FROM sys.server_principals WHERE name = N'VM11-01-Keyvi\Keyvi')
|
||
|
|
CREATE LOGIN [VM11-01-Keyvi\Keyvi] FROM WINDOWS;
|
||
|
|
GO
|
||
|
|
|
||
|
|
USE [DB_Keyvi];
|
||
|
|
GO
|
||
|
|
|
||
|
|
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = N'VM11-01-Keyvi\Keyvi')
|
||
|
|
CREATE USER [VM11-01-Keyvi\Keyvi] FOR LOGIN [VM11-01-Keyvi\Keyvi];
|
||
|
|
GO
|
||
|
|
|
||
|
|
ALTER ROLE [db_backupoperator] ADD MEMBER [VM11-01-Keyvi\Keyvi];
|
||
|
|
GO
|
||
|
|
```
|
||
|
|
|
||
|
|
Für Test-Restore auf neue DB zusätzlich:
|
||
|
|
```sql
|
||
|
|
ALTER SERVER ROLE [dbcreator] ADD MEMBER [VM11-01-Keyvi\Keyvi];
|
||
|
|
GO
|
||
|
|
```
|
||
|
|
|
||
|
|
## 2) NTFS-Rechte setzen
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
$BackupDir = "D:\SQLBackup\DB_Keyvi"
|
||
|
|
|
||
|
|
New-Item -ItemType Directory -Path $BackupDir -Force | Out-Null
|
||
|
|
icacls $BackupDir /grant "VM11-01-Keyvi\Keyvi:(OI)(CI)M" /T
|
||
|
|
icacls $BackupDir /grant "NT Service\MSSQL`$KEYVI:(OI)(CI)M" /T
|
||
|
|
```
|
||
|
|
|
||
|
|
## 3) Scheduled Task erstellen/anpassen
|
||
|
|
|
||
|
|
Action:
|
||
|
|
```text
|
||
|
|
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Script\Backup_DB_Keyvi.ps1"
|
||
|
|
```
|
||
|
|
|
||
|
|
Task läuft als:
|
||
|
|
```text
|
||
|
|
VM11-01-Keyvi\Keyvi
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Betrieb
|
||
|
|
|
||
|
|
## Backup manuell testen
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
powershell -ExecutionPolicy Bypass -File "C:\Script\Backup_DB_Keyvi.ps1"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Task manuell starten
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
Start-ScheduledTask -TaskName "Backup DB_Keyvi Daily"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Task-Status prüfen
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
Get-ScheduledTaskInfo -TaskName "Backup DB_Keyvi Daily" | Select-Object LastRunTime,LastTaskResult,NextRunTime
|
||
|
|
```
|
||
|
|
|
||
|
|
`LastTaskResult = 0` bedeutet Erfolg.
|
||
|
|
|
||
|
|
## Letzte Backups anzeigen
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
Get-ChildItem "D:\SQLBackup\DB_Keyvi" -Recurse -File -Filter *.bak |
|
||
|
|
Sort-Object LastWriteTime -Descending |
|
||
|
|
Select-Object -First 20 FullName, LastWriteTime, Length
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Restore ausführen
|
||
|
|
|
||
|
|
## Restore-Script konfigurieren
|
||
|
|
Im Script `C:\Script\Restore_DB_Keyvi.ps1`:
|
||
|
|
- `$Mode = "Test"` oder `"Production"`
|
||
|
|
- `$BackupFile = "D:\SQLBackup\DB_Keyvi\2026\07\DB_Keyvi_20260729_205555.bak"`
|
||
|
|
|
||
|
|
## Restore starten
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
powershell -ExecutionPolicy Bypass -File "C:\Script\Restore_DB_Keyvi.ps1"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Ergebnis prüfen (Beispiel Test-DB)
|
||
|
|
|
||
|
|
```sql
|
||
|
|
SELECT name, state_desc
|
||
|
|
FROM sys.databases
|
||
|
|
WHERE name IN ('DB_Keyvi','DB_Keyvi_RestoreTest');
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
## Fehler: `WITH COMPRESSION wird ... nicht unterstützt`
|
||
|
|
Ursache: SQL Server Express unterstützt in dieser Edition keine Backup-Kompression.
|
||
|
|
Lösung: `COMPRESSION` entfernen.
|
||
|
|
|
||
|
|
## Fehler: Zertifikatkette nicht vertrauenswürdig (ODBC 18)
|
||
|
|
Ursache: TLS-Zertifikat nicht vertrauenswürdig.
|
||
|
|
Lösung: `sqlcmd` mit `-C` ausführen.
|
||
|
|
|
||
|
|
## Fehler: `CREATE DATABASE-Berechtigung ... verweigert`
|
||
|
|
Ursache: Benutzer hat keine Rechte für neue Datenbank (Test-Restore).
|
||
|
|
Lösung: `ALTER SERVER ROLE [dbcreator] ADD MEMBER [VM11-01-Keyvi\Keyvi];`
|
||
|
|
|
||
|
|
## Fehler: Zugriff auf Backup-Ordner
|
||
|
|
Ursache: NTFS-Rechte fehlen für SQL-Dienstkonto.
|
||
|
|
Lösung: Rechte auf `NT Service\MSSQL$KEYVI` setzen.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Sicherheits-Hinweise
|
||
|
|
|
||
|
|
- Produktions-Restore nur bewusst im `Production`-Modus ausführen.
|
||
|
|
- Vor produktivem Restore Benutzer informieren (Downtime möglich).
|
||
|
|
- Regelmäßig Test-Restore durchführen (z. B. monatlich), um Restore-Fähigkeit sicherzustellen.
|
||
|
|
- Zugriff auf Script- und Backup-Ordner auf notwendige Benutzer beschränken.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Empfohlene Ergänzungen (optional)
|
||
|
|
|
||
|
|
- Logging in Datei (Backup/Restore-Laufzeit, Exitcode)
|
||
|
|
- Benachrichtigung bei Fehler (E-Mail/EventLog)
|
||
|
|
- Verschlüsselung/Signierung von Backup-Archiven (falls Compliance-relevant)
|
||
|
|
- Offsite-Kopie (z. B. getrenntes Storage, immutable backup target)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Versionshistorie
|
||
|
|
|
||
|
|
- **2026-07-29**: Erstaufbau Backup-Automation
|
||
|
|
- **2026-07-29**: Restore-Script mit Test/Production-Modus ergänzt
|
||
|
|
- **2026-07-29**: Retention (365 Tage) + Cleanup leerer Ordner umgesetzt
|