雲資料
SQL Azure 開發入門
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 帳戶之後,開始訪問它的最簡單方法是通過 入口網站 sql.azure.com。 您必須使用與 Windows Azure 帳戶關聯的 Windows Live ID 登入。 登入之後,您可以建立您的伺服器安裝,並開始開發應用程式。
圖 1 顯示了 SQL Azure 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 身分識別驗證。 另外還支援Multiple Active Result Set (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 串連樣本:
1. Server=tcp:server.ctp.database.windows.
2. net; Database=<databasename>; User ID=user@server; Password=password; Trusted_Connection=False; Encrypt=true;
3.
設定資料庫
當您成功串連到伺服器安裝之後,將需要建立一個或多個資料庫。 儘管可以使用 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 資料庫。 跨伺服器複製的文法如下所示:
1. CREATE DATABASE DB2A AS COPY OF Server1.DB1A
2.
支援 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 查詢最佳化工具,用於查看估計的或實際的查詢執行計畫的詳細資料以及用戶端統計資訊
- 部分動態管理檢視可監控健全狀態和狀態
- Entity Framework,可在通過串連到 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 的計費情況。 圖 6 顯示了一個樣本。在此視圖中,數量的單位是 KB。 您可以通過以下命令來監控使用的空間:
1. SELECT SUM(reserved_page_count) * 8192 FROM sys.dm_db_partition_stats
2.
圖 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。
http://msdn.microsoft.com/zh-cn/magazine/gg309175.aspx
sql azure 測試環境
http://www.sqlazurelabs.com/
購買sql azure正式服務
http://www.microsoft.com/windowsazure/
sql azure 申請試用
http://www.microsoft.com/windowsazure/getstarted/default.aspx