initial commit
This commit is contained in:
@@ -0,0 +1,260 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user