创建备份迁移任务
当用户的数据库的IP地址不能暴露在公网上,但是选择专线网络进行数据库迁移,又担心成本过高的时,可以选择DRS提供的备份迁移功能将SQL Server备份文件恢复到目标数据库。备份迁移可以帮助您在云服务不触碰源数据库的情况下,实现数据迁移。
操作视频
操作流程
操作步骤 |
说明 |
---|---|
注册华为账号并开通华为云,实名认证,准备待恢复的数据文件、目标数据库等。 |
|
创建备份迁移任务,将备份文件数据恢复到目标数据库。 |
|
备份文件里仅保存数据库级信息,在SQL Server实例中还有一些配置需要主动识别并手工完成迁移,如login,权限,DBlink,job等,如果源数据库包含这部分配置,需要进行迁移补充工作。 |
准备华为账号,创建用户并赋权使用DRS。
- 打开华为云网站。
- 单击“注册”,根据提示信息完成注册。
- 勾选服务条款, 单击“开通”。
系统提示开通成功。
- 实名认证,请参考:
- 注册华为云账号后,如果需要对华为云上的资源进行精细管理,请使用统一身份认证服务(Identity and Access Management,简称IAM)创建IAM用户及用户组,并授权,以使得IAM用户获得具体的操作权限,更多操作,请参见创建用户组、用户并授予DRS权限。
创建备份迁移任务
- 进入创建DRS迁移任务页面。
- 在“选定备份”页面填写任务信息。
图1 基本信息
参数
示例
参数说明
区域
华北-北京四
当前所在的区域。
项目
华北-北京四
当前区域下可以选择的项目。
任务名称
DRS-BackupMigration
迁移任务的名称。
描述
暂不填写
任务描述。
- 填选备份文件信息,单击“下一步”。
图2 备份文件信息
参数
示例
参数说明
数据库类型
Microsoft SQL Server
默认为Microsoft SQL Server。
备份文件来源
RDS全量备份
选择备份文件的来源,支持OBS自建桶和RDS全量备份。
企业项目
default
对于已成功关联企业项目的用户,仅需在“企业项目”下拉框中选择目标项目。
更多关于企业项目的信息,请参见《企业管理用户指南》。
标签
暂不添加
对DRS任务的标识。使用标签可方便管理您的任务。
备份文件
backup-e48a-restore
选择需要恢复的备份文件,备份文件准备中的全量备份文件。
- 在“选定目标”页面,填选数据库信息,单击“下一步”。
- 目标RDS实例名称:选择目标数据库准备中创建的 RDS for SQL Server实例
- 待还原数据库名称:全部
- 在“信息确认”页面核对配置详情后,勾选协议,单击“下一步”。
SQL Server自身的工作原理是备份文件恢复到新的数据库后,非聚集索引表的索引信息将会失效需要立即重建。如果源数据库里存在大量非聚集索引表,备份迁移后请在目标库进行索引重建,以避免数据库未来使用中性能出现重大下降。
- 在“备份迁移管理”页面任务列表中,观察对应的恢复任务的状态为“恢复中”,恢复成功后,任务状态显示“成功”。
手动配置Login账号、DBlink连接、Agent JOB等信息
备份文件里仅保存数据库级信息,在SQL Server实例中还有一些配置需要主动识别并手工完成迁移,如Login账号、DBlink连接、Agent JOB、关键配置项,如果源数据库包含这部分配置,需要按照以下内容进行迁移补充工作。
Login账号即SQL Server的实例级账号,主要用于用户管理用户服务器权限与数据库权限。一个用户通常会有多个该类型账号,用户迁移到RDS for SQL Server实例后,需要手动将自己本地的Login账号同步在实例上进行创建,以下方法将介绍如何在本云RDS for SQL Server实例上创建同名,同密码的Login账号,并进行授权操作。
- 登录源数据库实例。
- 执行以下SQL,获取本地实例Login账号的创建脚本。
SELECT 'IF (SUSER_ID('+QUOTENAME(SP.name,'''')+') IS NULL) BEGIN CREATE LOGIN ' +QUOTENAME(SP.name)+ CASE WHEN SP.type_desc = 'SQL_LOGIN' THEN ' WITH PASSWORD = ' +CONVERT(NVARCHAR(MAX),SL.password_hash,1)+ ' HASHED,SID=' +CONVERT(NVARCHAR(MAX),SP.SID,1)+',CHECK_EXPIRATION = ' + CASE WHEN SL.is_expiration_checked = 1 THEN 'ON' ELSE 'OFF' END +', CHECK_POLICY = ' +CASE WHEN SL.is_policy_checked = 1 THEN 'ON,' ELSE 'OFF,' END ELSE ' FROM WINDOWS WITH' END +' DEFAULT_DATABASE=[' +SP.default_database_name+ '], DEFAULT_LANGUAGE=[' +SP.default_language_name+ '] END;' as CreateLogin FROM sys.server_principals AS SP LEFT JOIN sys.sql_logins AS SL ON SP.principal_id = SL.principal_id WHERE SP.type ='S' AND SP.name NOT LIKE '##%##' AND SP.name NOT LIKE 'NT AUTHORITY%' AND SP.name NOT LIKE 'NT SERVICE%' AND SP.name NOT IN ('rdsadmin','rdsbackup','rdsuser','rdsmirror','public')
获取的执行脚本如下:图3 获取执行脚本
- 参考通过DAS连接RDS for SQL Server实例,连接目标数据库。
- 复制2中获取到的执行脚本,目标端直接执行。
创建出来和源数据库中密码一致的Login账号。
- 在目标数据库执行以下脚本,将新建的Login账号和用户迁移过来的数据库用户权限进行映射(mapping),以保证该账号在当前实例上的权限一致性。
declare @DBName nvarchar(200) declare @Login_name nvarchar(200) declare @SQL nvarchar(MAX) set @Login_name = 'TestLogin7' //输入Login名称逐个执行 declare DBName_Cursor cursor for select quotename(name)from sys.databases where database_id > 4 and state = 0 and name not like '%$%' and name <> 'rdsadmin' open DBName_Cursor fetch next from DBName_Cursor into @DBName WHILE @@FETCH_STATUS= 0 begin SET @SQL=' USE '+ (@DBName)+ ' if exists(select top 1 1 from sys.sysusers where name = '''+ @Login_name +''') begin ALTER USER '+@Login_name+' with login = '+@Login_name+'; end ' print @SQL EXEC (@SQL) fetch next from DBName_Cursor into @DBName end close DBName_Cursor deallocate DBName_Cursor
以上脚本执行完成后,用户即可在自己的新实例上看到同名的登录账号,并且密码跟权限是完全跟本地一致的。
DBLink连接指SQL Server支持用户通过创建DBLink连接的方式,跟外部实例上的数据库进行交互,这种方式可以极大的方便用户不同实例间,不同数据库类型之间的数据库查询、同步、比较,所以大部分用户都会在本地实例上用到该服务,但是迁移上云后,本地DBLink是不会自动同步到云上实例的,还需要简单的手动进行同步。
- 通过微软提供的官方Microsoft SQL Server Management Studio客户端工具连接本地实例。
- 单击
,找到当前实例的DBLink链接。图4 查看DBLink链接
- 选中链接服务器,右键单击
。在弹出的对象资源管理信息页新窗口中,可以看到当前实例上所有DBLink的创建脚本。图5 自动创建脚本
- 参考通过DAS连接RDS for SQL Server实例,连接目标数据库。
- 单击“SQL操作 > SQL查询”。
- 将3中获取的脚本复制到窗口中。
- 修改脚本中@rmtpassword对应的密码。
USE [master] GO /****** Object: LinkedServer [DRS_TEST_REMOTE] Script Date: 2019/5/25 17:51:50 ******/ EXEC master.dbo.sp_addlinkedserver @server = N'DRS_TEST_REMOTE', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'DESKTOP-B18JH5T\SQLSERVER2016EE' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'DRS_TEST_REMOTE',@useself=N'False',@locallogin=NULL,@rmtuser=N'sa',@rmtpassword='########' GO
以上脚本为范例,创建的脚本可能包含大量系统默认配置项,但是每个DBLink仅需保留以下两个关键脚本即可执行成功,同时需要注意重新输入账号连接密码。
- 单击“执行SQL”,在目标数据库执行修改后的脚本。
消息返回“执行成功”表示完成操作。
Agent JOB又名SQL Server代理服务,可以方便用户快速的在实例上创建定时任务,帮助用户进行日常运维和数据处理工作,用户在本地的JOB需要手动进行脚本迁移。
- 通过微软提供的官方Microsoft SQL Server Management Studio客户端工具连接本地实例。
- 单击
,找到当前实例上的所有JOB任务。图6 查看作业
- 选中JOB任务,右键单击
。在弹出的对象资源管理信息页新窗口中,可以看到所有JOB任务的创建脚本。图7 创建脚本
- 参考通过DAS连接RDS for SQL Server实例,连接目标数据库。
- 单击“SQL操作 > SQL查询”。
- 将3中获取的脚本复制到窗口中。
- 修改如下几个关键项,以保障你的创建成功。
- 注意修改每个JOB上的Ower账号:
@owner_login_name=N'rdsuser'
- 注意修改每个JOB上的实例名称:
@server=N'实例IP'
@server_name = N'实例IP'
新建JOB的Owner账号十分重要,在RDS SQL Server上,仅有该JOB的Owner可以看到实例上自己的JOB,别的Login账号是看不到无法操作的,所以建议所有的JOB Owner尽量是同一个账号方便管理。
- 注意修改每个JOB上的Ower账号:
- 单击“执行SQL”,在目标数据库执行修改后的脚本。
消息返回“执行成功”表示完成操作。
用户将数据库还原到RDS for SQL Server实例上之后,本地的一些重要配置项也需要进行同步确认,避免影响业务的正常使用。
- tempdb:临时数据库的文件配置需要进行同步。
推荐配置为8个临时文件,注意路径一定要确保在D:\RDSDBDATA\Temp\
通过在目标数据库端执行如下脚本添加临时数据库的文件配置:
USE [master] GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdb1', FILENAME = N'D:\RDSDBDATA\Temp\tempdb1.ndf' , SIZE = 65536KB , FILEGROWTH = 65536KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdb2', FILENAME = N'D:\RDSDBDATA\Temp\tempdb2.ndf' , SIZE = 65536KB , FILEGROWTH = 65536KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdb3', FILENAME = N'D:\RDSDBDATA\Temp\tempdb3.ndf' , SIZE = 65536KB , FILEGROWTH = 65536KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdb4', FILENAME = N'D:\RDSDBDATA\Temp\tempdb4.ndf' , SIZE = 65536KB , FILEGROWTH = 65536KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdb5', FILENAME = N'D:\RDSDBDATA\Temp\tempdb5.ndf' , SIZE = 65536KB , FILEGROWTH = 65536KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdb6', FILENAME = N'D:\RDSDBDATA\Temp\tempdb6.ndf' , SIZE = 65536KB , FILEGROWTH = 65536KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdb7', FILENAME = N'D:\RDSDBDATA\Temp\tempdb7.ndf' , SIZE = 65536KB , FILEGROWTH = 65536KB ) GO
图8 检查临时文件
- 数据库隔离级别:请确认原实例上数据库的隔离级别是否开启,并同步到RDS SQL Server实例,快照隔离参数有2个,分别是:
- 读提交快照(Is Read Committed Snapshot On)
- 允许快照隔离(Allow Snapshot Isolation)
若原实例上数据库的隔离级别是开启的,您可以通过在目标数据库端执行如下脚本开启数据库的隔离级别:
USE [DBName] GO ALTER DATABASE [DBName] SET READ_COMMITTED_SNAPSHOT ON WITH NO_WAIT GO ALTER DATABASE [DBName] SET ALLOW_SNAPSHOT_ISOLATION ON GO
- 实例最大并行度:实例最大并行度在RDS for SQL Server实例上默认设置为0,用户也可以根据自己本地原来的设置项进行同步设置,避免不同环境下业务场景出现异常。
右击本地实例选择属性,在服务器属性弹出框中选择高级,然后在右侧找到最大并行度(max degree of parallelism)设置项,确认本地实例设置值,并同步在目标RDS for SQL Server实例管理的参数组中进行修改。
图9 查看本地实例最大并行度值
登录本云实例控制台,在实例管理页,单击目标实例名称,进入基本信息页签,切换至“参数修改”,搜索最大并行度(max degree of parallelism)并进行修改。图10 修改目标RDS for SQL Server实例的最大并行度
- 迁移上云的数据库恢复模式是否为完整(FULL)模式,如果不是需要进行修改。
右击数据库选择属性,在弹出数据库属性框中选择选项,并在右侧确认该数据库恢复模式为完整(FULL),保证该数据库高可用和备份策略可执行。
图11 检查数据库恢复模式