Sql-Server

完全遷移 2008R2 -> 2016

  • February 12, 2019

我們目前擁有帶有 MS/SQL 2008R2 的 Windows Server 2008:預設實例和兩個命名實例。我們正在啟動一個 Windows 2016 Server,我們將在其上安裝 MS/SQL Server 2016 Standard 預設實例和兩個命名實例。如果我了解到目前為止所閱讀的內容,我可以將數據庫與 2008R2 分離,將文件複製到新的 2016 環境並附加到它們…啟用查詢儲存並提高可比性。我需要知道的是:

  1. 如何使用密碼遷移使用者記錄
  2. 如何使用密碼遷移連結伺服器

我已經閱讀了類似於SQL Server Upgrade 2008 -> 2016 / 100 to 130 compatibility slow queries, new CE 殺死我但找不到特定於使用者和/或連結伺服器的資訊的文章

f 我了解到目前為止所讀到的內容,我可以將數據庫與 2008R2 分離,將文件複製到新的 2016 環境並附加到它們……啟用查詢儲存並提高可比性。

不,不要分離/連接。而是使用備份/恢復。

如果您的遷移視窗非常緊張,請設置日誌傳送或鏡像,然後切換到新實例。

我已經詳細介紹了遷移的前後步驟

如何使用密碼遷移使用者記錄

使用dbatools幫助您完成遷移。對於登錄,只需使用Copy-DbaLogin

如何使用密碼遷移連結伺服器

使用Copy-DbaLinkedServer

請不要將數據文件從一個實例複製到另一個實例。如果有任何問題,Microsoft 可能不支持。

有幾種方法可以安全地從一台伺服器遷移到另一台伺服器,但我更喜歡使用Data Migration Assistant。現在,讓我們談談您的步驟:

  1. 始終收集所有使用者 DDL 腳本,包括:

那裡有很多腳本,這個版本非常可靠,可以在一個數據庫的上下文中執行

/*
This script will script the role members for all roles on the database.    
This is useful for scripting permissions in a development environment before refreshing development with a copy of production.  This will allow us to easily ensure development permissions are not lost during a prod to dev restoration. 
*/

/*********************************************/
/*********   DB CONTEXT STATEMENT    *********/
/*********************************************/
SELECT '-- [-- DB CONTEXT --] --' AS [-- SQL STATEMENTS --],
     1 AS [-- RESULT ORDER HOLDER --]
UNION
SELECT   'USE' + SPACE(1) + QUOTENAME(DB_NAME()) AS [-- SQL STATEMENTS --],
     1 AS [-- RESULT ORDER HOLDER --]

UNION

SELECT '' AS [-- SQL STATEMENTS --],
     2 AS [-- RESULT ORDER HOLDER --]

UNION


/*********************************************/
/*********    DB ROLE PERMISSIONS    *********/
/*********************************************/
SELECT '-- [-- DB ROLES --] --' AS [-- SQL STATEMENTS --],
     3 AS [-- RESULT ORDER HOLDER --]
UNION
SELECT   'EXEC sp_addrolemember @rolename ='
  + SPACE(1) + QUOTENAME(USER_NAME(rm.role_principal_id), '''') + ', @membername =' + SPACE(1) + QUOTENAME(USER_NAME(rm.member_principal_id), '''') AS [-- SQL STATEMENTS --],
     3 AS [-- RESULT ORDER HOLDER --]
FROM   sys.database_role_members AS rm
WHERE   USER_NAME(rm.member_principal_id) IN (   
                                   --get user names on the database
                                   SELECT [name]
                                   FROM sys.database_principals
                                   WHERE [principal_id] > 4 -- 0 to 4 are system users/schemas
                                   and [type] IN ('G', 'S', 'U') -- S = SQL user, U = Windows user, G = Windows group
                                  )
--ORDER BY rm.role_principal_id ASC


UNION

SELECT '' AS [-- SQL STATEMENTS --],
     4 AS [-- RESULT ORDER HOLDER --]

UNION

/*********************************************/
/*********  OBJECT LEVEL PERMISSIONS *********/
/*********************************************/
SELECT '-- [-- OBJECT LEVEL PERMISSIONS --] --' AS [-- SQL STATEMENTS --],
     5 AS [-- RESULT ORDER HOLDER --]
UNION
SELECT   CASE 
        WHEN perm.state <> 'W' THEN perm.state_desc 
        ELSE 'GRANT'
     END
     + SPACE(1) + perm.permission_name + SPACE(1) + 'ON ' + QUOTENAME(USER_NAME(obj.schema_id)) + '.' + QUOTENAME(obj.name) --select, execute, etc on specific objects
     + CASE
           WHEN cl.column_id IS NULL THEN SPACE(0)
           ELSE '(' + QUOTENAME(cl.name) + ')'
       END
     + SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(USER_NAME(usr.principal_id)) COLLATE database_default
     + CASE 
           WHEN perm.state <> 'W' THEN SPACE(0)
           ELSE SPACE(1) + 'WITH GRANT OPTION'
       END
        AS [-- SQL STATEMENTS --],
     5 AS [-- RESULT ORDER HOLDER --]
FROM   
  sys.database_permissions AS perm
     INNER JOIN
  sys.objects AS obj
        ON perm.major_id = obj.[object_id]
     INNER JOIN
  sys.database_principals AS usr
        ON perm.grantee_principal_id = usr.principal_id
     LEFT JOIN
  sys.columns AS cl
        ON cl.column_id = perm.minor_id AND cl.[object_id] = perm.major_id
--WHERE   usr.name = @OldUser
--ORDER BY perm.permission_name ASC, perm.state_desc ASC



UNION

SELECT '' AS [-- SQL STATEMENTS --],
     6 AS [-- RESULT ORDER HOLDER --]

UNION

/*********************************************/
/*********    DB LEVEL PERMISSIONS   *********/
/*********************************************/
SELECT '-- [--DB LEVEL PERMISSIONS --] --' AS [-- SQL STATEMENTS --],
     7 AS [-- RESULT ORDER HOLDER --]
UNION
SELECT   CASE 
        WHEN perm.state <> 'W' THEN perm.state_desc --W=Grant With Grant Option
        ELSE 'GRANT'
     END
  + SPACE(1) + perm.permission_name --CONNECT, etc
  + SPACE(1) + 'TO' + SPACE(1) + '[' + USER_NAME(usr.principal_id) + ']' COLLATE database_default --TO <user name>
  + CASE 
        WHEN perm.state <> 'W' THEN SPACE(0) 
        ELSE SPACE(1) + 'WITH GRANT OPTION' 
    END
     AS [-- SQL STATEMENTS --],
     7 AS [-- RESULT ORDER HOLDER --]
FROM   sys.database_permissions AS perm
  INNER JOIN
  sys.database_principals AS usr
  ON perm.grantee_principal_id = usr.principal_id
--WHERE   usr.name = @OldUser

WHERE   [perm].[major_id] = 0
  AND [usr].[principal_id] > 4 -- 0 to 4 are system users/schemas
  AND [usr].[type] IN ('G', 'S', 'U') -- S = SQL user, U = Windows user, G = Windows group

ORDER BY [-- RESULT ORDER HOLDER --]
  • 任何 SQL 作業
  • 複製
  • 新實例所需的任何其他外部文件
  1. 預先計劃的儲存要求
  • 有時遷移是遵循 Microsoft 的10 大儲存最佳實踐的最佳時機,包括:
  • 將 tempdb 與實例的其餘部分以及您的系統數據文件與使用者數據庫分開
  • 將任何特殊數據庫定址到其自己的磁碟中,進行最佳性能設置。

3)測試,測試,測試!

始終測試您的遷移。創建一個備份並將其還原到您的新伺服器上,以便您驗證

  • a)儲存適合
  • b) 恢復所需的時間
  • c) 預先測試連接,使其不受網路、防火牆或權限問題(包括 SPN、DNS A 記錄等)的影響
  1. 遷移(使用三種方法之一)

A) 使用本地 SQL 備份。

  • 創建從源實例到新實例的本地備份。從本地備份集恢復通常比網路快得多。

B) 使用 Veritas 等備份工具

  • 基本上,這是一個網路恢復,所以預計它會比本地備份慢。此外,在進行實時遷移之前驗證它是否有效。

C) 使用Microsoft的數據遷移助手

這是我個人最喜歡的,因為該工具是遷移當天的一體化解決方案。

  • 在遷移到較新版本的 SQL Server 之前查找任何中斷、已棄用、更改的更改和行為
  • 發現新功能和建議!DMA 的建議非常全面,並且完全支持 Azure!
  • 使用 Windows 身份驗證,這簡化了遷移所需的權限。
  • 最佳部分將 SQL 登錄名和使用者無縫轉移到新實例,以便您的應用程序可以在數據遷移完成後連接!

**從 2008R2 到 2016 年,我已經成功遷移了幾個大型實例,其中一個包含 100 多個數據庫,從小型到 1TB+ 不等。**沒有比較,DMA 的執行速度比任何其他方法都更快、更一致。與其他工具不同的是,您可以以圖形方式將數據庫移動到您想要的任何自定義位置。非常酷,強烈推薦。

引用自:https://dba.stackexchange.com/questions/226368