

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 階段 3：遷移
<a name="phase-3-migrate"></a>

資料庫遷移的主要任務是以最短的停機時間完成遷移。由於這兩個資料庫都應該使用相同的程式設計語言和通訊協定，您可能需要轉換類似查詢語法、程序和函數的程式碼和結構描述。轉換結構描述時，請考慮下列層面：
+ 視需要修改適用於新引擎的資料庫連線。
+ 修正程式碼轉換中的任何警告和錯誤。
+ 針對轉換後的結構描述，視需要修改資料表映射和程式碼。
+ 識別和重構應用程式使用的任何廠商特定功能。

您可以使用任何第三方遷移工具進行結構描述程式碼轉換，例如 SAP ASE 資料庫和 Amazon RDS for SQL Server。您可能需要手動轉換一些程式碼，因為 SQL Server 不支援非 ANSI SQL。

轉換程式碼後，請轉換應用程式程式碼或動態 SQL 應用程式，然後執行單元和功能測試。如需詳細資訊，請參閱[測試遷移的資料庫物件 (SybaseToSQL)](https://learn.microsoft.com/en-us/sql/ssma/sybase/testing-migrated-database-objects-sybasetosql?view=sql-server-ver15)。

## 轉換資料
<a name="converting-the-data.08113c62-7c5a-5df1-abcf-462e3e9209f4"></a>

透過清理、標準化、驗證和排序原始資料，使其更有用。在資料庫遷移中，會以下列方式使用擷取、轉換和載入 (ETL) 程序：
+ 在資料庫內
+ 使用外部指令碼
+ 使用第三方工具

ETL 工具的範例包括 AWS Glue Informatica 和 Talend。對於從 SAP ASE 遷移到 SQL Server，某些免費工具可以自動轉換預存程序和函數。

## 驗證資料庫物件
<a name="validating-database-objects"></a>

驗證資料庫有助於防止後續遷移階段發生問題。在程式碼轉換之後，透過比較 SAP ASE 和 RDS SQL Server 之間的下列元素來驗證資料庫結構描述：
+ 結構描述
+ 表格
+ 檢視
+ 函數
+ 儲存的程序索引
+ 觸發
+ 限制條件 （例如，主索引鍵、外部索引鍵、檢查和預設值）

檢查每個物件是否正確遷移。如果您發現差異，請找出失敗的原因。您可能需要在目標資料庫中手動建立缺少的物件，或轉換 Transact-SQL 程式碼。如需詳細資訊，請參閱[從 SAP ASE 遷移至 Amazon RDS for SQL Server 或 Microsoft SQL Server 之後驗證資料庫物件](https://aws.amazon.com/blogs/database/validate-database-objects-after-migrating-from-sap-ase-to-amazon-rds-for-sql-server-or-microsoft-sql-server/)。

## 使用 遷移資料 AWS DMS
<a name="migrating-data-using-dms"></a>

如果您有多個資料庫使用者，您的應用程式可能需要根據排程遷移。根據資料庫大小和遷移時段，這類資料遷移需要完全載入和增量載入的知識。因此， AWS DMS 可以連接來源和目標資料庫，根據下列程序複寫資料庫內容：
+ 建立複寫伺服器。
+ 建立描述資料存放區連線的來源和目標端點。
+ 建立一或多個遷移任務，以在來源和目標資料存放區之間遷移資料。
+ 從 SAP ASE 持續複寫至 SQL Server
+ （選用） 使用變更資料擷取，將資料從 SAP ASE 完整遷移至 SQL Server

您可能需要最佳化 AWS DMS 來處理特定資料類型。如需詳細資訊，請參閱[使用 SAP ASE 資料庫做為 的來源 AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SAP.html)。

## 遷移離線資料
<a name="migrating-offline-data"></a>

您可以使用 AWS Storage Gateway 將 SAP ASE 資料庫與 Amazon Simple Storage Service (Amazon S3) 整合，為內部部署 SAP ASE 資料庫備份提供經濟實惠、可擴展且安全的儲存空間。如需詳細資訊，請參閱[使用 將 SAP ASE 資料庫整合到 Amazon S3 AWS Storage Gateway](https://aws.amazon.com/blogs/storage/integrate-an-sap-ase-database-to-amazon-s3-using-aws-storage-gateway/)。

## 使用第三方工具
<a name="using-third-party-tools"></a>

有些應用程式做為單一聯絡點 (SPOC)，可與其他應用程式互動。遷移至 SQL Server 資料庫平台時，這些互連可能會受到影響，而資料庫監控可能需要使用伺服器特定通訊協定的原生或第三方工具。請務必評估這些相依的應用程式和工具是否已支援 SQL Server，或是否需要修改才能正常運作。

對於封裝的應用程式，請諮詢廠商，以確定他們是否支援 Amazon RDS for SQL Server。對於自訂應用程式，您可能需要修改程式碼，以確保與遷移資料庫的相容性。

## 監控資料庫
<a name="monitoring-the-database"></a>

無論您選擇的遷移路徑為何，Amazon CloudWatch 都會在收集指標中扮演角色，例如 CPU 類型、記憶體和 I/O 函數。它也能夠在觸發閾值時設定指標閾值和啟動動作。

例如，您可以為 Amazon RDS 叢集指標、通知和動作建立警示，以偵測和關閉未使用或未充分利用的讀取器執行個體。在指標和事件上設定警示有助於將停機時間和業務影響降至最低。 AWS 服務 例如 Amazon S3、[Amazon RDS Performance Insights](https://aws.amazon.com/rds/performance-insights/)、Amazon CloudWatch 和 AWS CloudTrail 已與 RDS 資料庫平台整合，我們建議他們監控效能。

## 驗證資料
<a name="validating-the-data"></a>

從 SAP ASE 到 Amazon RDS for SQL Server 的資料遷移完成後，請驗證資料以確保準確性和一致性。使用下列 SQL 查詢來產生資料庫中每個資料表的中繼資料陳述式。

### 步驟 1：產生中繼資料陳述式和資料欄清單
<a name="step-1-generate-metadata-statements-and-column-lists"></a>

```
SELECT dt.schema_name, dt.table_name,
    STRING_AGG(dt.column_name, ',') AS column_name,
    STRING_AGG(dt.cname, ',') AS column_order
FROM (
    SELECT 
        object_name(a.id) AS table_name,
        a.name colname,
        c.name col_type,
        a.isnullable,
        a.name AS cname,
        schema_name(b.uid) AS schema_name,
        CASE 
            WHEN a.isnullable = 1 THEN
                CASE 
                    WHEN c.name LIKE '%char%' 
                        THEN 'coalesce(ltrim(rtrim('+a.name+')),''X'') as '+a.name
                    WHEN (c.name LIKE '%int%' OR c.name = 'numeric') 
                        THEN 'coalesce('+a.name+',0) as '+a.name
                    WHEN c.name IN ('decimal','float','money') 
                        THEN 'coalesce('+a.name+',0.0) as '+a.name
                    WHEN c.name LIKE 'datetime%' 
                        THEN 'coalesce(convert(nvarchar(30),'+a.name+',112),''99991231'') as '+a.name
                    ELSE a.name 
                END
            WHEN c.name LIKE 'datetime%' 
                THEN 'coalesce(convert(nvarchar(30),'+a.name+',112),''99991231'') as '+a.name
            WHEN c.name LIKE '%char%' 
                THEN 'coalesce(ltrim(rtrim('+a.name+')),''X'') as '+a.name
            ELSE a.name
        END AS column_name
    FROM syscolumns a
    INNER JOIN sysobjects b
        ON a.id = b.id 
        AND b.type = 'U'
    INNER JOIN systypes c
        ON a.usertype = c.usertype
        AND a.xusertype = c.xusertype
        AND c.name != 'varbinary'
    INNER JOIN (
        SELECT 
            OBJECT_NAME(ic.OBJECT_ID) AS table_name,
            COL_NAME(ic.OBJECT_ID, ic.column_id) AS column_name
        FROM sys.indexes AS i
        INNER JOIN sys.index_columns AS ic
            ON i.OBJECT_ID = ic.OBJECT_ID
            AND i.index_id = ic.index_id
            AND i.is_primary_key = 1
    ) pk
        ON pk.table_name = object_name(a.id)
        AND pk.column_name = a.name
) dt 
GROUP BY dt.schema_name, dt.table_name;
```

下表列出輸出的範例：


| 
| 
| **結構描述名稱** | **資料表名稱** | **資料欄名稱** | **資料欄順序** | 
| --- |--- |--- |--- |
| 個人 | 地址 | AddressID | AddressID | 
| 個人 | AddressType | AddressTypeID | AddressTypeID | 
| 個人 | BusinessEntity | BusinessEntityID | BusinessEntityID | 
| 個人 | BusinessEntityAddress | BusinessEntityID、AddressID、AddressTypeID | BusinessEntityID、AddressID、AddressTypeID | 

### 步驟 2：使用中繼資料結果產生比較查詢並建立 SELECT 陳述式
<a name="step-2-generate-comparison-queries"></a>

```
SELECT <column_name>
FROM [schema_name].[table_name]
ORDER BY <column_order>;
```

以下是產生的查詢範例：

```
SELECT BusinessEntityID, AddressID, AddressTypeID
FROM [Person].[BusinessEntityAddress]
ORDER BY BusinessEntityID, AddressID, AddressTypeID;
```

### 步驟 3：驗證
<a name="step-3-validation"></a>

1. 在兩個資料庫中執行中繼資料查詢。

1. 產生並執行每個資料表的`SELECT`陳述式。

1. 比較來源和目標資料庫之間的結果：
   + 資料列計數應相符。
   + 資料值應該相同。
   + 檢查資料類型轉換問題。

### 步驟 4：驗證資料列計數
<a name="step-4-validate-row-count"></a>

```
SELECT COUNT(1) AS total_rows
FROM [schema_name].[table_name];
```

### 步驟 5：更新應用程式的組態以指向新的資料庫
<a name="step-5-update-your-application-configuration"></a>

1. 更新安全群組。

1. 視需要修改 DNS 連線字串，以連線至目標資料庫。

## 測試遷移
<a name="testing-the-migration"></a>

測試程序可協助您識別開發期間忽略的問題，例如不正確轉換的查詢或缺少索引。它可能會顯示需要根據工作負載效能進行資料庫引擎調校或修改查詢。

功能測試包括應用程式工作流程的單元測試，有助於確保與新資料庫的無縫整合。透過驗證可接受的回應時間和識別瓶頸，效能測試有助於最佳化資料庫。

雖然手動和自動測試方法都存在，但我們建議您使用自動化方法，因為它更有效率，尤其是在額外的測試週期。