Files
Keyvi_MS-SQL_Backup/README.md
T
2026-07-29 21:08:26 +02:00

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