本文涵蓋 SqlPackage 的支援,可與以 Parquet 格式儲存在 Azure Blob 儲存體中的數據進行互動。
使用 擷取時,資料庫架構(.dacpac 檔案)會寫入執行 SqlPackage 的本機用戶端,並以 Parquet 格式將數據寫入 Azure Blob 記憶體。 數據會儲存在具有兩部分數據表名稱的個別資料夾中。
CREATE EXTERNAL TABLE AS SELECT (CETAS) 可用來在 Azure Blob 記憶體中寫入檔案。
發佈時,資料庫架構(.dacpac 檔案)會從執行 SqlPackage 的本機用戶端讀取,並以 Parquet 格式讀取或寫入至 Azure Blob 記憶體。
針對 SQL Server 2022 和 Azure SQL 受控實例,SqlPackage 162.1.176 和更高版本提供預覽支援,使得在 Azure Blob Storage 的 Parquet 檔案中可以進行 擷取 和 發行。 針對 Azure SQL Database,SqlPackage 170.1.61 和更新版本的發行預覽支援可供使用。 不支援 SQL Server 2019 和更早版本。 匯入 和 匯出 動作仍可供 SQL Server、Azure SQL 受控實例和 Azure SQL Database 使用。 在 Azure Blob 儲存體中對 Parquet 檔案的支援一直保持一般可用,適用於 Azure Synapse Analytics。
在 Azure 裝載的 SQL 資料庫中,使用 Parquet 檔案的擷取/發佈作業在許多情況下比起使用 .bacpac 檔案進行匯入/導出作業能提供更佳的效能。
擷取 (匯出資料)
若要將數據從資料庫匯出至 Azure Blob 記憶體,SqlPackage 擷取 動作會搭配下列屬性使用:
/p:AzureStorageBlobEndpoint/p:AzureStorageContainer-
/p:AzureSharedAccessSignatureToken或/p:AzureStorageKey(不支援與 SQL Server 搭配使用)
數據庫存取 Blob 記憶體容器的存取權是透過記憶體帳戶密鑰授權的。 資料庫架構 (.dacpac 檔案) 會寫入執行 SqlPackage 的本機用戶端,並以 Parquet 格式將數據寫入 Azure Blob 記憶體。
參數 /p:AzureStorageRootPath 是選擇性的,它會設定容器內的記憶體根路徑。 如果沒有此屬性,路徑預設為 servername/databasename/timestamp/。 數據會儲存在具有兩部分數據表名稱的個別資料夾中。 每個數據表建立的檔案數目取決於匯出時的 MAXDOP 和可用的SQL 核心。
最後,屬性 /p:TableData 指定哪些數據表已匯出其數據。 在 schema_name.table_identifier 格式中指定資料表名稱,名稱部分可以有或無括號。 這個屬性可以指定多次,以指出多個數據表。
Example
下列範例會將名為 databasename 的資料庫從名為 yourserver 的伺服器擷取到目前目錄中名為 databaseschema.dacpac 的本機檔案。 使用名為 containername的儲存體帳戶金鑰,將資料寫入名為 storageaccount 的儲存體帳戶中,名為 storageaccountkey 的容器。 數據會寫入容器中 servername/databasename/timestamp/ 的預設路徑。
SqlPackage /Action:Extract /SourceServerName:yourserver /SourceDatabaseName:databasename /TargetFile:databaseschema.dacpac /p:AzureStorageBlobEndpoint=https://storageaccount.blob.core.windows.net /p:AzureStorageContainer=containername /p:AzureStorageKey=storageaccountkey
如需可用的驗證類型範例,請參閱 SqlPackage 擷取。
發佈 (匯入資料)
若要將數據從 Azure Blob 記憶體中的 Parquet 檔案匯入至資料庫,SqlPackage 發佈 動作會搭配下列屬性使用:
/p:AzureStorageBlobEndpoint/p:AzureStorageContainer/p:AzureStorageRootPath-
/p:AzureSharedAccessSignatureToken或/p:AzureStorageKey(不支援與 SQL Server 搭配使用)
發行的存取權可以透過記憶體帳戶密鑰或共用存取簽章 (SAS) 令牌獲得授權。 資料庫架構 (.dacpac 檔案) 會從執行 SqlPackage 的本機用戶端讀取,並以 Parquet 格式從 Azure Blob 記憶體讀取數據。
Example
下列範例會從目前目錄中名為 databasename 的本機檔案,將名為 yourserver 的資料庫發行至名為 databaseschema.dacpac 的伺服器。 數據會使用名為 containername的儲存帳戶密鑰,從名為 storageaccount 的儲存帳戶中的容器 storageaccountkey 讀取。 數據會從容器中路徑 yourserver/databasename/10-19-2023_11-09-56/ 下每個數據表的個別資料夾讀取。
SqlPackage /Action:Publish /SourceFile:databaseschema.dacpac /TargetServerName:yourserver /TargetDatabaseName:databasename /p:AzureStorageBlobEndpoint=https://storageaccount.blob.core.windows.net /p:AzureStorageContainer=containername /p:AzureStorageKey=storageaccountkey /p:AzureStorageRootPath="yourserver/databasename/10-19-2023_11-09-56/"
如需可用的驗證類型範例,請參閱 SqlPackage 發佈。
Limitations
PolyBase
針對 SQL Server 和 Azure SQL 受控實例,使用 Parquet 檔案的 SqlPackage 作業需要 PolyBase 。 下列查詢可用來檢查 PolyBase 是否已啟用:
// configuration_id = 16397 is 'allow polybase export'
// configuration_id = 16399 is 'polybase enabled'
SELECT configuration_id, value_in_use FROM sys.configurations
WHERE configuration_id IN (16397, 16399)
您可能需要啟用 PolyBase 或 PolyBase 匯出。 在 Azure SQL 受控實例上啟用 PolyBase 需要 PowerShell 或 Azure CLI。 您應該先評估啟用PolyBase是否適合您的環境,再進行設定變更。
數據表和數據類型
大部分的數據類型都支援使用 Parquet 檔案進行擷取和發佈作業。 具有不支援數據類型的資料表,其資料會被匯出到.dacpac檔案,而不是以 Parquet 格式匯出。 支援下列數據類型,並寫入 Azure Blob 記憶體中的 Parquet 檔案:
- char
- varchar
- nchar
- nvarchar
- text
- ntext
- decimal
- numeric
- float
- real
- bit
- tinyint
- smallint
- int
- bigint
- smallmoney
- money
- smalldate
- smalldatetime
- date
- datetime
- datetime2
- datetimeoffset
- time
- uniqueidentifier
- timestamp
- rowversion
- binary
- varbinary
- image
- xml
- json
- vector
總賬表格已啟用以使用 Parquet 檔案進行擷取和發佈操作。
使用 Always Encrypted 儲存的數據不支援使用 Parquet 檔案進行擷取和發佈作業。
您可以使用 T-SQL 檢查資料庫,以偵測那些會被寫入 .dacpac 檔案而非直接寫入到 Azure Blob 儲存體中的 Parquet 檔案的數據類型。 下列範例查詢會傳回類型和數據表的結果集,這些類型不支援寫入 Parquet 檔案。
SELECT DISTINCT C.DATA_TYPE, C.TABLE_SCHEMA, C.TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.COLUMNS C
ON T.TABLE_SCHEMA = C.TABLE_SCHEMA
AND T.TABLE_NAME = C.TABLE_NAME
AND T.TABLE_TYPE = 'BASE TABLE'
WHERE C.DATA_TYPE NOT IN (
'binary',
'varbinary',
'char',
'varchar',
'nchar',
'nvarchar',
'smalldate',
'smalldatetime',
'date',
'datetime',
'datetime2',
'datetimeoffset',
'time',
'decimal',
'numeric',
'float',
'real',
'tinyint',
'smallint',
'int',
'bigint',
'bit',
'money',
'smallmoney',
'uniqueidentifier',
'timestamp',
'rowversion',
'text',
'ntext',
'image',
'xml',
'json',
'vector'
);