在 macOS 或 Linux 搜尋 SQL Server 資料庫

草稿

有時候,你可能需要在 macOS 或 Linux 系統上搜尋 Microsoft SQL 資料庫。為了讓你更容易上手,以下是一步步的教學,教你如何使用 Docker 設置 SQL Server 實例並還原備份。


變數概覽

名稱描述
MSSQL_SA_PASSWORDASDfer123!SQL 管理員用戶 (SA) 的密碼
Backupasd.bak備份檔案的名稱
DBXY要還原的資料庫名稱

密碼要求

請確保你的 SA 密碼符合以下要求,以避免出錯:

  • 至少 8 個字符 長度
  • 至少包含以下 4 種字符組中的 3 種
    • 大寫字母
    • 小寫字母
    • 數字
    • 特殊字符

環境準備

  1. 啟動 SQL Server 容器:
    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. 將備份檔案複製到容器中:
    docker exec -it mssql mkdir /var/opt/mssql/backup docker cp asd.bak mssql:/var/opt/mssql/backup

還原備份

  1. 檢查備份文件

    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

    範例輸出:

    LogicalName PhysicalName
    ------------------------
    XY         C:\directory\subdirectory\XYZ
    XY_log     C:\directory\subdirectory\XYZ
    
  2. 修正檔案權限(如果需要)

    docker exec -u 0 mssql chown mssql:mssql /var/opt/mssql/backup/asd.bak
  3. 還原資料庫

    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"'

訪問資料庫

現在,你可以使用像 DBeaver 這樣的工具來訪問還原的資料庫。

變數
URLjdbc:sqlserver://;serverName=localhost;port=1401;databaseName=master
主機localhost
資料庫master
用戶名sa
密碼ASDfer123!

搜尋資料庫

如果你想在資料庫中搜尋特定字串,可以使用以下儲存過程。它會掃描所有表中的指定值:

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 -- 進度指示 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

使用該過程:

EXEC [dbo].[SearchAllTablesByRecord] 'Hackerman strikes again';

鳴謝

元等級

在 macOS 或 Linux 搜尋 SQL Server 資料庫
日期
2024年11月16日
7 天前
語言
de
更新於
2024年11月16日