SQL Server unter macOS oder Linux durchsuchen

Entwurf

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

NameWertBeschreibung
MSSQL_SA_PASSWORDASDfer123!Passwort für den SQL-Admin-Benutzer (SA)
Backupasd.bakName der Backup-Datei
DBXYName 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

  1. 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
  2. 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

  1. 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
    
  2. Dateiberechtigungen korrigieren (falls erforderlich):

    docker exec -u 0 mssql chown mssql:mssql /var/opt/mssql/backup/asd.bak
  3. 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.

VariableWert
URLjdbc:sqlserver://;serverName=localhost;port=1401;databaseName=master
Hostlocalhost
Datenbankmaster
Benutzernamesa
PasswortASDfer123!

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

Metaebene

SQL Server unter macOS oder Linux durchsuchen
Datum
16. November 2024
vor 7 Tagen
Sprache
de
Aktualisiert am
16. November 2024