操作場景
目前從本地或虛擬機通過DRS備份遷移功能直接遷移到本云RDS for SQL Server實例上,在遷移完成后還需要針對Login賬號,DBLink,AgentJOB,關鍵配置進行識別,并手動完成相關同步工作。
Login賬號
Login賬號即SQL Server的實例級賬號,主要用于用戶管理用戶服務器權限與數據庫權限。一個用戶通常會有多個該類型賬號,用戶遷移到RDS for SQL Server實例后,需要手動將自己本地的Login賬號同步在實例上進行創建,以下方法將介紹如何在本云RDS for SQL Server實例上創建同名,同密碼的Login賬號,并進行授權操作。
1.通過以下腳本獲取本地實例Login賬號創建腳本,獲取到的腳本可以直接在目標端上執行,以創建同名,同密碼的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')
2.執行1腳本可獲取如下執行腳本。
圖1 獲取執行腳本
3.復制2中的執行腳本在目標端直接執行,創建出來的Login賬號跟原實例密碼一致。
4.將新建的Login賬號跟用戶當前RDS SQL Server實例上的遷移過來的數據庫用戶權限進行映射(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連接
DBLink連接指SQL Server支持用戶通過創建DBLink連接的方式,跟外部實例上的數據庫進行交互,這種方式可以極大的方便用戶不同實例間,不同數據庫類型之間的數據庫查詢,同步,比較,所以大部分用戶都會在本地實例上用到該服務,但是遷移上云后,本地DBLink是不會自動同步到云上實例的,還需要簡單的手動進行同步。
1.通過微軟提供的官方Microsoft SQL Server Management Studio客戶端工具連接本地實例與云上實例,同時在“服務器對象 > 鏈接服務器”下找到當前實例的DBLink鏈接。
圖2 查看DBLink鏈接
2.選中鏈接服務器,然后按F7,會自動彈出對象資源管理信息頁,在該頁面中可以方便你快速的自動創建腳本。
圖 自動創建腳本
3.在新窗口中,可以看到當前實例上所有DBLink的創建腳本,僅需復制該腳本到目標實例上,并修改@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僅需保留以下兩個關鍵腳本即可執行成功,同時需要注意重新輸入賬號連接密碼。
Agent JOB
Agent JOB又名SQL Server代理服務,可以方便用戶快速的在實例上創建定時任務,幫助用戶進行日常運維和數據處理工作,用戶在本地的JOB需要手動進行腳本遷移。
1.通過微軟提供的官方Microsoft SQL Server Management Studio客戶端工具連接本地實例與云上實例,同時在“SQL Server代理 > 作業”下找到當前實例上的所有JOB任務。
圖 查看作業
2.選擇SQL Server代理下的作業,然后按F7,可以在對象資源管理器中看到所有的作業(JOB),全部選中后創建腳本到新窗口。
圖 創建腳本
3.復制新窗口中的T-SQL創建腳本到新實例上,然后注意修改如下幾個關鍵項,以保障你的創建成功。
注意修改每個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盡量是同一個賬號方便管理。
關鍵配置
用戶將數據庫還原到RDS for SQL Server實例上之后,本地的一些重要配置項也需要進行同步確認,避免影響業務的正常使用。
1.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
圖 檢查臨時文件
2.數據庫隔離級別:請確認原實例上數據庫的隔離級別是否開啟,并同步到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
3.實例最大并行度:實例最大并行度在RDS for SQL Server實例上默認設置為0,用戶也可以根據自己本地原來的設置項進行同步設置,避免不同環境下業務場景出現異常。
右擊本地實例選擇屬性,在服務器屬性彈出框中選擇高級,然后在右側找到最大并行度(max degree of parallelism)設置項,確認本地實例設置值,并同步在目標RDS for SQL Server實例管理的參數組中進行修改。
圖 查看本地實例最大并行度值
登錄本云實例控制臺,在實例管理頁,單擊目標實例名稱,進入基本信息頁簽,切換至“參數修改”,搜索最大并行度(max degree of parallelism)并進行修改。
圖8 修改目標RDS for SQL Server實例的最大并行度
4.遷移上云的數據庫恢復模式是否為完整(FULL)模式,如果不是需要進行修改。
右擊數據庫選擇屬性,在彈出數據庫屬性框中選擇選項,并在右側確認該數據庫恢復模式為完整(FULL),保證該數據庫高可用和備份策略可執行。
圖 檢查數據庫恢復模式
5.由于備份信息里記錄的是源數據庫的統計信息,這些信息過舊且會影響SQL性能,遷移結束后建議啟動一次全部用戶的數據庫,收集一遍統計信息,確保上線新系統性能穩定。