迁移 SQL Server 到 Azure SQL 实战
最近有个维护的项目需要把 SQL Server 2012 的数据库迁移到 Azure SQL 上去。主要是因为租用的主机到期,而运营商停止了主机租赁业务,看来向云端的迁移是大势所趋啊!经过一番折腾最终成功迁移,但过程可谓是一波三折。故在此分享这次迁移中碰到的点点滴滴,希望对朋友们有所帮助。
Azure SQL 的版本
Azure SQL Database 是微软提供的 SQL 服务(PaaS)。最新的版本叫 Azure SQL Database V12,其实微软还是通过 SQL Server 2014 提供的数据库服务:
上图中第一个数据库服务器是本地安装的 SQL Server 2014,第二个和第三个则是云上的 Azure SQL Database。可以很清楚的看到,它们的版本是一样的。
但是可不要以为 Azure SQL Database 提供的数据库和本地安装版本是一样的噢。它们还是有不少差别的,这一点在迁移现有数据库时尤为重要。
由于提供的是在线的服务,所以 Azure SQL Database 可以快速的发布新特性,这些从不断更新的 MSDN 文档可见一斑。MS 也强烈建议我们在和 Azure SQL Database 打交道时一定要用最新版的工具。笔者在刚开始使用了 SQL Server 2014 中的 SSMS (SQL Server Management Studio) ,结果连接 Azure SQL 后发现显示的信息和 Azure portal 对不上,安装最新版的 SSMS 后问题消失。
下面进入正题,让我们把一个8G大小的陈年老库一步步的迁移到云上。看这过程中都需要什么样的工具,如何操作以及需要注意的事项。在此特别强调,旧数据库一般都是处于正在使用的状态,所以千万不要在真实的库上做各种实验。笔者所有的前期实验都是在通过恢复备份文件创建的测试库上完成的。
迁移要点分析
在云端创建Azure SQL Server
Azure SQL Database 是运行在 Azure SQL Server 中的,所以我们要在 Azure 上先把 Azure SQL Server 创建好。操作比较简单,直接在 Azure 上添加 SQL Server (logical server) 就可以了,请注意选择合适的区域(主要影响访问速度)。
允许从本地访问 Azure SQL Server
Azure SQL Server 创建好以后,我们通过 SSMS 测试一下能不能连上。当我们输入了正确的地址和用户信息后却弹出了一个提示框:
它提示我们当前的 IP 不能访问 Azure上的数据库服务器,并且让我以 Azure 账号登录并创建一条防火墙规则。
其实这是 Azure 提供的一个安全措施,它让你显式的指定都哪些IP地址或者IP网段可以访问 Azure SQL Server。此时我们有两种做法。
- 点击对话框中的 "Sign in",用Azure账户登录。然后点击 "OK",此时已经完成了防火墙规则的设置,SSMS 已登录 Azure SQL Server。这种方法一般用于开发和测试,只能添加当前客户端所使用的 IP。
- 更加通用的方法是登录 Azure portal,进入 Azure SQL Server 的配置界面,为防火墙添加规则。同样的,可以添加单个 IP 也可以一次添加一个网段:
兼容性处理
由于 MS SQL Server 版本众多,且云上的版本与本地版本也有差异。所以能不能迁移成功主要看能不能找到并解决数据库之间的兼容性问题。
下面将详细的介绍笔者碰到的兼容性问题。
兼容性处理详情
数据库中设置的用户不存在
兼容性检查的报告显示下面的信息:
Error SQL71564: Error validating element [xxxx]: The element [xxxx] has been orphaned from its login and cannot be deployed.
其中的 xxxx 是数据库中设置的用户名。
这个错误的原因是用户被定义在本地的 SQL Server 中,数据库中只有使用用户的信息,把数据库迁移到云上后,就找不到对应用户的定义了。所以需要移除本地用户的信息。不用担心数据库的访问问题,因为完成迁移后你可以使用刚才创建的 Azure SQL Server 账号访问数据库。当然你还可以为一个数据库创建独立的访问账号,具体操作请参考 MSDN。
不支持Extended Property
兼容性检查的报告显示下面的信息:
One or more unsupported elements were found in the schema used as part of a data package.
Error SQL71564: The element Extended Property: [dbo].[xxxx].[MS_Description] is not supported when used as part of a data package (.bacpac file).
其中的 xxxx 是数据库中一张表的名称。
这下可要了命了,不支持 Extended Property!在笔者的数据库中有好几处都用到了这个特性。怎么办?只好一遍又一遍的查看程序。最后发现程序中没有使用这个特性,好像当时只是有人用它做了一些说明。最终的结论是可以移除。
创建 clustered index
兼容性检查的报告显示下面的信息:
One or more unsupported elements were found in the schema used as part of a data package.
Error SQL71564: Table Table: [dbo].[xxxx] does not have a clustered index.
Clustered indexes are required for inserting data in this version of SQL Server.
其中的 xxxx 是数据库中一张表的名称。
需要给表创建 clustered index,看似不是一件小事情。因为任何对表的修改都可能会影响到程序逻辑,怎么办呢?网上的朋友们早就有了比较靠谱的解决方案,就是给表添加一列用来做 clustered index,这样原来表中的列就没有发生变化:
ALTER TABLE [xxxx] ADD
RowId int NOT NULL IDENTITY (1, 1) PRIMARY KEY CLUSTERED
GO
其他
还有一些点,主要是和业务相关的,就不在此赘述。个人感觉绝大多数的问题在网上都有不同的解决方案,关键是要采用自己的业务能够接受的方式去解决问题。
接下来把所有对数据库的变更写成一个脚本文件。在正式的迁移中,直接在正式库上执行脚本文件。
迁移过程
MS 提供了不同的工具进行兼容性检查、迁移等工作。我们这里统统使用 SSMS (SQL Server Management Studio) 。下面看看具体的操作步骤。
在 SSMS 中右键需要迁移的数据库,选择 Tasks 中的"Deploy Database to Microsoft Azure SQL Database…"。
在打开的向导中点击 "next" 进入"Deployment Settings"界面。
首先需要设置 Azure SQL Server 的连接地址和连接账号:
接下来设置迁移后的数据库名称和资源配置:
注意 Azure SQL Database settings,MS 把数据库使用的资源划分成了三个不同的类别:Basic, Standard, Premium。每个类别中又划分了不同的收费标准,简单说就是你要使用更多更好的资源就要掏更多的钱。当然也可以反过来说,如果我用的资源不多花一点点钱就够了!
我们发现上图中的最后一行要求我们为 *.bacpac 文件指定一个存储路径。*.bacpac 文件是迁移过程中生成的中间文件,当兼容性检查通过后,就把数据库中的所有内容都导出到这个文件中。从这个信息我们可以得知,无论采用何种迁移方式,其核心操作都是两步:先从本地数据库生成 *.bacpac 文件,再从*.bacpac 文件恢复一个Azure SQL Database。
单击 "Next" 显示配置的详情,再下一步就开始兼容性检查。如果没有兼容性问题,就执行迁移操作。
我的数据库存在一些兼容性问题,所以显示了错误报告并终止了迁移操作:
点击 "Result" 列中的链接就能看到详细的报告,前面已经介绍过兼容性问题,直接执行我们处理兼容性问题的脚本文件,然后再试一次!
这次的执行已经没有错误提示了,其实后台已经开始了迁移过程。比较不爽的是这个过程没有详细的进度提示,只能黑等。我的经验数据是8G的库完成迁移大概是 8-12小时。当然这和你连接 Azure 的带宽有很大的关系…
总结
由于整个迁移过程涉及的方方面面实在太多,本文只是概要式的介绍笔者认为迁移过程中的要点和自己碰到的问题。总的感觉是 MS 提供的工具还算比较完善,网络上的各种已知问题解决方案也很详尽。所以尽管笔者碰到了很多的问题,但没有卡壳的地方,总算磕磕绊绊的完成了数据库迁移的任务。
迁移 SQL Server 到 Azure SQL 实战的更多相关文章
- 如何將 MySQL 資料庫轉移到 Microsoft SQL Server 與 Azure SQL Database
MySQL 是相當常用之資料庫伺服器,而微軟雲端服務 Microsoft Azure 上 Azure SQL Database 是一個功能強大且經濟實惠的選擇,透過本篇文章,使用 SQL Server ...
- [SQL in Azure] High Availability and Disaster Recovery for SQL Server in Azure Virtual Machines
http://msdn.microsoft.com/en-us/library/azure/jj870962.aspx Microsoft Azure virtual machines (VMs) w ...
- [SQL in Azure] Getting Started with SQL Server in Azure Virtual Machines
This topic provides guidelines on how to sign up for SQL Server on a Azure virtual machine and how t ...
- SQL索引管理器 - 用于SQL Server和Azure上的索引维护的免费GUI工具
我作为SQL Server DBA工作了8年多,管理和优化服务器的性能.在我的空闲时间,我想为宇宙和我的同事做一些有用的事情.这就是我们最终为SQL Server和Azure 提供免费索引维护工具的方 ...
- SQL SERVER如何通过SQL语句获服务器硬件和系统信息
在SQL SERVER中如何通过SQL语句获取服务器硬件和系统信息呢?下面介绍一下如何通过SQL语句获取处理器(CPU).内存(Memory).磁盘(Disk)以及操作系统相关信息.如有不足和遗漏,敬 ...
- Comparison of SQL Server Compact, SQLite, SQL Server Express and LocalDB
Information about LocalDB comes from here and SQL Server 2014 Books Online. LocalDB is the full SQL ...
- SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace)
SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace) DBA 日常管理工作中,很重要一项工作就是监视数据库文件大小,及日志文件大小.如果你管理数据库的有很 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)
为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)
计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...
随机推荐
- 双系统删除Ubuntu后出现grub界面而无法正常启动Windows系统的解决方法
第一次安装双系统的时候由于不怎么会弄,设置了ubuntu引导windows,这种方法是非常不推荐的,因为当ubuntu出现问题或者是当你不再使用ubuntu的时候,删除ubuntu就会成为一个很麻烦的 ...
- 一种抛弃GPS的中近距离高精度无线同步新方案
目前,对于需要做同步数据采集的项目,大家不约而同的选用GPS作同步源,用GPS的秒脉冲作同步基准.对于是1000米内的多采集点的应用来说,这是一种浪费. 目前福州慧聚通信技术有限公司推出一款无线同步数 ...
- LBPL--基于Asp.net、 quartz.net 快速开发定时服务的插件化项目
LBPL 这一个基于Asp.net. quartz.net 快速开发定时服务的插件化项目 由于在实际项目开发中需要做定时服务的操作,大体上可以理解为:需要动态化监控定时任务的调度系统. 为了实现快速开 ...
- php从气象局获取天气预报并保存到服务器
思路:1.打开网页时读取中国气象网的接口得到每个城市的该日json:2.解析并保存到mysql:3.客户端访问mysql得到数据集. 所包含的技巧: 进度条.flush()问题.mysql.xml.p ...
- [LeetCode] Range Sum Query - Mutable 题解
题目 题目 思路 一看就是单点更新和区间求和,故用线段树做. 一开始没搞清楚,题目给定的i是从0开始还是从1开始,还以为是从1开始,导致后面把下标都改掉了,还有用区间更新的代码去实现单点更新,虽然两者 ...
- Android Things教程:电气基础之直流电路理论
译者注:由于本人水平有限,译文中难免会出现概念模糊.晦涩难懂,如果实在没心思看下去,请发挥你的学习能动性,到原文中自行翻译,感谢!!!点这里,直达英文各种长句的世界. 好了,既然你选择继续往下看,那就 ...
- 在Windows的DOS中运行java编程中的问题
1.苦恼着我的就是找不到或无法加载主类!
- oracle学习 笔记(1)
题记:之前用的是SQL server数据库,现因需求使用Oracle数据库,写此博客来记录学习: 一.表空间管理.用户管理.给用户授权 1.在Oracle中每创建数据库会在系统服务中多一个数据库实例, ...
- CentOS6.5下安装oracle11gR2
安装前须知 内存(RAM)的最小要求是 1GB,建议 2GB 及以上. 虚拟内存 swap 建议:内存为 1GB~2GB 时建议swap大小为内存大小的 1.5 倍:内存为 2GB~16GB 时建议s ...
- UNION ALL合表查询
有时候需要连表查询数据,可以使用union all来做合表. 语法: SELECT column_name FROM table1UNION ALLSELECT column_name FROM ta ...