在 macOS 或 Linux 搜尋 SQL Server 資料庫
草稿
有時候,你可能需要在 macOS 或 Linux 系統上搜尋 Microsoft SQL 資料庫。為了讓你更容易上手,以下是一步步的教學,教你如何使用 Docker 設置 SQL Server 實例並還原備份。
變數概覽
名稱 | 值 | 描述 |
---|---|---|
MSSQL_SA_PASSWORD | ASDfer123! | SQL 管理員用戶 (SA) 的密碼 |
Backup | asd.bak | 備份檔案的名稱 |
DB | XY | 要還原的資料庫名稱 |
密碼要求
請確保你的 SA 密碼符合以下要求,以避免出錯:
- 至少 8 個字符 長度
- 至少包含以下 4 種字符組中的 3 種:
- 大寫字母
- 小寫字母
- 數字
- 特殊字符
環境準備
- 啟動 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
- 將備份檔案複製到容器中:
docker exec -it mssql mkdir /var/opt/mssql/backup docker cp asd.bak mssql:/var/opt/mssql/backup
還原備份
-
檢查備份文件:
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
-
修正檔案權限(如果需要):
docker exec -u 0 mssql chown mssql:mssql /var/opt/mssql/backup/asd.bak
-
還原資料庫:
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 這樣的工具來訪問還原的資料庫。
變數 | 值 |
---|---|
URL | jdbc: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';
鳴謝
元等級
★★★★★
- 日期
- 2024年11月16日7 天前
- 語言
- de
- 更新於
- 2024年11月16日