From 21b757372be2b80e1830a33c5984b12a05042721 Mon Sep 17 00:00:00 2001 From: "b.nehlsen" Date: Wed, 29 Jul 2026 21:08:26 +0200 Subject: [PATCH] initial commit --- README.md | 260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..def0474 --- /dev/null +++ b/README.md @@ -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 \ No newline at end of file