将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 server迁移到Windows Azure上的SQL database

当然,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界面创建表就可以很快完成数据库的部署。但对于已有应用的迁移来说,如何进行迁移呢?

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

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

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

采用SQL server management studio进行同步

具体步骤如下:

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

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

其中,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 server迁移到Windows Azure上的SQL database

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

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

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

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

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

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

新建SQL database

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

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

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

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

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

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

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

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

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

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

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

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

回到上一页,查看数据库域名。

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

在本地打开SQL server management studio,输入域名,用户名和密码,即可连入SQL database

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

之后就可以在SQL database上执行SQL操作,将刚才导出的表和数据发布到Azure上.

采用SQL database migration wizard 进行同步

该工具是一个开源工具,可以从http://sqlazuremw.codeplex.com/下载,它把数据库的内容用BCP进行批量导出,再批量导入到Azure上,导入时可以不考虑键的约束,因此效率很高。

启动这个工具后,选择分析并迁移数据库。可见这个工具支持多种迁移方式。

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

然后按下一步选择源数据库,之后直接按下一步即可,十分简单。可见导出命令是BCP,效率很高

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

下面继续,选择目标数据库,然后执行

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

不过,这个工具有个不足,就是迁移时,必须同时访问源库和目标库,而不能实现:先把源库导出文件->文件上传至Azure->文件导入目标库。如果有这样的需求,只能导出源库后,手动执行BCP了


使用该工具可以自动为我们建立聚类索引。这样基本上我们不需要修改原有数据库的任何配置,就可以进行迁移了。

使用Visual studio连接SQL database

SQL server management studio连接SQL database的时候,无法以图形化的方式展示表内容,也无法进行表设计,只能执行SQL。替代方法是用Visual studio的SQL工具。

在Visual studio菜单的视图->SQL server 对象资源管理器

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

打开后添加SQL database,填入Azure上SQL database的数据库地址,用户信息

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

下面就可以打开图形化界面了

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

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

从SQL database迁移回SQL server

把数据库从Azure迁移回来的过程与原过程想法,之前的7个方法只有方法2不可用。剩下的方法里面,如果数据量较大,仍推荐方法5和6. 数据量小时,可用1和4。 其中使用1的原因是:SQL database的备份方式就是data tier application(备份到Blob里),且SQL server management studio 2012已经支持直接从Azure Storage导入数据库。

首先在Azure门户上export数据库为dacpac文件,存储在blob里

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

然后在客户端进行导入

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

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