Manchmal steht man vor der Herausforderung, eine Microsoft SQL-Datenbank durchsuchen zu müssen – und das ausgerechnet auf einem macOS- oder Linux-System. Um euch den Einstieg zu erleichtern, findet ihr hier eine Schritt-für-Schritt-Anleitung, wie ihr mithilfe von Docker eine SQL-Server-Instanz bereitstellt und ein Backup wiederherstellt.
Variablenübersicht
Name | Wert | Beschreibung |
---|---|---|
MSSQL_SA_PASSWORD | ASDfer123! | Passwort für den SQL-Admin-Benutzer (SA) |
Backup | asd.bak | Name der Backup-Datei |
DB | XY | Name der wiederherzustellenden Datenbank |
Passwortanforderungen
Beachtet die folgenden Richtlinien für das SA-Passwort, um Fehler zu vermeiden:
- Mindestens 8 Zeichen lang
- Zeichen aus mindestens 3 von 4 Zeichengruppen:
- Großbuchstaben
- Kleinbuchstaben
- Ziffern
- Sonderzeichen
Vorbereitung der Umgebung
- SQL-Server-Container starten:
docker pull mcr.microsoft.com/mssql/server:2022-CU13-ubuntu-22.04 docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=ASDfer123!' --name 'mssql' -p 1401:1433 -v mssqldata:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2022-CU13-ubuntu-22.04
- Backup-Datei in den Container kopieren:
docker exec -it mssql mkdir /var/opt/mssql/backup docker cp asd.bak mssql:/var/opt/mssql/backup
Wiederherstellung des Backups
-
Prüfen des Backups:
docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'ASDfer123!' -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/asd.bak"' | tr -s ' ' | cut -d ' ' -f 1-2
Beispielausgabe:
LogicalName PhysicalName ------------------------ XY C:\directory\subdirectory\XYZ XY_log C:\directory\subdirectory\XYZ
-
Dateiberechtigungen korrigieren (falls erforderlich):
docker exec -u 0 mssql chown mssql:mssql /var/opt/mssql/backup/asd.bak
-
Datenbank wiederherstellen:
docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'ASDfer123!' \ -Q 'RESTORE DATABASE XY FROM DISK = "/var/opt/mssql/backup/asd.bak" WITH MOVE "XY" TO "/var/opt/mssql/data/XY.mdf", MOVE "XY_log" TO "/var/opt/mssql/data/XY_log.ndf"'
Zugriff auf die Datenbank
Ihr könnt jetzt mit einem Tool wie DBeaver auf die wiederhergestellte Datenbank zugreifen.
Variable | Wert |
---|---|
URL | jdbc:sqlserver://;serverName=localhost;port=1401;databaseName=master |
Host | localhost |
Datenbank | master |
Benutzername | sa |
Passwort | ASDfer123! |
Durchsuchen der Datenbank
Falls ihr die Datenbank nach einem bestimmten String durchsuchen möchtet, könnt ihr folgende gespeicherte Prozedur nutzen. Diese durchsucht alle Tabellen nach dem angegebenen Wert:
CREATE PROC [dbo].[SearchAllTablesByRecord] ( @SearchStr NVARCHAR(100) ) AS BEGIN SET NOCOUNT ON DECLARE @TableName NVARCHAR(256), @SearchStr2 NVARCHAR(110) DECLARE @ColumnList NVARCHAR(2048), @ColumnJoin NVARCHAR(2048) SET @TableName = '' SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') WHILE @TableName IS NOT NULL BEGIN SET @TableName = ( SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0 ) PRINT @TableName -- Fortschritt anzeigen SET @ColumnList = ( SELECT STRING_AGG(QUOTENAME(COLUMN_NAME),',') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) AND TABLE_NAME = PARSENAME(@TableName, 1) AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') ) SET @ColumnJoin = REPLACE(@ColumnList, ',', '+') IF @ColumnList <> '' EXEC ( 'SELECT ''' + @TableName + ''' AS [Table],' + @ColumnList + ' FROM ' + @TableName + ' (NOLOCK) WHERE ' + @ColumnJoin + ' LIKE ' + @SearchStr2 ) END END
Verwendung der Prozedur:
EXEC [dbo].[SearchAllTablesByRecord] 'Hackerman strikes again';
Credits
- Datum
- 16. November 2024vor 7 Tagen
- Sprache
- de
- Aktualisiert am
- 16. November 2024