日期:2014-05-16  浏览次数:20569 次

将SQL server迁移到Windows Azure上的SQL database

Windows Azure把SQL作为服务提供给了用户,这项服务名为SQL database。尽管SQL database的后台也是SQL server,但是它与SQL server还是有很多的不同,具体体现在:

  • 不需要安装:通过Azure的管理门户,一个按钮就可以创建一个数据库,花费时间不超过10秒钟
  • 不需要配置:SQL database对用户隐藏了配置细节,用户看不到数据库文件和日志的存储位置,也看不到后台操作系统和文件系统,管理员需要做的,除了备份基本上啥事也没有了。而传统的硬件调优,完全不需要做了。用户只需要进行SQL优化
  • 不需要HA:传统配置HA的方式是配置双机进行主备切换。在SQL database上,Azure后台已经自动为每个数据库配置了1主两备,任何一份数据都会同步写到3个不同的物理服务器上,确保了高可用。另外,当一台服务器宕机时,Azure会自动创建另一个备份节点,保证永远都有3份拷贝运行
  • 价格经济:传统数据库采用CPU数进行授权。SQL database采用容量计费,而且是实际存储容量。比如用户申请了150G的数据库,但是只存了1G的内容,那么只会收1G的费用。1GB存一个月的大概费用是10美元,10GB大概50美元,100GB 175美元。可见容量越大,单价越低
  • 管理方便:SQL database提供了一个基于浏览器的管理工具,这个工具上可以进行数据库建表、查询、SQL执行统计等常用的功能。管理员执行一些简单的任务时,不再需要安装客户端管理软件,比如management studio,或者visual studio

下面是SQL database的架构图. 可见,SQL database后台是一个庞大的SQL server集群,每个用户见到的SQL database实例,是一个逻辑的概念,对应于SQL server集群上的一组实例。前端的负载均衡器根据策略将用户请求分发到3个实例的主实例上。而用户看到的SQL Server,也是一个逻辑的概念,对应一组逻辑资源。在SQL database上,一个SQL Server可以支持150个实例,同一个SQL server使用相同的访问控制策略,提供同一个管理门户入口。另外,多个用户是共享物理资源和SQL server的

当然,SQL database也有一些局限:

  • 最大只能150GB。再大的话要进行数据库分片(federation),将一个数据库显式分解为多个数据库,或者租VM装数据库
  • 不支持Windows认证,必须用SQL认证
  • 不支持传统的备份、恢复,提供了新的备份方式
  • 不支持Analysis Services, Replication, and Service Broker
  • 不支持Resource Governor, file group references, and some physical server DDL statements
  • 不支持SQL Server 2008过期的数据类型,也就说,向前兼容到SQL Server 2008
  • 所有的表必须有聚类索引(clustered index)

可见,一般的SQL应用,使用SQL database显然是最方便、最经济的。对于新应用来说,直接在Azure上建立新的数据库,并用visual studio、sql server management studio或者Web界面创建表就可以很快完成数据库的部署。但对于已有应用的迁移来说,如何进行迁移呢?

 

实际上,迁移的方法有很多种:

 

上面列出了7种方法,其中,方法1-4都是通过SQL server management studio完成的。这些方法执行效率较低,但过程很简单,适合于数据库规模较小的时候。而5和6采用BCP进行批处理,效率较高,适合于数据量较大的情况。其中方法6采用图形化界面,使用更方便。方法7可以实现本地数据库和远程数据库的连续同步,适合于多个数据库同时运行的情况,或者是需要数据库停机不停机的情况

 

采用SQL server management studio进行同步

具体步骤如下:

在sql server management studio中,右键要迁移的数据库,在task选项中可以看到很多项

 

其中,generate script会导出SQL,对应第4种方法。Deploy database to SQL azure对应第2种方法,export data-tier application 对应第1种方法,export data对应第3种方法。在很多情况下,方法1、2、3在导出或者导入的过程中发生错误的概率较大,导致迁移无法顺利进行,这主要是因为SQL database的某些限制,如用户、数据类型、索引等。因此,推荐用第4种方法进行迁移。这种方法直接使用SQL,即使有问题也可以及时编辑SQL进行调整。

 

导出建表SQL

在高级选项里面,把script for database engine type选成SQL Azure database

 

使用SQL语句进行迁移时,建议分为两个阶段,分别迁移schema和数据内容。在types of data to script里面,第一次选schema only. 导出后再次运行导出动作,选data only. 这样可以生成2个脚本,分别是建表和填充数据

 

在script indexes里面选true,表示要导出index。如果本地数据库有的表没有建聚类索引,那么需要在导出的SQL里面手动添加建聚类索引的语句。或者导出完成后对于SQL database的表建立聚类索引

另外,将Convert UDDTs to Base Types 设为true

 

新建SQL database

导出完成后,就可以将其导入Azure上的SQL database了。首先在Azure上创建database

在Limit database size部分需要注意,这里指定的是数据库容量的上限,如果要导入的数据库较大,则这个地方需要选的数值也要大。在Edition部分是数据库版本,Web版的容量上限是5GB,如果更大则要选Business

输入用户密码,选择区域为东亚

创建完成后,点击左边菜单的SQL database,在右侧找到创建的示例,然后点击进入

在dashboard的右侧点击manage allowed IP address,设置允许访问的客户端IP

点击add to allowed ip address,然后点击页面底部的Save