云数据

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 的计费情况。图 6 显示了一个示例。在此视图中,数量的单位是 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