本文章是由機器翻譯。

雲端資料

SQL Azure 開發入門

Lynn Langit

Microsoft Windows Azure 提供了多種資料存儲可選方式,其中包括 Windows Azure 存儲和 SQL Azure。您可以選擇在特定專案中使用其中一種,也可以兩種都使用。Windows Azure 存儲目前包含三種存儲結構:表、佇列和 Blob。.

SQL Azure 是雲中的關係資料存儲服務。此產品的一項優勢是可以使用熟悉的關係開發模型,包括很多標準的 SQL Server 語言 (T-SQL)、工具和實用工具。當然,在雲中使用很容易理解的關聯式結構(例如表、視圖和存儲過程)也會提高開發人員使用這個新平臺的效率。其他優勢包括可以減少實際的資料庫管理工作(包括伺服器的設置、維護和安全防護),以及對可靠性、高可用性和可擴展性的內置支援。

本文不會介紹 Windows Azure 存儲,也不會比較這兩種存儲模式。有關這些可選存儲方式的更多資訊,請查閱 Julie Lerman 于 2010 年 7 月撰寫的“資料點”專欄 (msdn.microsoft.com/magazine/ff796231)。有一點要引起注意,就是 Windows Azure 表並不是關係表。強調這一點的主要目的在於讓您瞭解 SQL Azure 中包含的功能。

本文將探討 SQL Server 和 SQL Azure 之間的不同之處。您需要深入瞭解這些不同之處,才能合理利用您目前掌握的 SQL Server 知識,處理好以 SQL Azure 作為資料來源的專案。

如果您在雲計算方面是新手,則在繼續閱讀本文之前,您需要瞭解一些有關 Windows Azure 的背景知識,不妨從 MSDN 開發人員雲中心 (msdn.microsoft.com/ff380142) 開始。

SQL Azure 入門

若要開始使用 SQL Azure,您首先需要設置帳戶。如果您訂閱了 MSDN,可以在最多 16 個月內使用三個 SQL Azure 資料庫(每個最大 1GB)作為開發人員沙箱(詳細資訊,請參見 msdn.microsoft.com/subscriptions/ee461076)。若要註冊一般的 SQL Azure 帳戶(需收取存儲和資料傳輸費用),請訪問 microsoft.com/windowsazure/offers/

註冊 SQL Azure 帳戶之後,開始訪問它的最簡單方法是通過 Web 門戶 sql.azure.com。您必須使用與 Windows Azure 帳戶關聯的 Windows Live ID 登錄。登錄之後,您可以創建您的伺服器安裝,並開始開發應用程式。

图 1 顯示了 SQL Azure Web 管理門戶的示例,可以在其中看到伺服器及其關聯的資料庫。您會注意到,該 Web 門戶中還包含一個選項卡,用於管理您的 SQL Azure 安裝的防火牆設置。

圖 1 SQL Azure 資料庫的摘要資訊

首次創建 SQL Azure 伺服器安裝時,將為其分配一個隨機字串作為伺服器名稱。您一般也可以在創建伺服器時,設置管理員的使用者名、密碼、伺服器的地理位置以及防火牆規則。您可以在創建伺服器時為 SQL Azure 選擇安裝位置。系統會為您提供位置(資料中心)清單,可以從中選擇位置。如果您的應用程式前端構建在 Windows Azure 中,您可以選擇將應用程式安裝與 SQL Azure 安裝相關聯,從而將這兩者安置在同一地理位置。

預設情況下,不能訪問您的伺服器,因此需要為所有用戶端 IP 創建防火牆規則。SQL Azure 使用埠 1433,因此需要確保該埠也對您的用戶端應用程式開放。連接 SQL Azure 時,您需要使用 username@servername 格式的使用者名。SQL Azure 只支援 SQL Server 身份驗證,不支援 Windows 身份驗證。另外還支援多重活動結果集 (MARS) 連接。

打開的連接如果處於不活動狀態的時間達到 30 分鐘,將超時。另外,如果出現長時間運行的查詢和事務,或者如果資源使用過度,連接也會斷開。在您的應用程式中,有關連接的最佳開發準則就是手動打開、使用然後關閉這些連接,加入針對已斷開連接的連接重試邏輯,還要避免因為這些行為而導致緩存連接。有關 SQL Azure 支援的用戶端協定的詳細資訊,請參見 Steve Hale 的博客文章 (blogs.msdn.com/b/sqlnativeclient/archive/2010/02/12/using-sql-server-client-apis-with-sql-azure-vversion-1-0.aspx)。

另一項最佳準則是加密您的連接字串,以防止中間人攻擊。

如果您不在連接字串中指定資料庫名稱,預設情況下您將連接到主要資料庫。在 SQL Azure 中,不支援使用 T-SQL 語句 USE 來更改資料庫,因此您一般需要在連接字串中指定要連接的資料庫(假設您要連接到主要資料庫之外的其他資料庫)。以下是一個 ADO.NET 連接示例:

    Server=tcp:server.ctp.database.windows.
    net;
    Database=<databasename>;
    User ID=user@server;
    Password=password;
    Trusted_Connection=False;
    Encrypt=true;

設置資料庫

當您成功連接到伺服器安裝之後,將需要創建一個或多個資料庫。儘管可以使用 SQL Azure 門戶創建資料庫,您可能還是希望使用其他一些工具,例如 SQL Server Management Studio 2008 R2。預設情況下,您最多可以為每個 SQL Azure 伺服器安裝創建 149 個數據庫。如果您需要更多資料庫,必須致電 Windows Azure 業務中心,要求增加限值。

創建資料庫時,您必須選擇最大大小。目前的大小設置(以及計費)選項是 Web Edition 或 Business Edition。預設選項 Web Edition 支援總大小為 1GB 或 5GB 的資料庫。Business Edition 支援最大為 50GB 的資料庫,可以 10GB 為增量確定大小,即支援 10GB、20GB、30GB、40GB 和 50GB 的資料庫。

創建資料庫時,您可以使用 MAXSIZE 關鍵字對資料庫的大小做出限制。最初創建之後,可以使用 ALTER DATABASE 語句更改大小限制或版本(Web 或 Business)。如果您達到所選版本的大小或容量限制,您將收到錯誤代碼 40544。衡量資料庫大小時並不包括主要資料庫,也不包括資料庫日誌。有關大小和定價的詳細資訊,請參見 microsoft.com/windowsazure/pricing/#sql

在您創建新的 SQL Azure 資料庫時,必須意識到您實際上是在創建該資料庫的三個副本。這樣做的目的是為了確保高可用性。這些資料庫副本對您來說是完全透明的。新的資料庫顯示為供您使用的一個單元。

創建資料庫之後,通過在門戶上的清單中選擇資料庫並按一下“連接字串”按鈕,可以快速獲得資料庫的連接字串資訊。您還可以按一下所選資料庫的“測試連接”按鈕,通過門戶快速測試連接。要使此測試成功,您必須在 SQL Azure 門戶上的“防火牆規則”選項卡上啟用“允許 Microsoft 服務連接到此伺服器”選項。

創建應用程式

設置帳戶、創建伺服器、創建至少一個資料庫並設置防火牆規則從而可以連接資料庫之後,您可以開始使用這個資料來源開發應用程式。

與 Windows Azure 資料存儲可選方式(例如表、佇列或 Blob)不同,當您使用 SQL Azure 作為專案的資料來源時,您無需在開發環境中安裝任何內容。如果您使用的是 Visual Studio 2010,您可以直接開始,而無需更多的 SDK、工具或其他任何內容。

儘管很多開發人員選擇使用 Windows Azure 作為前端並使用 SQL Azure 作為後端,但這種配置不是必需的。您可以使用任意的前端用戶端,只需具備受支援的連接庫即可,例如 ADO.NET 或 ODBC。這其中包括使用 Java 或 PHP 編寫的應用程式。目前不支援通過 OLE DB 連接到 SQL Azure。

如果您使用 Visual Studio 2010 開發應用程式,您可以利用其中提供的功能,直接從 Visual Studio 伺服器資源管理器在所選的 SQL Azure 資料庫安裝中查看或創建很多類型的物件。這些物件是表、視圖、存儲過程、函數和同義詞。您還可以使用這個檢視器查看與這些物件相關的資料。對於很多開發人員來說,使用 Visual Studio 2010 作為主要的工具來查看和管理 SQL Azure 資料就足夠了。图 2 是伺服器資源管理器的視圖視窗,其中顯示了資料庫的本地安裝和雲實例。您會發現,兩個視圖中的樹節點稍有不同。例如,雲安裝中沒有程式集節點,因為 SQL Azure 不支援自訂程式集。

圖 2 在 Visual Studio 伺服器資源管理器中查看資料連接

正如前文所述,另一個可用來處理 SQL Azure 的工具是 SQL Server Management Studio (SSMS) 2008 R2。與使用 Visual Studio 2010 相比,您使用 SSMS 2008 R2 可以訪問更多的 SQL Azure 資料庫操作。這兩種工具,我自己都會使用,具體取決於要完成的操作。SSMS 2008 R2 提供而 Visual Studio 2010 中沒有的一個操作例子是使用 T-SQL 腳本創建新的資料庫。另一個例子是它能夠輕鬆地執行索引操作(創建、維護和刪除等等)。图 3 顯示了一個例子。

圖 3 使用 SQL Server Management Studio 2008 R2 管理 SQL Azure

SQL Server 2008 R2 最新發佈的一項功能是資料層應用程式,或者稱為 DAC。DAC pac 物件在一個實體中綜合了 SQL Server 或 SQL Azure 資料庫架構和物件。您可以使用 Visual Studio 2010(構建)或 SQL Server 2008 R2 SSMS(提取),從現有的資料庫創建 DAC。

如果您希望使用 Visual Studio 2010 處理 DAC,則應首先在 Visual Studio 2010 中選擇 SQL Server 資料層應用程式專案類型。然後在解決方案資源管理器中,按右鍵專案名稱,按一下“導入資料層應用程式”。系統將打開一個嚮導,指導您完成導入過程。如果您使用的是 SSMS,則可以在物件資源管理器中按右鍵要使用的資料庫,然後按一下“任務”,再按一下“提取資料層應用程式”以創建 DAC。

生成的 DAC 是一個壓縮檔,其中包含多個 T-SQL 和 XML 檔。您可以按右鍵 .dacpac 檔,然後按一下“解壓縮”來使用這些內容。SQL Azure 支援刪除、部署、提取和註冊 DAC pac,但 支援升級它們。

另一個可用來連接 SQL Azure 的工具是代碼名稱為“Houston”的工具的最新社區技術預覽 (CTP) 版。Houston 是針對 SQL Azure 安裝的管理工具,基於 Silverlight 技術,無需安裝。使用 Houston 連接 SQL Azure 安裝時,您需要指定資料中心的位置(截止本文發表時,這些資料中心分別位於美國中北部、美國中南部、歐洲北部、歐洲中部、亞太地區和南亞地區)。

Houston 尚處於早期 Beta 版本,目前發佈的版本(如圖 4 所示)有些像 SSMS。Houston 支援處理 SQL Azure 資料庫安裝中的表、視圖、查詢和存儲過程。您可以從 SQL Azure 實驗室網站訪問 Houston,位址是 sqlazurelabs.com/houston.aspx

圖 4 使用 Houston 管理 SQL Azure

另一個可用來連接 SQL Azure 資料庫的工具是 SQLCMD (msdn.microsoft.com/library/ee336280)。儘管 SQL Azure 支援 SQLCMD,但並不支援 OSQL 命令列工具。

使用 SQL Azure

現在,您已經連接到 SQL Azure 安裝並創建了一個新的空資料庫。那麼能用 SQL Azure 做什麼呢?具體來說,您可能想知道在創建物件時有哪些限制。創建這些物件之後,您該如何使用資料填充這些物件?

正如我在本文開頭所說,SQL Azure 提供了關聯式雲資料存儲,但它與本地安裝的 SQL Server 在某些功能上存在微妙的差別。從創建物件開始,我們來看一看這兩者之間的關鍵差別。

您可以使用熟悉的方法在 SQL Azure 資料庫中創建最常用的物件。所有最常用的關係物件(包括表、視圖、存儲過程、索引和函數)都可以使用。但是物件的創建過程有一些差別。以下就是對這些差別的總結:

  • SQL Azure 表必須包含聚集索引。隨後,可以在選定的表上創建非聚集索引。您可以創建空間索引,但無法創建 XML 索引。
  • 不支援堆表。
  • 支援 CLR 地理空間類型(例如 Geography 和 Geometry),也支援 HierachyID 資料類型。其他 CLR 類型則不受支援。
  • 創建視圖必須是批次處理中的第一條語句。另外,不支援創建加密的視圖(或存儲過程)。
  • 函數可以是標量、內聯或多語句表值函數,但不能是 CLR 類型的函數。

有關 SQL Azure 部分支援的 T-SQL 語句的完整參考,請參見 MSDN 中的 msdn.microsoft.com/library/ee336267

在您開始創建物件之前,請記住如果您沒有在連接字串中指定其他資料庫,您將連接到主要資料庫。在 SQL Azure 中,不支援使用 USE (database) 語句更改資料庫;如果您需要連接到除主要資料庫之外的其他資料庫,則必須在連接字串中明確指定該資料庫,如前文所述。

資料移轉和載入

如果您打算使用現有的本地資料庫作為來源資料和結構來創建 SQL Azure 物件,則您只需使用 SSMS 編寫合適的 DDL 腳本,在 SQL Azure 上創建這些物件。使用生成腳本嚮導並將“資料庫引擎類型的腳本”選項設置為“SQL Azure”。

一種更加簡單的腳本生成方法是使用 SQL Azure 遷移嚮導,該嚮導可從 CodePlex 下載,位址是 sqlazuremw.codeplex.com。使用這個方便的工具,您可以生成腳本來創建物件,還可以使用 bcp.exe,通過大容量複製來載入資料。

您還可以設計 SQL Server Integration Services (SSIS) 套裝程式來提取並運行 DDM 或 DDL 腳本。如果您使用的是 SSIS,最常用的方式是設計一個從來源資料庫提取 DDL 的套裝程式,針對 SQL Azure 編寫該 DDL 的腳本,然後在一個或多個 SQL Azure 安裝上執行該腳本。您還可以選擇載入相關的資料,作為該套裝程式執行路徑的一部分。有關使用 SSIS 的更多資訊,請參見 msdn.microsoft.com/library/ms141026

有關 DDL 創建和資料移轉,還請注意 CTP 版本的 SQL Azure 資料同步服務 (sqlazurelabs.com)。您可以在第 9 頻道視頻“使用 SQL Azure 資料同步服務為 SQL Azure 資料庫提供地理位置複製功能”中看到此服務的實際效果,位址是 tinyurl.com/2we4d6q。目前,SQL Azure 資料同步服務通過同步組(HUB 和 MEMBER 伺服器)、然後通過計畫的同步在選擇進行同步的資料庫中的各個表級別工作。

您可以使用 Microsoft Sync Framework Power Pack for SQL Azure 在資料來源和 SQL Azure 安裝之間同步資料。截至本文發表時,該工具仍然是 CTP 版本,可從 tinyurl.com/2ecjwku 獲得。如果您使用此框架為應用程式執行後續的或持續的資料同步,您可能還希望下載相關的 SDK。

如果您的來源資料庫比 SQL Azure 資料庫安裝的最大大小還要大,該怎麼辦?也就是說,大於 Business Edition 中 50GB 的絕對最大值或大於根據其他程式選項而設置的小一些的大小限制。

目前,如果使用者資料庫大小超出程式的限制,使用者必須對資料進行手動分區(或打碎)。Microsoft 已經宣佈,將在未來推出用於 SQL Azure 的自動分區工具。同時,需要注意的是 SQL Azure 不支援 T-SQL 表分區。您可以使用這款免費的實用工具 Enzo SQL Shard (enzosqlshard.codeplex.com),將您的資料來源分區。

您需要注意 SQL Server 和 SQL Azure 在資料載入和資料訪問方面的其他一些差別。

最近加入的一項功能是通過“資料庫複製”命令複製 SQL Azure 資料庫。跨伺服器複製的語法如下所示:

    CREATE DATABASE DB2A AS COPY OF Server1.DB1A

支援 T-SQL INSERT 語句(但不支援在 INSERT 語句內更新視圖或提供鎖定提示)。

針對 SQL Azure 安裝執行時,T-SQL DROP DATABASE 和其他 DDL 命令在資料移轉方面還有更多限制。此外,T-SQL RESTORE 和 ATTACH DATABASE 命令不受支援。最後,T-SQL 語句 EXECUTE AS (login) 不受支援。

資料訪問和程式設計

現在,我們討論在處理雲資料時需要注意的一般程式設計事項。首先,您要考慮將開發環境設置在哪裡。如果您訂閱了 MSDN,而且可以處理小於 1GB 的資料庫,則只使用雲安裝(沙箱)即可進行開發。如果是這樣,從本地向雲環境遷移就不會有任何問題。如果沒有訂閱 MSDN,則使用一般的 SQL Azure 帳戶,可以直接針對雲實例進行開發(最有可能的是使用生產資料庫在雲中的副本)。當然,直接從雲中進行開發並不適合所有情況。

如果您選擇本地安裝的 SQL Server 資料庫作為開發的資料來源,則必須開發一種機制來同步本地安裝和雲安裝。您可以使用前文介紹的方法進行同步,而正在開發的工具,如 Data Sync Services 和 Sync Framework 等,正是針對這種情況的。

只要您只使用受支援的功能,則將您的應用程式從本地安裝的 SQL Server 轉換到 SQL Azure 資料庫的方法就很簡單:只需更改應用程式中的連接字串即可。

無論您是將開發環境設置在本地還是設置在雲中,您都需要瞭解 SQL Server 和 SQL Azure 在程式設計方面的差別。我已經介紹了 T-SQL 以及連接字串的差別。此外,所有表至少必須具備聚集索引(堆表不受支援)。

如前所述,用於更改資料庫的 USE 語句不受支援。這也意味著,不支援分散式(跨資料庫)事務或查詢,也不支援連結的伺服器。

在使用 SQL Azure 資料庫時 能使用的其他選項包括:

  • 全文索引
  • CLR 自訂類型(但支援內置的 CLR 類型 Geometry 和 Geography)
  • RowGUID(支援對 NEWID 函數使用 uniqueidentifier 類型)
  • XML 列索引
  • Filestream 資料類型
  • 稀疏列

預設排序規則始終用於資料庫。若要調整排序規則,請使用 T-SQL COLLATE 語句將列級排序規則設置為所需的值。

最後,目前還無法對 SQL Azure 資料庫使用 SQL 事件探查器或資料庫優化嚮導。

一些用於對 SQL Azure 進行優化和監控的重要工具包括:

  • SSMS 查詢最佳化工具,用於查看估計的或實際的查詢執行計畫的詳細資訊以及用戶端統計資訊
  • 部分動態管理視圖可監控運行狀況和狀態
  • 實體框架,可在通過連接到 SQL Azure 資料庫的本機複本創建初始模型和映射檔之後,連接到 SQL Azure。

根據您所開發的應用程式類型,您可以使用 SSAS、SSRS、SSIS 或 PowerPivot。您還可以將這些產品作為 SQL Azure 資料庫資料的使用者。只需使用本文前面介紹的方法連接到 SQL Azure 伺服器和選定的資料庫即可。

充分瞭解 SQL Azure 中的事務行為也很重要。如前所述,只支援本地(在同一資料庫中)事務。此外,SQL Azure 上託管的資料庫可以使用的唯一事務隔離級別是 READ COMMITTED SNAPSHOT。使用這個隔離級別,讀取者在語句開始執行時獲得的是最新版本的資料。

SQL Azure 不會檢測更新衝突。這也稱為樂觀併發模型,因為會發生更新丟失、不可重複的讀取和幻影。當然,不會發生髒讀。

資料庫管理

一般而言,使用 SQL Azure 時,管理員的角色只是一種邏輯上的安裝管理。實際的管理工作由平臺執行。從實用的觀點而言,這意味著無需購買、安裝、修補、維護或保護實際的伺服器。也不存在實際的位置去實際放置檔、日誌、tempdb 等等。因此,不支援 T-SQL 命令 USE <database >、FILEGROUP、BACKUP、RESTORE 或 SNAPSHOT。.

SQL Azure 上也不支援使用 SQL 代理。另外,也不支援(或不需要)配置複製、日誌傳送、資料庫鏡像或群集。如果您需要在本地維護 SQL Azure 架構和資料的同步副本,則您可以使用前文討論的用於資料移轉和同步的工具,這些工具都是雙向作用的。您還可以使用 DATABASE COPY 命令。

除了保持資料同步之外,管理員還需要在 SQL Azure 安裝上執行哪些任務?

最基本的,仍然需要執行邏輯管理。其中包括安全性以及性能管理方面的任務。此外,還需要監控容量的使用以及相關的花費。為説明您完成這些任務,SQL Azure 提供了一個公共的“狀態歷史記錄”面板,用於顯示當前的服務狀態以及最近的歷史記錄(圖 5 顯示了歷史記錄示例),面板的位址位於 microsoft.com/windowsazure/support/status/servicedashboard.aspx

圖 5 SQL Azure 狀態歷史記錄

預設情況下,SQL Azure 具備很高的安全性標準。它對所有允許的(通過防火牆規則)用戶端連接均強制使用 SSL 加密。伺服器級別的登錄以及資料庫級別的使用者和角色都是安全的。SQL Azure 沒有伺服器級別的角色。對連接字串進行加密是最佳做法。另外,您還可以使用 Windows Azure 證書來增加安全性。有關詳細資訊,請參見 blogs.msdn.com/b/sqlazure/archive/2010/09/07/10058942.aspx

在性能方面,SQL Azure 可自動終止長時間運行的事務和空閒連接(超過 30 分鐘)。儘管您無法使用 SQL 事件探查器或跟蹤標記來優化性能,但您可以使用 SQL 查詢最佳化工具來查看查詢執行計畫和用戶端的統計資訊。您還可以使用標準 T-SQL 方法來執行統計資訊管理和索引優化。

此外,還可以在資料庫管理中使用一些動態管理視圖(覆蓋資料庫、執行或事務資訊)。其中包括 sys.dm_exec_connections、_requests、_sessions、_tran_database_transactions、_active_transactions 和 _partition_stats。有關 SQL Azure 支援的動態管理視圖的完整清單,請參見 msdn.microsoft.com/library/ee336238.aspx#dmv

還有一些新視圖,例如 sys.database_usage 和 sys.bandwidth_usage。這些視圖顯示資料庫的數量、類型和大小以及每個資料庫的頻寬使用情況,以便管理員掌握 SQL Azure 的計費情況。A sample is shown in Figure 6. In this view, quantity is listed in KB.您可以通過以下命令來監控使用的空間:

    SELECT SUM(reserved_page_count) * 8192 
    FROM sys.dm_db_partition_stats

圖 6 SQL 查詢中的頻寬使用情況

您還可以通過 SQL Azure 門戶瞭解 SQL Azure 安裝的當前費用情況,只需按一下螢幕右上角的“計費”連結即可。

瞭解更多

若要瞭解有關 SQL Azure 的更多資訊,我建議您下載 Windows Azure 培訓工具包,其中包括 SQL Azure 實踐課程、白皮書、視頻等等。該培訓工具包可從 microsoft.com/downloads/details.aspx?FamilyID=413E88F8-5966-4A83-B309-53B7B77EDF78 獲得。

另外,您可以參閱 SQL Azure 團隊的博客 blogs.msdn.com/b/sqlazure/ 以及 MSDN SQL Azure 開發人員中心 msdn.microsoft.com/windowsazure/sqlazure

如果您要繼續預覽即將推出的 SQL Azure 功能,請訪問 SQL Azure 實驗室 sqlazurelabs.com

Lynn Langit 是 Microsoft 在南加利福尼亞的開發推廣人員。她出版了兩部關於 SQL Server 商業智慧的著作,並且在 TeachingKidsProgramming.org 開發了一系列向兒童介紹程式設計的課件。您可以通過以下網址閱讀她的博客:blogs.msdn.com/b/SoCalDevGal

衷心感謝以下技術專家對本文的審閱:George HueyDavid Robinson