• SQL Azure故障排除以及查询优化

    SQL Azure数据库是微软提供的基于云技术的关系型数据库服务。基于云技术的数据解决方案可以提供很多好处,包括快速provisioning, 更经济的的可伸缩性,高可用性并且减少了管理开支。本文介绍了SQL Azure中可用的动态管理视图以及怎样讲它们用于故障排除。

    性能注意事项

    SQL Azure使用SQL Server 2008的数据引擎作为核心。SQL Server 2005引入的动态管理视图(DMVs)已经成为了强大的故障排除工具,被用于排除从系统状态到死锁信息等各个层次的性能问题。在最初发布的SQL Azure中,大部分的DMV是被禁用的,在之后的计划更新(Service Update)中才被启用。DMV暴露了实例级别的信息。由于SQL Azure是一个共享架构模型,因此需要修改DMV来限制DMV的输出使其只显示适当的信息。下面的DMV已经在第一阶段中被启用了。

    这些DMV在本地部署的SQL Server中需要VIEW SERVER STATE的权限。在SQL Azure中,查询这些DMV需要新的名为VIEW DATABASE STATE的权限。

    和事务有关的DMV
    sys.dm_tran_active_transactions:返回与您的当前逻辑数据库的事务有关的信息。
    sys.dm_tran_database_transactions:返回有关用户数据库级事务的信息。
    sys.dm_tran_locks:返回有关当前处于活动状态的锁管理器资源的信息。向锁管理器发出的已授予锁或正等待授予锁的每个当前活动请求分别对应一行。结果集中的列大体分为两组:资源组和请求组。资源组说明正在进行锁请求的资源,请求组说明锁请求。
    sys.dm_tran_session_transactions:返回关联事务和会话的相关信息。

    和执行有关的DMV
    sys.dm_exec_connections: 返回有关与 Microsoft SQL Azure 数据库建立的连接的信息。
    sys.dm_exec_query_plan: 以 XML 格式返回计划句柄指定的批查询的显示计划。计划句柄指定的计划可以处于缓存或正在执行状态。
    sys.dm_exec_query_stats: 返回缓存查询计划的聚合性能统计信息。缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。在从缓存删除计划时,也将从该视图中删除对应行。
    sys.dm_exec_requests: 返回有关在 Microsoft SQL Azure 服务器内执行的每个请求的信息。
    sys.dm_exec_sessions: 返回有关所有活动的用户连接和内部任务的信息。
    sys.dm_exec_sql_text: 返回由指定的 sql_handle 标识的 SQL 批处理的文本。该表值函数将替换系统函数 fn_get_sql。
    sys.dm_exec_text_query_plan: 为 Transact-SQL 批查询或批查询中的特定语句返回文本格式的显示计划。执行计划句柄指定的查询计划可处于缓存状态或正在执行状态。此表值函数与 sys.dm_exec_query_plan 类似,但存在以下差异:
    • 查询计划的输出以文本格式返回。
    • 查询计划的输出无大小限制。


    和数据库相关的DMV
    sys.dm_db_partition_stats:为当前数据库中每个分区返回页和行计数信息。
    只有那些与范围内的服务器直接相关的信息会被暴露出来。在SQL Azure中,那些在SQL Server会返回实例级服务器信息的列将会返回空值。因此,如果你有一些用于SQL Server的自定义故障排除查询,你可以直接在SQL Azure中运行它们而不需要进行修改。

    识别性能不佳的查询语句
    SQL Server为所有执行的查询生成一个优化过的查询计划。这使得SQL Server的优化器可以在同样或者类似的查询执行的时候重用查询计划,从而在最短的时间内接收数据。一旦数据发生变化,数据列上的统计信息会使得查询计划变得过期和低效。为了获得应用程序的最佳性能以及一致的用户体验,识别并且调试这些语句非常的重要。之前列出的DMV可以直接帮助识别那些有问题的查询。

    下面的是一些用于标识这些有问题的查询的基本查询语句:

    过多的重新编译:
    select top 25
        sql_text.text,
        sql_handle,
        plan_generation_num,
        execution_count,
        dbid,
        objectid
    from
        sys.dm_exec_query_stats a
        cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
    where
        plan_generation_num >1
    order by plan_generation_num desc

    不够高效的查询计划
    select
        highest_cpu_queries.plan_handle,
        highest_cpu_queries.total_worker_time,
        q.dbid,
        q.objectid,
        q.number,
        q.encrypted,
        q.[text]
    from
        (select top 50
            qs.plan_handle,
            qs.total_worker_time
        from
            sys.dm_exec_query_stats qs
        order by qs.total_worker_time desc) as highest_cpu_queries
        cross apply sys.dm_exec_sql_text(plan_handle) as q
    order by highest_cpu_queries.total_worker_time desc

    I/O瓶颈
    select top 25
        (total_logical_reads/execution_count) as avg_logical_reads,
        (total_logical_writes/execution_count) as avg_logical_writes,
        (total_physical_reads/execution_count) as avg_phys_reads,
         Execution_count,
        statement_start_offset as stmt_start_offset,
        sql_handle,
        plan_handle
    from sys.dm_exec_query_stats  
    order by
    (total_logical_reads + total_logical_writes) desc

     

    [译自: http://social.technet.microsoft.com/wiki/contents/articles/troubleshoot-and-optimize-queries-with-sql-azure.aspx]

  • SQL Azure入门教学三:创建SQL Azure数据库

    在创建了SQL Azure服务器之后,你就可以创建数据库了。你可以使用Windows Azure Platform Management Portal或者连接到master数据库然后执行CREATE DATABASE语句。master数据库是被自动创建的。无论何时需要执行CREATE DATABASE, ALTER DATABASE或者 DROP DATABASE的时候,都需要连接到master数据库。在连接字串中如果不指定数据库,默认会连接到master数据库。

    这个章节描述了如何使用Windows Azure Platform Management Portal来创建一个测试数据库。

    1. 登录到Windows Azure Platform Management Portal,选择与订阅相关联的服务器,然后点击Create按钮。

      

    2. 为新数据库输入数据库名,版本,最大大小然后点击OK。有关更多信息,请查看Accounts and Billing in SQL Azure

      

    3. SQL Azure会按照你的指定来创建新数据库。

     

    每个SQL Azure服务器有一个唯一的完全限定域名,例如servername.database.windows.netservername就是SQL Azure服务器的名字。 你可以使用完全限定的DNS名来构建数据库的连接字串。例如,

    ADO.NET

    Server=tcp:b8fiitc6yr.database.windows.net;Database=TestDB;User ID=MyAdmin@b8fiitc6yr;Password=myPassword;Trusted_Connection=False;Encrypt=True;

    ODBC

    Driver={SQL Server Native Client 10.0};Server=tcp:b8fiitc6yr.database.windows.net;Database=TestDB;Uid=MyAdmin

    4. 选择数据库列表中或者订阅下的数据库,然后点击Test Connectivity按钮来测试创建的登录名能否连接到SQL Azure数据库。

      

    5. 在Test Connectivity对话框上,输入登录名和密码。之后点击Connect, 对话框会立刻显示连接是否成功。

       请注意,在使用test connectivity之前,你必须启用Allow other Windows Azure services to access this server防火墙规则。

     

     在创建了SQL Azure服务器,数据库,设置防火墙规则后,你就可以使用sqlcmd工具或者SQL Server 2008 R2 Management Studio来连接你的SQL Azure数据库了。更多信息请看Developing and Deploying with SQL Azure

     Windows Azure Platform Management Portal 上有一个在线的数据库管理工具。可以通过选择一个数据库然后点击Manage按钮来访问它。更多信息,请看MSDN documentation for the Database Manager for SQL Azure

     和SQL Server一样,SQL Server允许你创建额外的登录名和用户。更多信息请看Managing Databases and Logins in SQL Azure

     SQL Azure也支持使用T-SQL的子集来对数据库进行查询以及对表中的数据进行插入,更新和删除操作。更多信息请看Transact-SQL Reference

     当你为SQL Azure编写应用程序时,你可以使用任一Visual Studio自带的.NET Framework编程语言,例如Microsoft Visual Basic, Microsoft Visual C# 或者 Microsoft Visual C++。你也可以使用ADO.NET数据提供程序,SQL Server 2008 Native Client ODBC和SQL Server 2008 Driver for PHP。更多信息请看Development Guide

  • SQL Azure入门教学二:创建SQL Azure服务器

    在创建和激活订阅之后,就可以在Windows Azure Platform Management Portal中创建SQL Azure服务器了。

    1. 用与Windows Azure平台订阅相关联的Windows Live ID账户登录Windows Azure Platform Management Portal

    2. 点击New Database Server 或者 Database按钮。

     

    3. 展开Subscriptions节点,点击将关联服务器的订阅名。确定订阅的状态是Ready。点击Create按钮。

    4.  在Create Server向导的首页上,选择服务器所在的地区,然后点击Next。为了节省贷款费用和获得最好的性能,请选择最近的地区。更多详细信息,请查看Accounts and Billing in SQL Azure

     5. 在接下来的页面中,输入登录名和密码来创建一个SQL Azure的管理员登录名。它与SQL Server中的系统管理员sa类似。有关更多信息,请查看Managing Databases and Logins in SQL Azure

    6. 接下来是防火墙规则页面。为了能从Windows Azure Platform Management Portal平台之外访问SQL Azure服务器,你需要指定一条或者多条防火墙规则。如果你想要允许其他的Windows Azure服务或者应用程序访问你的SQL Azure服务器,你需要选择Allow other Windows Azure services to access this server复选框。点击Add来为各个需要访问SQL Azure服务器的IP地址段添加规则。在添加好防火墙规则之后,点击Finish。

    7. 新创建的SQL Azure服务器拥有一个包括防火墙规则的master数据库。接下来的章节描述了如何在Windows Azure Platform Management Portal中创建一个新的数据库。

  • SQL Azure入门教学一:创建一个Windows Azure平台订阅

    

    大家阅读我们之前发布的关于SQL Azure的总体介绍后,相信大家对SQL Azure已经有了初步的了解。接下来我们将提供关于SQL Azure使用方面的入门教学文章,以让大家对SQL Azure有更加感性和丰富的认识。

    创建一个Windows Azure平台订阅

    在开始使用SQL Azure之前,你必须首先订购一个Windows Azure平台订阅。请访问Windows Azure PlatformMicrosoft Online Service Customer Portal

    请注意,一个的账户可以拥有0或者多个订阅。账户代表了你与微软建立了付费关系。一个Windows Azure平台订阅可以包括多个服务,例如Windows AzureWindows Azure AppFabricWindows Azure MarketplaceSQL Azure

    请按照下面的步骤进行订购:

    1.       如果你位于Windows Azure Platform页面上,请选择一个可用的offer然后点击Buy,之后请转到步骤3.

    2.       如果你位于Microsoft Online Service Customer Portal,请点击右上角的Sign in

     

    3.       请输入你的Windows Live e-mail地址和密码,点击Sign in

     

     

      

    4.       如果这是你首次使用Microsoft Online Service Customer Portal,你会被提示填写您的档案信息。在完成之后,就可以进行付费了。

    请点击Services面板,将服务添加到购物车中,如果你之前已经选择了一个offer,这个offer会自动的出现在购物车Shopping Cart中。


     

     

     请点击Rate Plan和View Agreement来再检查下付费计划和协议。如果你接受付费计划和协议,点击acknowledgement复选框再点击checkout。

      5. 在payment options页面中,点击New credit card选项,之后点击Next。

    

     请注意,当你通过Microsoft Online Services Customer Portal购买订阅的时候,你会被要求输入账户所有者的信息。账户所有者或账户管理员可用来登录SQL Azure平台和其他的微软在线服务。账户所有者拥有与微软的计费关系。账户管理员可以登录Microsoft Online Services Customer Portal来管理订阅,可以登录Windows Azure Platform Management Portal来管理SQL Azure服务器。

    6. Microsoft Online Services Customer Portal会要求你输入支付和计费信息,请输入Payment Information 和 Billing Information 之后点击Next。

     

    7. 接下来请阅读微软在线订阅协议(Microsoft Online Subscription Agreement),点击复选框来确认接受条款,输入Full name和Title,之后点击I Accept。

    8. 接下来请复查并确认订单信息,确定之后,请点击Confirm Order。

    9. 在点击Confirm Order之后,会出现如下的Confirmation页面,点击Proceed to activation

    10. 接下来会出现Service Activation页面。在这里输入的订阅名会被用来标识订阅,也会被用来在Windows Azure Platform Management Portal中对SQL Azure服务器进行分组。请根据你的业务需要来唯一地命名每个订阅。作为账户管理员,你可以购买一个或多个订阅。但是Windows Azure Platform Introductory Special只能购买一次。输入订阅名后请点击Next。

    

    11. 之后Microsoft Online Services Customer Portal可以要求你输入详细的联系人信息。这个联系人是由账户所有者指定,负责建立和管理你的服务,被称为服务管理员。如果服务管理员和账户所有者是相同的,那么账户所有者也就是服务管理员。如果服务管理员和账户所有者不同,那么服务管理员可以访问Windows Azure Platform Management Portal来管理服务器,但没有权限通过Microsoft Online Services Customer Portal来管理订阅。

    一旦完成了激活,一封e-mail将会发送给账户所有者和服务管理员,概括了接下来的步骤。

    请在Service Activation输入信息再点击Next。

    

    12. 接下来是汇总页面,请复查下所有的信息再点击Finish。

    

    这时候一封确认邮件将会被发送到你的Windows Live ID账户。在Microsoft Online Services Customer Portal中的Subscriptions标签下面,你可以查看订阅的状态。

    

    在购买了Windows Azure 平台订阅之后,你会收到一封有关如何激活账户的邮件。在确认邮件中,点击Microsoft SQL Azure然后用Windows Live ID的用户名和密码来登录。

    

  • SQL Azure数据及架构迁移概述

     译自:http://social.technet.microsoft.com/wiki/contents/articles//overview-of-options-for-migrating-data-and-schema-to-sql-azure.aspx

    

    摘要

    这篇文章介绍了几种迁移数据(包括架构信息)到SQL Azure的方法并主要关注与从SQL ServerSQL Azure的数据迁移。如果想要从Microsoft Access, MySQL等非SQL Server数据库迁移数据到SQL Azure,请使用SQL Server Migration Assistant

    先决条件

    SQL Azure是基于SQL Server 2008的。如果是一个先前版本的数据库,你需要升级到SQL Server 2008以进行测试(至少在开发环境中),之后再迁移到SQL Azure上面。

    请注意SQL Azure目前不支持下面的这些特性:

    • Full Text Search
    • SQL Server Agent

    本文内容

    • Data-tier Application的导入导出服务
    • Generate Script Wizard
    • SQL Server Integration Services (SSIS)
    • SQL Azure Migration Wizard
    • SQL Server Migration Assistant

    Data-tier Application的导入导出服务

    Microsoft SQL Server “Denali” Data-tier Application Framework v2.0 Feature Pack CTP 中引入的导入导出服务允许在SQL Azure上部署和抽取数据和架构。这使得你可以在一个操作中保存和接收一个完整的数据库,并且在不同版本的SQL Server中迁移数据。

    注意:当前,使用Data-tier Application (DAC) framework来对SQL Azure导入导出数据只在SQL Azure labs中可用。

    更多信息,请查看:Data-Tier Application Import and Export with SQL Azure

    Generate Script Wizard

    迁移本地部署的SQL ServerSQL Azure的一个选择是使用SQL Server Management Studio的中的脚本生成向导 一个通过T-SQL语句产生的bcp命令脚本。本文将告诉你如何做到这些。

    生成架构

    把一个本地部署的SQL Server数据库迁移到SQL Azure的第一步是生成架构脚本,它被用来在SQL Azure上面建立与SQL Server数据库一致的架构。SQL Server Management Studio 2008 R2新增加了一个高级设置可将SQL Azure设置为目的数据库引擎,它可以被用来轻松的实现生成架构。

    下面是具体步骤:

    1.       打开SQL Server Management Studio 2008 R2

    2.       连接到包含你想要迁移的数据库的SQL Server

    3.       右键单击数据库,选择Tasks… | Generate Scripts… 

      

    4.       这将启动Generate and Publish Wizard对话框。点击Next来跳过介绍页面。

    5.       接下来是Choose Object

     

    6.       选择 Script entire database and all database objects 然后点击 Next

    7.       接下是Set Scripting Options

     

    8.       选择  Save to new query window, 然后点击 Advanced 按钮来弹出 Advanced Scripting Option对话框

     

    9.       Script for the database engine type下拉框中选择SQL Azure Database

    10.   点击Next

    11.   点击Next来跳过摘要页

    12.   Generate and Publish Scripts对话框完成对数据库的查询后,你可以点击Finish按钮,之后查询窗口将会弹出

    13.   这个新的查询窗口会自动的连接到源数据库所在的SQL Server

    14.   在查询窗口内右击,在菜单中选择Connection | Change Connection… 

     

    15.   连接到目的数据库所在的SQL Azure服务器,你可以点击Options按钮来选择目的数据库 

     

    16.   SQL Server Management Studio中执行生成的脚本来在SQL Azure上创建数据库架构

    为了使用 SSIS BCP 将你的 SQL Server 数据传送到SQL Azure, SQL Azure上的数据库架构需要包括聚集索引。上传数据的另一种选择是更改Generate and Publish Scripts页面上的设置来包括数据生成(INSERT语句)。这会增加脚本文件的体积,所以只适用于小数据库。

    传输数据

    如果你从SQL ServerSQL Azure迁移数据表,最简单的办法是使用bcp工具来将你SQL server中的数据导入到一个文件中,然后将数据从文件移动到 SQL Azure。但是手工来写出所有的bcp工具命令是枯燥乏味的。bcp需要你为每个表执行一个单独的命令来迁移数据。下面的T-SQL脚本会生成一个批处理文件,它包括了所有迁移整个数据库所需的bcp命令。

    在运行这个脚本之前:

    • ·         目的SQL Azure数据库中的表应为空,这意味着你不应该在同一个目的数据库上运行bcp批处理文件两次。
    • ·         在执行脚本之前,你需要修改脚本开始部分的变量为你实际的源SQL Server和目的SQL Azure服务器。

    这个T-SQL脚本将会使用PRINT语句来输出生成的批处理命令,在执行后,将完整的输出拷贝到一个以.bat为扩展名的文件中。一旦你得到了这个批处理文件,你就可以使用命令行运行这个批处理文件来迁移数据库。

    保留主键

    在你的数据库中,如果你使用IDENTITY来生成主键值,生成的bcp工具命令会使用 –E 标记来保留这些主键值。但是,外键值在被插入的时候,引用完整性检查将不会被执行。这使得可以数据行插入可以无需考虑依赖关系 -主键值无需在外键值之前插入。

    因为没有被重新生成主键值,所以只要源数据库在批处理文件运行的期间没有被写入,那么就不会违反约束。你需要保证源数据库处于只读模式或者没有应用程序在向它写入数据,

    因为bcp工具的命令没有被封装在一个大事务中,而且批处理文件执行的时间可能会很长,这时可能会产生数据写入操作。

    T-SQL脚本

    SET NOCOUNT ON

     

    DECLARE @DestServer nvarchar(max)

    DECLARE @DestDatabase nvarchar(max)

    DECLARE @DestLogin nvarchar(max)

    DECLARE @DestPassword nvarchar(max)

     

    DECLARE @SrcServer nvarchar(max)

    DECLARE @SrcDatabase nvarchar(max)

    DECLARE @SrcLogin nvarchar(max)

    DECLARE @SrcPassword nvarchar(max)

     

    -- SQL Azure Server

    SET        @DestServer = 'yourServer.database.windows.net'

    SET        @DestDatabase = 'yourDatabase'

    SET        @DestLogin = 'yourLogin@yourServer'

    SET        @DestPassword = 'yourPassword'

     

    -- SQL Server

    SET        @SrcServer = 'yourServer'

    SET        @SrcDatabase = 'yourDatabase'

    SET        @SrcLogin = 'yourLogin'

    SET        @SrcPassword = 'yourPassword'

     

    PRINT 'echo %DATE% %TIME% > bcp.log'

    PRINT ''

     

    ---------------------------------------------------

     

    DECLARE @Schema nvarchar(max)

    DECLARE @Table nvarchar(max)

     

    DECLARE table_cursor CURSOR FOR

        SELECT TABLE_SCHEMA, TABLE_NAME

        FROM information_schema.tables

        WHERE Table_Type = 'BASE TABLE'

        OPEN table_cursor;

     

    -- Perform the first fetch.

    FETCH NEXT FROM table_cursor INTO @Schema, @Table;

     

    -- Check @@FETCH_STATUS to see if there are any

    -- more rows to fetch.

    WHILE @@FETCH_STATUS = 0

    BEGIN

     

        PRINT 'REM Download ' + @Schema + '.' + @Table

        PRINT 'echo bcp.exe ' + @SrcDatabase + '.' + @Schema + '.' +

            @Table + ' out ' +

            @Schema + '.' + @Table + '.bcp -q -h "TABLOCK" -N -CRAW -S' +

            @SrcServer + ' >> bcp.log'

        PRINT 'bcp.exe ' + @SrcDatabase + '.' + @Schema + '.' + @Table +

            ' out ' + @Schema + '.' + @Table +

            '.bcp -q -h "TABLOCK" -N -CRAW -S' + @SrcServer +

            ' -U' + @SrcLogin + ' -P' + @SrcPassword + ' >> bcp.log'

        PRINT ''

     

        PRINT 'REM Upload ' + @Schema + '.' + @Table

        PRINT 'echo bcp.exe ' + @DestDatabase + '.' + @Schema + '.' +

            @Table + ' in ' + @Schema + '.' + @Table +

            '.bcp -q -h "TABLOCK" -N -E -CRAW -S' + @DestServer +

            ' >> bcp.log'

        PRINT 'bcp.exe ' + @DestDatabase + '.' + @Schema + '.' +

             @Table + ' in ' + @Schema + '.' + @Table +

             '.bcp -q -h "TABLOCK" -N -E -CRAW -S' + @DestServer +

             ' -U' + @DestLogin + ' -P' + @DestPassword + ' >> bcp.log'

        PRINT ''

       

       -- This is executed as long as the previous fetch succeeds.

       FETCH NEXT FROM table_cursor  INTO @Schema, @Table;

    END

     

    CLOSE table_cursor;

    DEALLOCATE table_cursor;

    SQL Service Integration Services

    你可以使用SQL Server 2008 Integration Services来将本地部署的数据库迁移到SQL Azure上。详细信息请查看:如何运行 SQL Server 导入和导出向导。如果你决定使用SQL Server 2008 Integration Services,你将需要建立自己的数据库关系图来正确的迁移主外键值。

    SQL Azure Migration Wizard

    SQL Azure Migration Wizard可以帮助你将本地的SQL Server 2005/2008数据库迁移到SQL Azure上。它包括两部分:

    • ·         通过使用SQL Azure Migration Wizard, 你可以选择你想迁移的数据库对象,创建迁移数据到SQL  AzureT-SQL脚本。 SQL Azure Migration Wizard并没捕捉到所有的SQL Server版本间的兼容性问题。
    • ·         SQL Azure Migration Wizard Batch是一个命令行工具,它被用来在目标服务器上运行T-SQL脚本文件(使用bcp来上传数据)。T-SQL脚本文件和bcp文件是由SQL Azure Migration Wizard来生成的。

    注意:SQL Azure Migration Wizard是一个开源的工具。

    SQL Server Migration Assistant

    如果你要从MySQL或者Microsoft Access迁移到SQL Azure, 毫无疑问你应该使用SQL Server Migration Assistant

    SSMA for MySQL 1.0 SSMA for Access v4.2 可以直接轻松的将数据从本地的MySQLAccess数据库中迁移到SQL Azure上。SQL Server Migration Assistant工具包旨在解决迁移数据库时客户复杂的手工处理过程。通过使用SQL Server Migration Assistant,客户和合作伙伴减少了手工劳动,因此显著减少了迁移的时间、 成本和风险。