部署分割合併服務以在分區化資料庫之間移動資料
分割合併工具可讓您在分區化資料庫之間移動資料。 請參閱在橫向擴展的雲端資料庫之間移動資料。
注意
分割合併工具的目的是使用雲端服務 (傳統) 而非應用程式服務。
下載分割合併套件
從 NuGet 下載最新的 NuGet 版本。
開啟命令提示字元,並瀏覽至您下載 nuget.exe 的目錄。 下載包含 PowerShell 命令。
使用下列命令,將最新的分割合併套件下載至目前目錄:
nuget install Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge
這些檔案會放在名為 Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge.x.x.x.xxx.x 的目錄中,其中 x.x.xxx.x 反映版本號碼。 在 content\splitmerge\service 子目錄中尋找分割合併服務檔案,以及 content\splitmerge\powershell 子目錄中的 Split-Merge PowerShell 指令碼 (以及必要的用戶端 dll) 。
必要條件
建立將做為分割合併狀態資料庫的 Azure SQL 資料庫資料庫。 前往 Azure 入口網站。 建立新的 SQL 資料庫。 為資料庫指定名稱,並建立新的系統管理員和密碼。 請務必記錄名稱和密碼以供日後使用。
請確定您的伺服器能讓 Azure 服務與之連線。 在入口網站的 [防火牆設定] 中,確定 [允許存取 Azure 服務] 設定設為 [開啟]。 按一下 [儲存] 圖示。
建立診斷輸出用的 Azure 儲存體帳戶。
為分割合併服務建立 Azure 雲端服務。
設定分割合併服務
分割合併服務組態
在您下載分割合併組件的資料夾中,建立 ServiceConfiguration.Template.cscfg 檔案的複本,該檔案隨附於 SplitMergeService.cspkg 並重新命名為 ServiceConfiguration.cscfg。
在文字編輯器中開啟 ServiceConfiguration.cscfg,例如 Visual Studio,以驗證憑證指紋的格式等輸入。
建立新的資料庫,或選擇現有資料庫作為分割合併作業的狀態資料庫,並擷取該資料庫的連接字串。
重要
此時,狀態資料庫必須使用拉丁文定序 (SQL_Latin1_General_CP1_CI_AS)。 如需詳細資訊,請參閱 Windows 定序名稱 (Transact-SQL)。
使用 Azure SQL 資料庫時,連接字串通常的格式如下:
Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<userId>; Password=<password>; Encrypt=True; Connection Timeout=30
在 [ElasticScaleMetadata] 設定的 [SplitMergeWeb] 和 [SplitMergeWorker] 角色區段中,於 .cscfg 檔案中輸入此連接字串。
針對 SplitMergeWorker 角色,輸入 [WorkerRoleSynchronizationStorageAccountConnectionString[ 設定的有效連接字串至 Azure 儲存體。
設定安全性
如需設定服務安全性的詳細指示,請參閱分割合併安全性設定。
為了進行本教學課程的簡單測試部署,將會執行一組最少的組態步驟,讓服務啟動並執行。 這些步驟只會讓執行它們的機器/帳戶與服務通訊。
建立自我簽署憑證
使用 Visual Studio 開發人員命令提示字元視窗,建立新的目錄,並從此目錄執行下列命令:
makecert ^
-n "CN=*.cloudapp.net" ^
-r -cy end -sky exchange -eku "1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2" ^
-a sha256 -len 2048 ^
-sr currentuser -ss root ^
-sv MyCert.pvk MyCert.cer
系統會要求您提供密碼來保護私鑰。 輸入強式密碼並確認。 然後,系統會提示您在此之後再次使用密碼。 按一下結尾的 [是],將其匯入至受信任的憑證授權單位根存放區。
建立 PDF 檔案
從執行 makecert 的相同視窗中執行下列命令;使用您用來建立憑證的相同密碼:
pvk2pfx -pvk MyCert.pvk -spc MyCert.cer -pfx MyCert.pfx -pi <password>
將用戶端憑證匯入個人存放區
- 在 Windows 檔案總管中按兩下 MyCert.pfx。
- 在 [憑證匯入精靈] 中,選取 [目前使用者] 然後按下 [下一步]。
- 確認檔案路徑,然後按 [下一步]。
- 輸入密碼,維持 [包含所有擴充屬性] 已核取,然後按 [下一步]。
- 維持 [自動選取憑證存放區[…] 已核取,然後按 [下一步]。
- 按下 [完成] 和 [確定]。
將 PFX 檔案上傳至雲端服務
- 前往 Azure 入口網站。
- 選取 [雲端服務]。
- 選取您在上方為分割/合併服務建立的雲端服務。
- 在頂端功能表上,按下 [憑證]。
- 在末端列上,按下 [上傳]。
- 選取 PFX 檔案,然後輸入與上述相同的密碼。
- 完成後,請從清單中的新項目複製憑證指紋。
更新服務組態檔
將在上方複製的憑證指紋貼上至這些設定的指紋/值屬性。 針對背景工作角色:
<Setting name="DataEncryptionPrimaryCertificateThumbprint" value="" />
<Certificate name="DataEncryptionPrimary" thumbprint="" thumbprintAlgorithm="sha1" />
針對 Web 角色:
<Setting name="AdditionalTrustedRootCertificationAuthorities" value="" />
<Setting name="AllowedClientCertificateThumbprints" value="" />
<Setting name="DataEncryptionPrimaryCertificateThumbprint" value="" />
<Certificate name="SSL" thumbprint="" thumbprintAlgorithm="sha1" />
<Certificate name="CA" thumbprint="" thumbprintAlgorithm="sha1" />
<Certificate name="DataEncryptionPrimary" thumbprint="" thumbprintAlgorithm="sha1" />
請注意,針對生產部署,個別憑證應該用於 CA、加密、伺服器憑證和用戶端憑證。 如需相關詳細指示,請參閱安全性設定。
部署服務
- 移至 Azure 入口網站
- 選取您稍早建立的雲端服務。
- 按一下 [概觀]。
- 選擇預備環境,然後按下 [上傳]。
- 在對話方塊中,輸入部署標籤。 針對 [套件] 和 [組態],按下 [從本機] 並選擇 SplitMergeService.cspkg 檔案和您稍早設定的 cscfg 檔案。
- 確定已選取標示為 [即使一個或多個角色包含單一執行個體也要部署] 核取方塊。
- 按右下角的刻度按鈕以開始部署。 此作業預期需要幾分鐘時間才能完成。
部署疑難排解
如果您的 Web 角色無法上線,則安全性設定可能會有問題。 檢查 TLS/SSL 是否已照上述方式設定。
如果背景工作角色無法上線,但 Web 角色成功上線,很可能是連線到您稍早建立的狀態資料庫時出現問題。
請確定 cscfg 中的連接字串正確無誤。
檢查伺服器和資料庫是否存在,以及使用者識別碼和密碼是否正確。
針對 Azure SQL 資料庫,連接字串的格式應該是:
Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<user>; Password=<password>; Encrypt=True; Connection Timeout=30
請確定伺服器名稱開頭不是 https://。
請確定您的伺服器能讓 Azure 服務與之連線。 若要這樣做,請在入口網站中開啟您的資料庫,並確定 [允許存取 Azure 服務] 設定設為 [開啟]**。
測試服務部署
使用網頁瀏覽器連線
判斷分割合併服務的 Web 端點。 您可以移至雲端服務概觀,並在右側的 [網站網址] 底下查看,以在入口網站中找到此資訊。 將 http:// 取代為 https://,因為預設安全性設定會停用 HTTP 端點。 將此網址的頁面載入瀏覽器。
使用 PowerShell 指令碼測試
藉由執行包含的範例 PowerShell 指令碼,即可測試部署和您的環境。
重要
範例指令碼會在 PowerShell 5.1上執行。 它們目前不會在 PowerShell 6或更新版本上執行。
包含的指令碼檔案如下:
SetupSampleSplitMergeEnvironment.ps1 - 設定分割/合併的測試資料層 (請參閱下表以取得詳細描述)
ExecuteSampleSplitMerge.ps1 - 在測試資料層上執行測試作業 (請參閱下表以取得詳細描述)
GetMappings.ps1 - 最上層範例指令碼,會列印出分區對應的目前狀態。
ShardManagement.psm1 - 包裝 ShardManagement API 的協助程式指令碼
SqlDatabaseHelpers.psm1 - 協助程式指令碼,用於在 SQL 資料庫中建立和管理資料庫
PowerShell 檔案 步驟 SetupSampleSplitMergeEnvironment.ps1 1 .建立分區對應管理員資料庫 2 .建立 2 個分區資料庫。 3 .為這些資料庫建立分區對應 (刪除這些資料庫上的任何現有分區對應)。 4. 在分區中建立小型範例資料表,並在其中一個分區中填入資料表。 5. 宣告分區資料表的 SchemaInfo。 PowerShell 檔案 步驟 ExecuteSampleSplitMerge.ps1 1. 將分割要求傳送至 Split-Merge Service Web 前端,將一半資料從第一個分區分割至第二個分區。 2.輪詢 Web 前端以取得分割要求狀態,並等候要求完成。 3. 將合併要求傳送至 Split-Merge Service Web 前端,將資料從第二個分區移回第一個分區。 4.輪詢 Web 前端的合併要求狀態,並等候要求完成。
使用 PowerShell 來驗證部署
開啟新的 PowerShell 視窗,並瀏覽至您下載分割合併套件的目錄,然後瀏覽至 "PowerShell" 目錄。
建立伺服器 (或選擇現有伺服器),其中將建立分區對應管理員和分區。
注意
SetupSampleSplitMergeEnvironment.ps1 指令碼預設會在相同伺服器上建立所有這些資料庫,以保持指令碼簡單。 這不是分割合併服務本身的限制。
分割合併服務需要具有資料庫讀取/寫入權限的 SQL 驗證登入,才能移動資料並更新分區對應。 由於分割合併服務會在雲端中執行,因此目前不支援整合式驗證。
請確定伺服器已設定為允許從執行這些指令碼之電腦的 IP 位址存取。 您可以在 SQL Server / 防火牆和虛擬網路 / 用戶端 IP 位址下找到此設定。
執行 SetupSampleSplitMergeEnvironment.ps1 指令碼來建立範例環境。
執行此指令碼將會抹除分區對應管理員資料庫和分區上任何現有的分區對應管理資料結構。 如果您想要重新初始化分區對應或分區,重新執行指令碼可能很有用。
範例命令列:
.\SetupSampleSplitMergeEnvironment.ps1 -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
執行 Getmappings.ps1 指令碼,以檢視目前存在於範例環境中的對應。
.\GetMappings.ps1 -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
執行 ExecuteSampleSplitMerge.ps1 指令碼來執行分割作業 (將第一個分區上的一半資料移至第二個分區),然後執行合併作業 (將資料移回第一個分區)。 如果您已設定 TLS 並讓 HTTP 端點保持停用,請確定您改用 https:// 端點。
範例命令列:
.\ExecuteSampleSplitMerge.ps1 -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net' -SplitMergeServiceEndpoint 'https://mysplitmergeservice.cloudapp.net' -CertificateThumbprint '0123456789abcdef0123456789abcdef01234567'
如果您收到下列錯誤,很可能是 Web 端點憑證發生問題。 嘗試使用您慣用的網頁瀏覽器連線到 Web 端點,並檢查是否有憑證錯誤。
Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLSsecure channel.
如果成功,輸出看起來應該如下所示:
> .\ExecuteSampleSplitMerge.ps1 -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net' -SplitMergeServiceEndpoint 'http://mysplitmergeservice.cloudapp.net' -CertificateThumbprint 0123456789abcdef0123456789abcdef01234567 > Sending split request > Began split operation with id dc68dfa0-e22b-4823-886a-9bdc903c80f3 > Polling split-merge request status. Press Ctrl-C to end > Progress: 0% | Status: Queued | Details: [Informational] Queued request > Progress: 5% | Status: Starting | Details: [Informational] Starting split-merge state machine for request. > Progress: 5% | Status: Starting | Details: [Informational] Performing data consistency checks on target shards. > Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from source to target shard. > Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Waiting for reference tables copy completion. > Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from source to target shard. > Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Moving key range [100:110) of Sharded tables > Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Successfully copied key range [100:110) for table [dbo].[MyShardedTable] > ... > ... > Progress: 90% | Status: Completing | Details: [Informational] Successfully deleted shardlets in table [dbo].[MyShardedTable]. > Progress: 90% | Status: Completing | Details: [Informational] Deleting any temp tables that were created while processing the request. > Progress: 100% | Status: Succeeded | Details: [Informational] Successfully processed request. > Sending merge request > Began merge operation with id 6ffc308f-d006-466b-b24e-857242ec5f66 > Polling request status. Press Ctrl-C to end > Progress: 0% | Status: Queued | Details: [Informational] Queued request > Progress: 5% | Status: Starting | Details: [Informational] Starting split-merge state machine for request. > Progress: 5% | Status: Starting | Details: [Informational] Performing data consistency checks on target shards. > Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from source to target shard. > Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Moving key range [100:110) of Sharded tables > Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Successfully copied key range [100:110) for table [dbo].[MyShardedTable] > ... > ... > Progress: 90% | Status: Completing | Details: [Informational] Successfully deleted shardlets in table [dbo].[MyShardedTable]. > Progress: 90% | Status: Completing | Details: [Informational] Deleting any temp tables that were created while processing the request. > Progress: 100% | Status: Succeeded | Details: [Informational] Successfully processed request. >
用其他資料類型實驗。 所有這些指令碼都會採用選擇性的 -ShardKeyType 參數,可讓您指定金鑰類型。 預設為 Int32,但您也可以指定 Int64、Guid 或二進位。
建立要求
此服務可以透過 Web UI 使用,也可以透過匯入和使用 SplitMerge.psm1 PowerShell 模組來使用服務,該模組將透過 Web 角色提交您的要求。
服務可以移動分區資料表和參考資料表中的資料。 分區資料表具有分區化索引鍵資料行,並在每個分區上有不同的資料列資料。 參考資料表並未分區化,因此它會在每個分區上包含相同的資料列資料。 參考資料表對不會經常變更的資料很有用,而且會用於在查詢中與分區資料表聯結。
若要執行分割合併作業,您必須宣告要移動的分區資料表和參考資料表。 這是使用 SchemaInfo API 完成的。 此 API 位於 Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema 命名空間中。
- 針對每個分區資料表,建立 ShardedTableInfo 物件來描述資料表的父系結構描述名稱 (選用,預設值為 「dbo」)、資料表名稱,以及包含分區化索引鍵之資料表中的資料行名稱。
- 針對每個參考資料表,建立 ReferenceTableInfo 物件來描述資料表的父系結構描述 (選用,預設值為 「dbo」) 和資料表名稱。
- 將上述 TableInfo 物件新增至新的 SchemaInfo 物件。
- 取得 ShardMapManager 物件的參考,並呼叫 GetSchemaInfoCollection。
- 將 SchemaInfo 新增至 SchemaInfoCollection,並提供分區對應名稱。
您可以在 SetupSampleSplitMergeEnvironment.ps1 指令碼中看到此範例。
分割合併服務不會為您建立目標資料庫 (或資料庫中任何資料表的結構描述)。 必須先預先建立它們,才能將要求傳送至服務。
疑難排解
執行範例 PowerShell 指令碼時,您可能會看到下列訊息:
Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
此錯誤表示您的 TLS/SSL 憑證未正確設定。 請遵照「使用網頁瀏覽器連線」一節中的指示。
如果您無法提交要求,您可能會看到下列內容:
[Exception] System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'dbo.InsertRequest'.
在此情況下,請檢查組態檔,特別是 WorkerRoleSynchronizationStorageAccountConnectionString 的設定。 此錯誤通常表示背景工作角色無法在第一次使用時成功初始化中繼資料資料庫。
其他資源
尚未使用彈性資料庫工具? 請參閱使用者入門指南。 如有疑問,請在 SQL Database 的 Microsoft Q&A 問題頁面上與我們連絡。如有功能要求,請在 SQL Database 意見反應論壇中新增想法或投票支持現有的想法。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應