

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

# 將資料匯入至 Amazon RDS for MySQL 資料庫執行個體
<a name="MySQL.Procedural.Importing.Other"></a>

您可使用多種不同技術，將資料匯入 RDS for MySQL 資料庫執行個體。最佳方法取決於多種因素：
+ 資料來源
+ 資料量
+ 一次性匯入或持續性
+ 停機時間

 如要連同資料一起遷移應用程式，則務必考量停機時間。

下表列出將資料匯入 RDS for MySQL 資料庫執行個體的各種技術：


| 來源 | 資料量 | 一次性或持續性 | 應用程式停機時間 | 技術 | 其他資訊 | 
| --- | --- | --- | --- | --- | --- | 
|  現場部署或 Amazon EC2 上的現有 MySQL 資料庫  |  任何  |  一次性  |  一些  |  建立現場部署資料庫的備份、將其存放於 Amazon S3，然後將備份檔案還原至執行 MySQL 的新 Amazon RDS 資料庫執行個體。  |  [將備份還原至 Amazon RDS for MySQL 資料庫執行個體](MySQL.Procedural.Importing.md)  | 
|  現場部署或 Amazon EC2 上的現有 MySQL 資料庫  |  任何  |  持續性  |  極小  |  使用現有 MySQL 資料庫為複寫來源以設定複寫。  |  [使用外部來源執行個體設定二進位日誌檔案位置複寫](MySQL.Procedural.Importing.External.Repl.md) [以較短的停機時間將資料匯入至 Amazon RDS for MySQL 資料庫](mysql-importing-data-reduced-downtime.md)  | 
|  任何現有資料庫  |  任何  |  一次性或持續性  |  極小  |  使用 AWS Database Migration Service 以最少的停機時間遷移資料庫，對於許多資料庫資料庫引擎，則繼續持續複寫。  |  《AWS Database Migration Service 使用者指南》**中的[什麼是 AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 和[使用與 MySQL 相容的資料庫作為 AWS DMS的目標](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.MySQL.html)   | 
|  現有的 MySQL 資料庫執行個體  |  任何  |  一次性或持續性  |  極小  |  為持續複寫建立僅供讀取複本。升級僅供讀取複本，以便一次性建立新的資料庫執行個體。  |  [使用資料庫執行個體僅供讀取複本](USER_ReadRepl.md)  | 
|  現有的 MySQL 資料庫  |  小型  |  一次性  |  一些  | 使用命令列公用程式，直接將資料複製到您的 MySQL 資料庫執行個體。 |  [從外部 MySQL 資料庫將資料匯入至 Amazon RDS for MySQL 資料庫執行個體](mysql-importing-data-external-database.md)  | 
|  未存放在現有資料庫的資料  |  中型  |  一次性  |  一些  | 建立一般檔案，並使用 MySQL LOAD DATA LOCAL INFILE 陳述式將其匯入。 |  [匯入任何 Amazon RDS for MySQL 資料庫執行個體來源的資料](mysql-importing-data-any-source.md)  | 

**注意**  
`mysql` 系統資料庫包含登入資料庫執行個體與存取資料所需的身分驗證和授權資訊。卸除、更改、重新命名或截斷資料庫執行個體中 `mysql` 資料庫的資料表、資料或其他內容，可能會導致發生錯誤，造成無法存取資料庫執行個體與資料的情形。如果發生這種情況，您可以使用 命令從快照 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html)還原資料庫執行個體。您可以使用 命令來復原資料庫執行個體 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html)。

# MySQL 的資料匯入考量
<a name="MySQL.Procedural.Importing.Advanced"></a>

下列內容包含有關將資料載入 MySQL 的技術資訊。此內容的目標是熟悉 MySQL 伺服器架構的使用者。

## 二進位記錄
<a name="MySQL.Procedural.Importing.Advanced.Log"></a>

啟用二進位記錄可降低資料載入效能，且相較於停用的記錄，最多需要額外四倍的磁碟空間。用於載入資料的交易大小會直接影響系統效能和磁碟空間需求 - 較大的交易需要更多資源。

## 交易大小
<a name="MySQL.Procedural.Importing.Advanced.Size"></a>

交易大小會影響 MySQL 資料載入的下列層面：
+ 資源耗用
+ 磁碟空間使用率
+ 繼續程序
+ 復原時間
+ 輸入格式 (一般檔案或 SQL)

本節會說明交易大小如何影響二進位日誌，並解釋為何要在大型資料載入期間停用此功能。您可以設定 Amazon RDS 自動備份保留期間，藉此啟用及停用二進位記錄。非零的數值會啟用二進位日誌，而零則會停用此功能。如需詳細資訊，請參閱[Backup retention period (備份保留期間)](USER_WorkingWithAutomatedBackups.BackupRetention.md)。

我們也會說明大型交易對 InnoDB 的影響，以及為何需要盡量縮減交易大小的原因。

### 小型交易
<a name="MySQL.Procedural.Importing.Advanced.Log.Small"></a>

若為小型交易，二進位日誌會將載入資料所需的磁碟寫入次數加倍。此效果會嚴重降低其他資料庫作業階段的效能，並增加載入資料所需的時間。經歷的降級部分取決於下列因素：
+ 上傳率
+ 載入期間發生的其他資料庫活動
+ Amazon RDS 資料庫執行個體的容量

二進位日誌在完成備份及移除前，也會佔用與載入資料量約莫相等的磁碟空間。Amazon RDS 會頻繁備份並移除二進位日誌，盡可能避免這種情況。

### 大型交易
<a name="MySQL.Procedural.Importing.Advanced.Log.Large"></a>

對於大型交易，二進位日誌記錄會將 IOPS 和磁碟用量增加三倍，原因如下：
+ 二進位日誌快取會將交易資料暫時存放在磁碟上。
+ 此快取會隨著交易大小而增加，這會耗用磁碟空間。
+ 當交易 (遞交或轉返) 完成時，系統會將快取複製到二進位日誌。

此程序會建立三份資料副本：
+ 原始資料
+ 磁碟上的快取
+ 最終二進位日誌項目

每個寫入作業都會產生額外的 IO，進一步影響效能。

因此，相較於停用的記錄，二進位記錄需要三倍的磁碟空間。例如，將 10 GiB 的資料載入為單一交易會建立三個複本：
+ 資料表資料的 10 GiB
+ 二進位日誌快取為 10 GiB
+ 二進位日誌檔案為 10 GiB

所需的暫存磁碟空間總計為 30 GiB。

重要的磁碟空間考量：
+ 快取檔案會持續存在，直到工作階段結束或新的交易建立另一個快取為止。
+ 二進位日誌會保留到備份為止，可能會長時間保留 20 GiB (快取和日誌)。

如果您使用 `LOAD DATA LOCAL INFILE` 載入資料，則資料復原會建立第四個複本，以防必須從載入之前進行的備份中復原資料庫。復原期間，MySQL 會擷取二進位日誌的資料，放入一般檔案中。MySQL 接著會執行 `LOAD DATA LOCAL INFILE`。根據上述範例，此復原需要 40 GiB 的總暫存磁碟空間，或是資料表、快取、日誌和本機檔案各 10 GiB。如果沒有至少 40 GiB 的可用磁碟空間，則復原會失敗。

### 最佳化大型資料負載
<a name="MySQL.Procedural.Importing.AnySource.Advanced.Disable"></a>

對於大型資料載入，請停用二進位記錄，以減少額外負荷和磁碟空間需求。您可以將備份保留期設定為 0，以停用二進位記錄。載入完成後，將備份保留期還原至適當的非零值。如需詳細資訊，請參閱 [修改 Amazon RDS 資料庫執行個體](Overview.DBInstance.Modifying.md) 和設定資料表中的[備份保留期間](USER_ModifyInstance.Settings.md)。

**注意**  
如果資料庫執行個體是僅供讀取複本的來源資料庫執行個體，則不可將備份保留期設為 0。

載入資料之前，建議您建立資料庫快照。如需詳細資訊，請參閱[管理手動備份](USER_ManagingManualBackups.md)。

## InnoDB
<a name="MySQL.Procedural.Importing.Advanced.InnoDB"></a>

下列復原記錄和復原選項的相關資訊支援將 InnoDB 交易保持為小型，以最佳化資料庫效能。

### 了解 InnoDB 復原記錄
<a name="MySQL.Procedural.Importing.Advanced.InnoDB.Undo"></a>

復原是一種記錄機制，可啟用交易復原，並支援多版本並行控制 (MVCC)。

MySQL 5.7 和較低版本的復原日誌存放在 InnoDB 系統資料表空間 (通常是 ibdata1) 中，並且會保留到清除執行緒將其移除為止。因此，大型資料載入交易可能會造成系統資料工作表變得無比龐大並佔用磁碟空間，且若未重新重建資料庫，將無法回收這些空間。

對於所有 MySQL 版本，清除執行緒都必須等待移除任何復原日誌，直到最舊的作用中交易提交或復原為止。如果資料庫在載入期間同時處理其他交易，則即使這些交易皆已提交，且沒有其他交易需要因為 MVCC 而復原，這些復原也會累積在系統資料表空間中，並且無法移除。在這種情況下，包括唯讀交易在內的所有交易都會變慢。此速度變慢是因為所有交易都會存取任何交易 (而不只是載入交易) 變更的所有資料列。實際上，交易必須掃描復原日誌，避免長時間執行的載入交易在復原日誌清除期間遭到清除。這會影響存取修改資料列的任何作業之效能。

### InnoDB 交易復原選項
<a name="MySQL.Procedural.Importing.Advanced.InnoDB.Rollback"></a>

雖然 InnoDB 最佳化遞交作業，但大型交易復原速度緩慢。為了加快復原速度，請執行時間點復原或還原資料庫快照。如需詳細資訊，請參閱[時間點復原](USER_PIT.md)及[還原至資料庫執行個體](USER_RestoreFromSnapshot.md)。

## 資料匯入格式
<a name="MySQL.Procedural.Importing.Advanced.InputFormat"></a>

MariaDB 支援兩種資料匯入格式：一般檔案和 SQL。檢閱每個格式的相關資訊，以判斷符合您個人需求的最佳選項。

### 一般檔案
<a name="MySQL.Procedural.Importing.Advanced.InputFormat.FlatFiles"></a>

對於小型交易，使用 `LOAD DATA LOCAL INFILE` 載入一般檔案。相較於使用 SQL，此資料匯入格式可提供下列優點：
+ 較少網路流量
+ 降低資料傳輸成本
+ 減少資料庫處理開銷
+ 更快的處理速度

`LOAD DATA LOCAL INFILE` 會將整個一般檔案載入為一筆交易。將個別檔案的大小保持為小型，以獲得下列優點：
+ **繼續執行功能** – 輕鬆追蹤哪些檔案已載入完成。如果載入期間發生問題，您可以從中止的地方繼續工作。有些資料可能需要重新傳輸到 Amazon RDS，但若使用小型檔案，要重新傳輸的內容就可以減至最少。
+ **平行資料載入** – 如果您有足夠的 IOPS 和網路頻寬進行單一檔案載入，則平行載入可以節省時間。
+ **負載率控制 **– 如果您的資料負載對其他程序造成負面影響，您可以透過增加檔案之間的間隔來控制負載率。

大型交易會減少使用 `LOAD DATA LOCAL INFILE` 匯入資料的優點。當您無法將大量資料分解為較小型的檔案時，請考慮使用 SQL。

### SQL
<a name="MySQL.Procedural.Importing.Advanced.InputFormat.SQL"></a>

SQL 具備一項一般檔案所缺乏的主要優點，亦即您可輕鬆將交易大小維持在較小的狀態。不過，SQL 載入的時間可能會較一般檔案長得多。此外，在失敗之後，很難判斷要繼續的位置，您無法重新啟動 mysqldump 檔案。如果在載入 mysqldump 檔案時發生錯誤，您必須修改或替換檔案，才能繼續載入。或者，替代方案是在修正失敗原因後，還原至載入前的時間點，然後重新傳送檔案。如需詳細資訊，請參閱[時間點復原](USER_PIT.md)。

## 將 Amazon RDS 資料庫快照用於資料庫檢查點
<a name="MySQL.Procedural.Importing.Advanced.Checkpoints"></a>

如果您載入資料的時間很長 (例如數小時或數天) 而沒有二進位記錄，請使用資料庫快照來提供資料安全的定期檢查點。每個資料庫快照都會建立資料庫執行個體的一致複本，以做為系統故障或資料損毀事件期間的復原點。由於資料庫快照速度很快，經常檢查點對負載效能的影響極小。您可以刪除先前的資料庫快照，而不會影響資料庫耐久性或復原功能。如需資料庫快照的詳細資訊，請參閱 [管理手動備份](USER_ManagingManualBackups.md)。

## 縮短資料庫載入時間
<a name="MySQL.Procedural.Importing.Advanced.LoadTime"></a>

以下是縮短載入時間的其他秘訣：
+ 在將資料載入 MySQL 資料庫之前，先建立所有次要索引。與其他資料庫系統不同，MySQL 會在新增或修改次要索引時，重建整個資料表。此程序會建立包含索引變更的新資料表、複製所有資料，並捨棄原始資料表。
+ 依主索引鍵順序載入資料。對於 InnoDB 資料表，這可以縮短載入時間達 75%–80%，並將資料檔案大小減少 50%。
+ 將 `foreign_key_checks` 設定為 `0` 來停用外部金鑰限制條件。對於使用 `LOAD DATA LOCAL INFILE` 載入的一般檔案，這通常是必要作業。對於任何載入，停用外部金鑰檢查可加速資料載入。載入完成後，將 `foreign_key_checks` 設定為 `1` 並驗證資料，以重新啟用限制條件。
+ 除非接近資源限制，否則請平行載入資料。若要啟用跨多個資料表區段的並行載入，請適時使用分割的資料表。
+ 若要降低 SQL 執行負荷，請將多個 `INSERT` 陳述式合併為單一多值 `INSERT` 作業。`mysqldump` 會自動實作此最佳化。
+ 將 `innodb_flush_log_at_trx_commit` 設定為 `0`，以減少 InnoDB 日誌 IO 作業。載入完成後，將 `innodb_flush_log_at_trx_commit` 還原至 `1`。
**警告**  
將 `innodb_flush_log_at_trx_commit` 設定為 `0` 會導致 InnoDB 每秒排清其日誌，而不是在每次遞交時排清日誌。此設定可提高效能，但可能會在系統故障期間造成交易遺失的風險。
+ 如果您要將資料載入至沒有僅供讀取複本的資料庫執行個體，請將 `sync_binlog` 設定為 `0`。載入完成後，將 `sync_binlog parameter` 還原至 `1`。
+ 在資料庫執行個體轉換為多可用區域部署前，將資料載入至單一可用區域資料庫執行個體。如果資料庫執行個體已使用多可用區域部署，則不建議切換至單一可用區域部署來進行資料載入。這樣做只會提供邊際改善。

# 將備份還原至 Amazon RDS for MySQL 資料庫執行個體
<a name="MySQL.Procedural.Importing"></a>

Amazon RDS 支援使用備份檔案來匯入 MySQL 資料庫。您可以建立資料庫的備份，並將備份檔案存放在 Amazon S3，接著將備份檔案還原至執行 MySQL 的新 Amazon RDS 資料庫執行個體。Amazon RDS 支援在所有 AWS 區域中從 Amazon S3 匯入備份檔案。

本節所述的案例會還原內部部署資料庫的備份。只要資料庫可供存取，您就可以將此技術用於其他位置的資料庫，例如 Amazon EC2 或其他雲端服務。

下圖顯示所支援的案例。

![\[從 S3 匯入備份檔案的 MySQL。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/MySQL-bak-file.png)


在建立、複製和還原備份檔案時，如果您的內部部署資料庫可以離線，建議您使用備份檔案將資料庫匯入 Amazon RDS。如果您的資料庫無法離線，您可以使用下列其中一種方法：
+ **二進位日誌** – 首先，將備份檔案從 Amazon S3 匯入至 Amazon RDS，如本主題所述。然後，使用二進位日誌 (binlog) 複寫更新您的資料庫。如需詳細資訊，請參閱[使用外部來源執行個體設定二進位日誌檔案位置複寫](MySQL.Procedural.Importing.External.Repl.md)。
+ **AWS Database Migration Service** – 使用 AWS Database Migration Service 將資料庫遷移至 Amazon RDS。如需詳細資訊，請參閱[什麼是 AWS Database Migration Service？](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 

## 將備份檔案從 Amazon S3 匯入至 Amazon RDS 的設定概觀
<a name="MySQL.Procedural.Importing.Enabling"></a>

若要將備份檔案從 Amazon S3 匯入至 Amazon RDS，必須要有下列元件：
+ 用來儲存備份檔案的 Amazon S3 儲存貯體。

  如果您已有 Amazon S3 儲存貯體，可以使用該儲存貯體。如果沒有，請建立新的 Amazon S3 儲存貯體。如需詳細資訊，請參閱[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html)。
+ Percona XtraBackup 所建立之內部部署資料庫的備份。

  如需詳細資訊，請參閱[建立資料庫備份](#MySQL.Procedural.Importing.Backup)。
+ 允許 Amazon RDS 存取 S3 儲存貯體的 AWS Identity and Access Management (IAM) 角色。

  如果您已有 IAM 角色，您可以使用該角色，並將信任和許可政策連接至該角色。如需詳細資訊，請參閱[手動建立 IAM 角色](#MySQL.Procedural.Importing.Enabling.IAM)。

  如果您沒有 IAM 角色，您有兩個選項：
  + 您可以手動建立新的 IAM 角色。如需詳細資訊，請參閱[手動建立 IAM 角色](#MySQL.Procedural.Importing.Enabling.IAM)。
  + 您可以選擇讓 Amazon RDS 為您建立新的 IAM 角色。如果您希望 Amazon RDS 為您建立新的 IAM 角色，請遵循 [將資料從 Amazon S3 匯入新的 MySQL 資料庫執行個體](#MySQL.Procedural.Importing.PerformingImport)章節 AWS 管理主控台 中使用 的程序。

## 建立資料庫備份
<a name="MySQL.Procedural.Importing.Backup"></a>

使用 Percona XtraBackup 軟體來建立備份。建議您使用 Percona XtraBackup 的最新版本。您可以從 Percona 網站上的[軟體下載](https://www.percona.com/downloads/)安裝 Percona XtraBackup。

**警告**  
建立資料庫備份時，XtraBackup 可能會將憑證儲存在 xtraackup\$1info 檔案中。請務必確認 xtrabackup\$1info 檔案中的 `tool_command` 設定未包含任何敏感資訊。

您應使用的 Percona XtraBackup 版本取決於您要備份的 MySQL 版本。
+ **MySQL 8.4** – 使用 Percona XtraBackup 8.4 版。
+ **MySQL 8.0** – 使用 Percona XtraBackup 8.0 版。
**注意**  
Percona XtraBackup 8.0.12 和更高版本支援所有 MySQL 8.0 版本的遷移。如果您要遷移至 RDS for MySQL 8.0.32 或更高版本，必須使用 Percona XtraBackup 8.0.12 或更高版本。
+ **MySQL 5.7** – 使用 Percona XtraBackup 2.4 版。

您可以使用 Percona XtraBackup 建立 MySQL 資料庫檔案的完整備份。或者，如果您已使用 Percona XtraBackup 來備份 MySQL 資料庫檔案，您可以上傳現有的完整和增量備份目錄與檔案。

如需使用 Percona XtraBackup 備份資料庫的詳細資訊，請參閱 Percona 網站上的 [Percona XtraBackup - 文件](https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html)。

### 使用 Percona XtraBackup 來建立完整備份
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Full"></a>

若要建立可讓 Amazon RDS 從 Amazon S3 還原的 MySQL 資料庫檔案完整備份，請使用 Percona XtraBackup 公用程式 (`xtrabackup`)。

例如，下列命令會建立 MySQL 資料庫的備份，並將檔案儲存在 `/on-premises/s3-restore/backup` 資料夾中。

```
xtrabackup --backup --user=myuser --password=password --target-dir=/on-premises/s3-restore/backup
```

如果要將備份壓縮成單一檔案 (後續可視需要分割成多個檔案)，您可以根據 MySQL 版本將備份儲存為下列其中一種格式：
+ **Gzip (.gz)** – 適用於 MySQL 5.7 和較低版本
+ **tar (.tar)** – 適用於 MySQL 5.7 和較低版本
+ **Percona xbstream (.xbstream) **– 適用於所有 MySQL 版本

**注意**  
Percona XtraBackup 8.0 和更高版本僅支援壓縮時的 Percona xbstream。

**MySQL 5.7 和較低版本**

下列命令建立 MySQL 資料庫的備份，並分割成多個 Gzip 檔案。將值取代為您自己的資訊。

```
xtrabackup --backup --user=my_user --password=password --stream=tar \
   --target-dir=/on-premises/s3-restore/backup | gzip - | split -d --bytes=500MB \
   - /on-premises/s3-restore/backup/backup.tar.gz
```

**MySQL 5.7 和較低版本**

下列命令建立 MySQL 資料庫的備份，並分割成多個 tar 檔案。將值取代為您自己的資訊。

```
xtrabackup --backup --user=my_user --password=password --stream=tar \
   --target-dir=/on-premises/s3-restore/backup | split -d --bytes=500MB \
   - /on-premises/s3-restore/backup/backup.tar
```

**所有 MySQL 版本**

下列命令建立 MySQL 資料庫的備份，並分割成多個 xbstream 檔案。將值取代為您自己的資訊。

```
xtrabackup --backup --user=myuser --password=password --stream=xbstream \
   --target-dir=/on-premises/s3-restore/backup | split -d --bytes=500MB \
   - /on-premises/s3-restore/backup/backup.xbstream
```

**注意**  
如果您看到下列錯誤，可能是因為您的命令中混合了檔案格式：  

```
ERROR:/bin/tar: This does not look like a tar archive
```

### 透過 Percona XtraBackup 來使用增量備份
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Incr"></a>

如果您已使用 Percona XtraBackup 來執行 MySQL 資料庫檔案的完整和增量備份，則不需要建立完整備份並將備份檔案上傳至 Amazon S3。為了節省時間，您可以將現有的備份目錄和檔案複製到 Amazon S3 儲存貯體。如需有關使用 Percona XtraBackup 來建立增量備份的詳細資訊，請參閱 Percona 網站上的[建立增量備份](https://docs.percona.com/percona-xtrabackup/LATEST/create-incremental-backup.html)。

將現有的完整和增量備份檔案複製到 Amazon S3 儲存貯體時，您必須遞迴複製基本目錄的內容。這些內容包括完整備份，以及所有增量備份目錄和檔案。此副本必須保留 Amazon S3 儲存貯體中的目錄結構。Amazon RDS 會逐一查看所有檔案和目錄。Amazon RDS 使用包含在每個增量備份中的 `xtrabackup-checkpoints` 檔案，以識別基本目錄，以及依記錄序號 (LSN) 範圍來排序增量備份。

### Percona XtraBackup 的備份考量
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Considerations"></a>

Amazon RDS 根據檔案名稱來取用備份檔案。請根據檔案格式，以適當的副檔名命名您的備份檔案。例如，對於使用 Percona xbstream 格式存放的檔案，請使用 `.xbstream`。

Amazon RDS 依字母順序和自然數順序來取用備份檔案。為了確保備份檔案會依適當順序寫入和命名，發出 `xtrabackup` 命令時請使用 `split` 選項。

Amazon RDS 不支援使用 Percona XtraBackup 所建立的局部備份。在備份資料庫的來源檔案時，您無法使用下列選項建立局部備份。
+ `--tables`
+ `--tables-exclude`
+ `--tables-file`
+ `--databases`
+ `--databases-exclude`
+ `--databases-file`

## 手動建立 IAM 角色
<a name="MySQL.Procedural.Importing.Enabling.IAM"></a>

如果沒有，您可以手動建立新的 IAM 角色。不過，如果您使用 還原資料庫 AWS 管理主控台，建議您選擇讓 Amazon RDS 為您建立新的 IAM 角色。若要讓 Amazon RDS 為您建立此角色，請依照 [將資料從 Amazon S3 匯入新的 MySQL 資料庫執行個體](#MySQL.Procedural.Importing.PerformingImport) 一節中的程序操作。

若要手動建立新的 IAM 角色以便從 Amazon S3 匯入資料庫，請建立可從 Amazon RDS 將許可委派給 Amazon S3 儲存貯體的角色。當您建立 IAM 角色時，您需要附加信任和許可政策。若要從 Amazon S3 匯入備份檔案，請使用類似下列範例的信任和許可政策。如需建立角色的詳細資訊，請參閱[建立角色以將許可委派給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

信任和許可政策規定您必須提供 Amazon Resource Name (ARN)。如需 ARN 格式的詳細資訊，請參閱 [Amazon Resource Name (ARNs AWS 和服務命名空間](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。

**Example 從 Amazon S3 匯入時的信任原則**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AssumeRoleForBackup",
      "Effect": "Allow",
      "Principal": {
        "Service": "rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

**Example 從 Amazon S3 匯入時的許可原則 — IAM 使用者許可**  
在下列範例中，將 *iam\$1user\$1id* 取代為您自己的值。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowS3AccessRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/S3Access"
        }
    ]
}
```

**Example 從 Amazon S3 匯入時的許可原則 — 角色許可**  
在下列範例中，將 *amzn-s3-demo-bucket* 和 *prefix* 取代為您自己的值。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":
    [
        {
        "Effect": "Allow",
        "Action":
            [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
        },
        {
        "Effect": "Allow",
        "Action":
            [
                "s3:GetObject"
            ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix*"
        },
        {
        "Effect": "Allow",
        "Action":
            [
                "kms:Decrypt"
            ],
        "Resource": [
            "arn:aws:kms:us-east-1:111122223333:key/key_id*"
            ]
        }
    ]
}
```
如果包含檔案名稱字首，請在字首後面加上星號 (\$1)。如果您不想指定字首，則指定星號即可。

## 將資料從 Amazon S3 匯入新的 MySQL 資料庫執行個體
<a name="MySQL.Procedural.Importing.PerformingImport"></a>

您可以使用 AWS 管理主控台 AWS CLI或 RDS API，將資料從 Amazon S3 匯入新的 MySQL 資料庫執行個體。

### 主控台
<a name="MySQL.Procedural.Importing.Console"></a>

**從 Amazon S3 將資料匯入新的 MySQL 資料庫執行個體**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)：// 開啟 Amazon RDS 主控台。

1. 在 Amazon RDS 主控台的右上角，選擇您要建立資料庫執行個體 AWS 區域 的 。選擇與包含資料庫備份的 Amazon S3 儲存貯體 AWS 區域 相同的 。

1. 在導覽窗格中，選擇 **Databases** (資料庫)。

1. 選擇 **Restore From S3 (從 S3 還原)**。

   系統會顯示 **Create database by restoring from S3** (從 S3 還原以建立資料庫) 頁面。  
![\[從 S3 還原以建立資料庫頁面，您可以在此處指定從 S3 還原資料庫執行個體的詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/mys-s3-ingestion.png)

1. 在 **S3 來源**底下：

   1. 選擇包含備份的 **S3 bucket** (S3 儲存貯體)。

   1. (選用) 在 **S3 字首**中，為存放在 Amazon S3 儲存貯體中的檔案輸入檔案路徑字首。

      若未指定字首，Amazon RDS 會使用 S3 儲存貯體的根資料夾中所有的檔案和資料夾來建立資料庫執行個體。如果指定字首，則 Amazon RDS 會使用 S3 儲存貯體中的檔案和資料夾來建立資料庫執行個體，且檔案的路徑會以指定的字首開頭。

      例如，您將備份檔案儲存在 S3 中一個名為 backups 的子資料夾，而且有多組備份檔案，各存放於自己的目錄中 (gzip\$1backup1、gzip\$1backup2 等等)。在此案例中，若要從 gzip\$1backup1 資料夾中的檔案還原，應指定字首 backups/gzip\$1backup1。

1. 在 **Engine options (引擎選項)**：

   1. 針對 **Engine type** (引擎類型)，請選擇 **MySQL**。

   1. 在 **Source engine version** (來源引擎版本) 中，選擇來源資料庫的 MySQL 主要版本。

   1. 針對**版本**，在 AWS 區域中選擇您 MySQL 主要版本的預設次要版本。

      在 中 AWS 管理主控台，只有預設次要版本可用。完成匯入後，您即可升級資料庫執行個體。

1. 針對 **IAM 角色**，使用允許 Amazon RDS 存取 Amazon S3 儲存貯體的必要信任政策和許可政策，來建立或選擇 IAM 角色。執行下列動作之一：
   + (建議) 選擇**建立新角色**，然後輸入 **IAM 角色名稱**。使用此選項時，Amazon RDS 會自動為您建立具有信任政策和許可政策的角色。
   + 選擇現有的 IAM 角色。請確定此角色符合 [手動建立 IAM 角色](#MySQL.Procedural.Importing.Enabling.IAM) 中的所有條件。

1. 指定您的資料庫執行個體資訊。如需每項設定的相關資訊，請參閱 [資料庫執行個體的設定](USER_CreateDBInstance.Settings.md)。
**注意**  
請務必配置足夠的儲存體給新的資料庫執行個體，以確保還原操作成功。  
若要自動因應未來增長，請在**其他儲存體組態**底下，選擇**啟用儲存體自動調整**。

1. 視需要選擇其他設定。

1. 選擇 **Create database** (建立資料庫)。

### AWS CLI
<a name="MySQL.Procedural.Importing.CLI"></a>

若要使用 將資料從 Amazon S3 匯入至新的 MySQL 資料庫執行個體 AWS CLI，請使用下列選項執行 [restore-db-instance-from-s3](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-s3.html) 命令。如需每項設定的相關資訊，請參閱 [資料庫執行個體的設定](USER_CreateDBInstance.Settings.md)。

**注意**  
請務必配置足夠的儲存體給新的資料庫執行個體，以確保還原操作成功。  
若要啟用儲存體自動調整並自動因應未來增長，請使用 `--max-allocated-storage` 選項。
+ `--allocated-storage`
+ `--db-instance-identifier`
+ `--db-instance-class`
+ `--engine`
+ `--master-username`
+ `--manage-master-user-password`
+ `--s3-bucket-name`
+ `--s3-ingestion-role-arn`
+ `--s3-prefix`
+ `--source-engine`
+ `--source-engine-version`

**Example**  
針對 Linux、macOS 或 Unix：  

```
 1. aws rds restore-db-instance-from-s3 \
 2.     --allocated-storage 250 \
 3.     --db-instance-identifier my_identifier \
 4.     --db-instance-class db.m5.large \
 5.     --engine mysql \
 6.     --master-username admin \
 7.     --manage-master-user-password \
 8.     --s3-bucket-name amzn-s3-demo-bucket \
 9.     --s3-ingestion-role-arn arn:aws:iam::account-number:role/rolename \
10.     --s3-prefix bucket_prefix \
11.     --source-engine my_sql \
12.     --source-engine-version 8.0.32 \
13.     --max-allocated-storage 1000
```
在 Windows 中：  

```
 1. aws rds restore-db-instance-from-s3 ^
 2.     --allocated-storage 250 ^
 3.     --db-instance-identifier my_identifier ^
 4.     --db-instance-class db.m5.large ^
 5.     --engine mysql ^
 6.     --master-username admin ^
 7.     --manage-master-user-password ^
 8.     --s3-bucket-name amzn-s3-demo-bucket ^
 9.     --s3-ingestion-role-arn arn:aws:iam::account-number:role/rolename ^
10.     --s3-prefix bucket_prefix ^
11.     --source-engine mysql ^
12.     --source-engine-version 8.0.32 ^
13.     --max-allocated-storage 1000
```

### RDS API
<a name="MySQL.Procedural.Importing.API"></a>

若要使用 Amazon RDS API 從 Amazon S3 將資料匯入新的 MySQL 資料庫執行個體，請呼叫 [RestoreDBInstanceFromS3](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromS3.html) 操作。

## 從 Amazon S3 將備份檔案匯入 Amazon RDS 的限制和考量
<a name="MySQL.Procedural.Importing.Limitations"></a>

將備份檔案從 Amazon S3 匯入至 RDS for MySQL 資料庫執行個體時有下列限制和考量：
+ 您只能將資料遷移至新的資料庫執行個體，而不是現有的資料庫執行個體。
+ 您必須使用 Percona XtraBackup 將資料備份到 Amazon S3。如需詳細資訊，請參閱[建立資料庫備份](#MySQL.Procedural.Importing.Backup)。
+ Amazon S3 儲存貯體與 RDS for MySQL 資料庫執行個體必須位於相同 AWS 區域中。
+ 您無法從下列來源還原：
  + 將資料庫執行個體快照匯出至 Amazon S3。您無法將資料從資料庫執行個體快照遷移至 Amazon S3 儲存貯體。
  + 加密的來源資料庫。不過，您可以加密要遷移的資料。您也可以在遷移過程中維持不加密資料。
  + MySQL 5.5 或 5.6 資料庫。
+ RDS for MySQL 不支援以 Percona Server for MySQL 做為來源資料庫，因為其 `mysql schema` 結構描述中可能包含 `compression_dictionary*` 資料表。
+ RDS for MySQL 不支援主要版本或次要版本的回溯遷移。例如，您無法從 MySQL 8.0 版遷移至 RDS for MySQL 5.7 版，也無法從 MySQL 8.0.32 版遷移至 RDS for MySQL 8.0.26 版。
+ Amazon RDS 不支援在 db.t2.micro 資料庫執行個體類別上從 Amazon S3 匯入。不過，您可以先還原至不同的資料庫執行個體類別，後續再變更資料庫執行個體類別。如需執行個體類別的詳細資訊，請參閱[ 資料庫執行個體類別的硬體規格](Concepts.DBInstanceClass.Summary.md)。
+ Amazon S3 將上傳至 Amazon S3 儲存貯體的檔案大小限制為 5 TB。如果備份檔案超過 5 TB，您必須將備份檔案分割為較小的檔案。
+ Amazon RDS 將上傳至 Amazon S3 儲存貯體的檔案數量限制為 1 百萬個。如果資料庫的備份資料 (包括所有完整和增量備份) 超過 1 百萬個檔案，請使用 Gzip (.gz)、tar (.tar.gz) 或 Percona xbstream (.xbstream) 檔案將完整和增量備份檔案儲存在 Amazon S3 儲存貯體中。Percona XtraBackup 8.0 只支援壓縮時的 Percona xbstream。
+ 為了提供各資料庫執行個體管理服務，Amazon RDS 在建立資料庫執行個體時，會建立 `rdsadmin` 使用者。由於 `rdsamin` 是 Amazon RDS 中的保留使用者，因此適用下列限制：
  + Amazon RDS 不會匯入使用 `'rdsadmin'@'localhost'` 定義程式的函數、程序、檢視、事件和觸發程序。如需詳細資訊，請參閱[以 'rdsamin'@'localhost' 做為定義程式的預存物件](#MySQL.Procedural.Importing.StoredObjects)及[主要使用者帳戶權限](UsingWithRDS.MasterAccounts.md)。
  + 建立資料庫執行個體時，Amazon RDS 會建立具有最大支援權限的主要使用者。從備份還原時，若指派了任何不支援的權限給要匯入的使用者，Amazon RDS 會自動將其移除。

    若要找出可能受此影響的使用者，請參閱 [具有不支援權限的使用者帳戶](#MySQL.Migrating.ExtMySQL.Prechecks.Users)。若要進一步了解 RDS for MySQL 中支援的權限，請參閱 [RDS for MySQL 的角色型權限模型](Appendix.MySQL.CommonDBATasks.privilege-model.md)。
+ Amazon RDS 不會遷移 `mysql` 結構描述中由使用者建立的資料表。
+ `innodb_data_file_path` 參數必須以一個使用預設資料檔案名稱 `ibdata1:12M:autoextend` 的資料檔案來設定。您可以使用此方法，移轉含有兩個資料檔案 (或一個具有不同名稱的資料檔案) 的資料庫。

  下列範例是 Amazon RDS 不允許的檔案名稱：
  + `innodb_data_file_path=ibdata1:50M`
  + `ibdata2:50M:autoextend`
  + `innodb_data_file_path=ibdata01:50M:autoextend`
+ 如果來源資料庫有資料表是在預設 MySQL 資料目錄外定義，您無法從這個來源資料庫遷移。
+ 使用此方法可支援的最大未壓縮備份大小限制為 64 TiB。對於壓縮備份，此限制會降低以考量未壓縮空間需求。在這種情況下，支援的最大備份大小為 `64 TiB - compressed backup size`。

  如需 RDS for MySQL 支援的資料庫大小上限的詳細資訊，請參閱 [一般用途 SSD 儲存體](CHAP_Storage.md#Concepts.Storage.GeneralSSD) 和 [佈建 IOPS SSD 儲存體](CHAP_Storage.md#USER_PIOPS)。
+ Amazon RDS 不支援匯入 MySQL 及其他外部元件和外掛程式。
+ Amazon RDS 不會從您的資料庫還原任何項目。建議您從來源 MySQL 系統資料庫儲存資料庫結構描述和下列項目的值，然後在還原的 RDS for MySQL 資料庫執行個體建立後，將這些項目新增至其中：
  + 使用者帳戶
  + 函數
  + 預存程序
  + 時區資訊。時區資訊會從 RDS for MySQL 資料庫執行個體的本機作業系統載入。如需詳細資訊，請參閱[MySQL 資料庫執行個體的本機時區](MySQL.Concepts.LocalTimeZone.md)。

### 以 'rdsamin'@'localhost' 做為定義程式的預存物件
<a name="MySQL.Procedural.Importing.StoredObjects"></a>

Amazon RDS 不會匯入以 `'rdsadmin'@'localhost'` 做為定義程式的函數、程序、檢視、事件和觸發程序。

您可以在來源 MySQL 資料庫上使用以下 SQL 指令碼列出具有不支援 DEFINER 的預存物件。

```
-- This SQL query lists routines with `rdsadmin`@`localhost` as the definer.

SELECT
    ROUTINE_SCHEMA,
    ROUTINE_NAME
FROM
    information_schema.routines
WHERE
    definer = 'rdsadmin@localhost';

-- This SQL query lists triggers with `rdsadmin`@`localhost` as the definer.

SELECT
    TRIGGER_SCHEMA,
    TRIGGER_NAME,
    DEFINER
FROM
    information_schema.triggers
WHERE
    DEFINER = 'rdsadmin@localhost';

-- This SQL query lists events with `rdsadmin`@`localhost` as the definer.

SELECT
    EVENT_SCHEMA,
    EVENT_NAME
FROM
    information_schema.events
WHERE
    DEFINER = 'rdsadmin@localhost';

-- This SQL query lists views with `rdsadmin`@`localhost` as the definer.
SELECT
    TABLE_SCHEMA,
    TABLE_NAME
FROM
    information_schema.views
WHERE
    DEFINER = 'rdsadmin@localhost';
```

### 具有不支援權限的使用者帳戶
<a name="MySQL.Migrating.ExtMySQL.Prechecks.Users"></a>

使用者帳戶若具有 RDS for MySQL 不支援的權限，在匯出時將會排除不受支援的權限。如需支援的權限清單，請參閱 [RDS for MySQL 的角色型權限模型](Appendix.MySQL.CommonDBATasks.privilege-model.md)。

您可以在來源資料庫上執行下列 SQL 查詢，以列出具有不支援權限的使用者帳戶。

```
SELECT
    user,
    host
FROM
    mysql.user
WHERE
    Shutdown_priv = 'y'
    OR File_priv = 'y'
    OR Super_priv = 'y'
    OR Create_tablespace_priv = 'y';
```

# 從外部 MySQL 資料庫將資料匯入至 Amazon RDS for MySQL 資料庫執行個體
<a name="mysql-importing-data-external-database"></a>

您可將資料從現有的 MySQL 資料庫匯入至 RDS for MySQL 資料庫執行個體。方法是以 [mysqldump](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html) 命令複製資料庫，然後直接傳輸到 RDS for MySQL 資料庫執行個體。`mysqldump` 命令列公用程式普遍用於製作備份，以及將資料從 MySQL 伺服器傳輸至另一個伺服器。MySQL 用戶端軟體隨附這個程式。

**注意**  
如果您要使用 MySQL 資料庫執行個體匯入或匯出大量資料，使用 `xtrabackup` 備份檔案和 Amazon S3 將資料移入和移出 Amazon RDS，會更加可靠且更快速。如需詳細資訊，請參閱[將備份還原至 Amazon RDS for MySQL 資料庫執行個體](MySQL.Procedural.Importing.md)。

典型的 `mysqldump` 命令會將資料從外部資料庫移入 Amazon RDS 資料庫執行個體，如下列範例所示。將值取代為您自己的資訊。

```
mysqldump -u local_user \
    --databases database_name \
    --single-transaction \
    --compress \
    --order-by-primary  \
    --routines=0 \
    --triggers=0 \
    --events=0 \
    -plocal_password | mysql -u RDS_user \
        --port=port_number \
        --host=host_name \
        -pRDS_password
```

**重要**  
切勿在 `-p` 選項與輸入的密碼間插入空白。  
指定此範例中所顯示提示以外的憑證，作為安全最佳實務。

請確認您了解下列建議和注意事項：
+ 從傾印檔案中排除下列結構描述：
  + `sys`
  + `performance_schema`
  + `information_schema`

  `mysqldump` 公用程式已預設排除這些結構描述。
+ 如需遷移使用者與權限，建議您使用可產生資料控制語言 (DCL) 以重建使用者與權限的工具，例如 [pt-show-grants](https://www.percona.com/doc/percona-toolkit/LATEST/pt-show-grants.html) 公用程式。
+ 若要執行匯入，請確認執行此程序的使用者能夠存取資料庫執行個體。如需詳細資訊，請參閱 [使用安全群組控制存取](Overview.RDSSecurityGroups.md)。

使用的參數如下：
+ `-u local_user` – 用來指定使用者名稱。首次使用此參數時，需在 `--databases` 參數所識別的本機 MySQL 資料庫中指定使用者帳戶名稱。
+ `--databases database_name` – 在您要匯入至 Amazon RDS 的本機 MySQL 執行個體上，指定資料庫名稱。
+ `--single-transaction` – 確保從本機資料庫負載的所有資料均與單一時間點一致。如有其他程序在 `mysqldump` 讀取資料時變更資料，使用此參數有助於維持資料完整性。
+ `--compress` – 在本機資料庫的資料傳送到 Amazon RDS 前先完成壓縮，以減少耗用的網路頻寬。
+ `--order-by-primary` – 以資料的主索引鍵排序各資料表的資料，以減少載入時間。
+ `--routines` – 如果預存程序或函數等常式存在於您要複製的資料庫中，則應使用。將參數設定為 `0`，這會在匯入程序期間排除常式。然後，在 Amazon RDS 資料庫中手動重新建立常式。
+ `--triggers` – 如果觸發程序存在於您要複製的資料庫中，則應使用。將參數設定為 `0`，這會在匯入程序期間排除觸發程序。然後，在 Amazon RDS 資料庫中手動重新建立觸發程序。
+ `--events` – 如果事件存在於您要複製的資料庫中，則應使用。將參數設定為 `0`，這會在匯入程序期間排除事件。然後，在 Amazon RDS 資料庫中手動重新建立事件。
+ `-plocal_password` – 用來指定密碼。首次使用此參數時，請指定您以第一個 `-u` 參數識別的使用者帳戶的密碼。
+ `-u RDS_user` – 用來指定使用者名稱。第二次使用此參數時，需在 `--host` 參數所識別的 MySQL 資料庫執行個體的預設資料庫上，指定使用者帳戶名稱。
+ `--port port_number` – 用於指定 MySQL 資料庫執行個體的連接埠。預設值為 3306，除非您在建立資料庫執行個體時另行變更。
+ `--host host_name` – 用來指定 Amazon RDS 資料庫執行個體端點的網域名稱系統 (DNS) 名稱，例如 。`myinstance.123456789012.us-east-1.rds.amazonaws.com`您可在 Amazon RDS 主控台的資料庫執行個體詳細資訊中找到端點值。
+ `-pRDS_password` – 用來指定密碼。第二次使用此參數時，需指定第二個 `-u` 參數所識別的使用者帳戶密碼。

必須在 Amazon RDS 資料庫中手動建立預存程序、觸發程序、函數或事件。如果您正在複製的資料庫中存有上述物件，則請在執行 `mysqldump` 時排除這些物件。為此，請在 `mysqldump` 命令中包含下列參數：
+ `--routines=0`
+ `--triggers=0`
+ `--events=0`

**範例**

下列範例會將本機主機上的 `world` 範例資料庫複製到 RDS for MySQL 資料庫執行個體。將值取代為您自己的資訊。

針對 Linux、macOS 或 Unix：

```
sudo mysqldump -u local_user \
    --databases world \
    --single-transaction \
    --compress \
    --order-by-primary  \
    --routines=0 \
    --triggers=0 \
    --events=0 \
    -plocal_password | mysql -u rds_user \
        --port=3306 \
        --host=my_instance.123456789012.us-east-1.rds.amazonaws.com \
        -pRDS_password
```

在 Windows 中：

在命令提示字元中執行下列命令，方法是對 Windows 程式功能表中的**命令提示字元**按一下滑鼠右鍵，然後選擇**以系統管理員身分執行**。將值取代為您自己的資訊。

```
mysqldump -u local_user ^
    --databases world ^
    --single-transaction ^
    --compress ^
    --order-by-primary  ^
    --routines=0 ^
    --triggers=0 ^
    --events=0 ^
    -plocal_password | mysql -u RDS_user ^
        --port=3306 ^
        --host=my_instance.123456789012.us-east-1.rds.amazonaws.com ^
        -pRDS_password
```

**注意**  
指定此範例中所顯示提示以外的憑證，作為安全最佳實務。

# 以較短的停機時間將資料匯入至 Amazon RDS for MySQL 資料庫
<a name="mysql-importing-data-reduced-downtime"></a>

某些情況下，您可能需要將資料從支援即時應用程式的外部 MySQL 資料庫匯入至 RDS for MySQL 資料庫執行個體或 RDS for MySQL 多可用區域資料庫叢集。使用下列程序，將對應用程式可用性的影響降至最低。如果您使用的是超大型資料庫，也可使用這個程序。使用此程序，您可以減少經由網路傳輸至 AWS的資料量來降低匯入成本。

此程序中，您需將資料庫資料的複本傳輸至 Amazon EC2 執行個體，並將資料匯入至新的 Amazon RDS 資料庫。接著，將應用程式重新導向 Amazon RDS 資料庫前，請使用複寫功能將 Amazon RDS 資料庫更新至與即時外部執行個體相同的最新狀態。根據二進位日誌座標設定複寫。

**注意**  
如果您想要將資料匯入至 RDS for MySQL 資料庫執行個體，且您的情況允許，建議您使用備份檔案與 Amazon S3 將資料移入和移出 Amazon RDS。如需詳細資訊，請參閱[將備份還原至 Amazon RDS for MySQL 資料庫執行個體](MySQL.Procedural.Importing.md)。

下圖說明如何將外部 MySQL 資料庫匯入至 Amazon RDS 上的 MySQL 資料庫。

![\[工作流程說明如何將外部 MySQL 資料庫匯入至 Amazon RDS 上的 MySQL 資料庫。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_1.png)


## 任務 1：建立現有資料庫的複本
<a name="mysql-importing-data-reduced-downtime-copy-database"></a>

要將大量資料遷移至 RDS for MySQL 資料庫，並將停機時間降至最低，第一步是建立來源資料的複本。

下圖說明如何建立 MySQL 資料庫的備份。

![\[工作流程說明如何建立 MySQL 資料庫的備份。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_2.png)


您可使用 `mysqldump` 公用程式，以 SQL 或分隔符號文字等任一格式建立資料庫備份。建議您在非生產環境中分別測試各種格式，以了解哪種方法能將 `mysqldump` 的執行時間減至最少。

此外也建議您衡量 `mysqldump` 的效能與使用分隔符號文字格式載入所帶來的效益。使用分隔符號文字格式的備份會為每個傾印的資料表分別建立定位鍵分隔文字檔案。您可以使用 `LOAD DATA LOCAL INFILE` 命令平行載入這些檔案，縮短匯入資料庫所需的時間。如需詳細資訊，請參閱「從任何來源程序匯入資料」中的 [步驟 5：載入資料](mysql-importing-data-any-source.md#mysql-importing-data-any-source-load-data)。

開始備份作業前，請確認在要複製到 Amazon RDS 的 MySQL 資料庫上設定複寫選項。複寫選項包括開啟二進位日誌及設定獨一無二的伺服器 ID。設定這些選項後，伺服器會開始記錄資料庫交易，並調整至就緒狀態，以擔任後續程序的來源複寫執行個體。

請確認您了解下列建議和注意事項：
+ 對 `--single-transaction` 使用 `mysqldump` 選項，因為它會傾印資料庫的一致狀態。若要確保有效的傾印檔案，請勿在執行 `mysqldump` 時執行資料定義語言 (DDL) 陳述式。您可以為這些作業排定維護時段。
+ 從傾印檔案中排除下列結構描述：
  + `sys`
  + `performance_schema`
  + `information_schema`

  `mysqldump` 公用程式已預設排除這些結構描述。
+ 如需遷移使用者與權限，建議您使用可產生資料控制語言 (DCL) 以重建使用者與權限的工具，例如 [pt-show-grants](https://www.percona.com/doc/percona-toolkit/LATEST/pt-show-grants.html) 公用程式。

### 設定複寫選項
<a name="mysql-importing-data-reduced-downtime-set-replication-options"></a>

1. 編輯 `my.cnf` 檔案。這個檔案通常位於 `/etc` 底下。

   ```
   sudo vi /etc/my.cnf
   ```

   將 `log_bin` 和 `server_id` 選項新增至 `[mysqld]` 部分。`log_bin` 選項會提供二進位記錄檔的檔案名稱識別符。`server_id` 選項會為來源與複本關係提供伺服器唯一識別碼。

   以下範例顯示 `my.cnf` 檔案更新的 `[mysqld]` 部分：

   ```
   [mysqld]
   log-bin=mysql-bin
   server-id=1
   ```

   如需詳細資訊，請參閱 MySQL 文件中的[設定複寫來源組態](https://dev.mysql.com/doc/refman/8.4/en/replication-howto-masterbaseconfig.html)。

1. 如需使用多可用區域資料庫叢集進行複寫，請將 `ENFORCE_GTID_CONSISTENCY` 和 `GTID_MODE` 參數設為 `ON`。

   ```
   mysql> SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
   ```

   ```
   mysql> SET @@GLOBAL.GTID_MODE = ON;
   ```

   使用資料庫執行個體進行複製時，不需要這些設定。

1. 重新啟動 `mysql` 服務。

   ```
   sudo service mysqld restart
   ```

### 建立現有資料庫的備份複本
<a name="mysql-importing-data-reduced-downtime-create-backup"></a>

1. 您可使用 `mysqldump` 公用程式，以 SQL 或分隔符號文字等任一格式建立資料備份。

   針對 MySQL 8.0.25 和較低版本，請指定 `--master-data=2` 以建立可用來在伺服器之間啟動複寫的備份檔案。針對 MySQL 8.0.26 和更高版本，請指定 `--source-data=2` 以建立可用來在伺服器之間啟動複寫的備份檔案。如需詳細資訊，請參閱 MySQL 文件中的 [mysqldump — 資料庫備份計畫](https://dev.mysql.com/doc/refman/8.4/en/mysqldump.html)。

   如需提升效能並確保資料完整性，請使用 `mysqldump` 的 `--order-by-primary` 和 `--single-transaction` 選項。

   為避免備份中包含 MySQL 系統資料庫，請勿以 `mysqldump` 搭配使用 `--all-databases` 選項。如需詳細資訊，請參閱 MySQL 文件中的[使用 mysqldump 建立資料快照](https://dev.mysql.com/doc/mysql-replication-excerpt/8.0/en/replication-howto-mysqldump.html)。

   如有必要請使用 `chmod`，確保建立備份檔案的目錄可以寫入。
**重要**  
在 Windows 上，以管理員身分執行命令視窗。
   + 若要產生 SQL 輸出，請使用下列命令：

     針對 Linux、macOS 或 Unix：

     ```
     sudo mysqldump \
         --databases database_name \
         --master-data=2  \
         --single-transaction \
         --order-by-primary \
         -r backup.sql \
         -u local_user \
         -ppassword
     ```
**注意**  
指定此範例中所顯示提示以外的憑證，作為安全最佳實務。

     在 Windows 中：

     ```
     mysqldump ^
         --databases database_name ^
         --master-data=2  ^
         --single-transaction ^
         --order-by-primary ^
         -r backup.sql ^
         -u local_user ^
         -ppassword
     ```
**注意**  
指定此範例中所顯示提示以外的憑證，作為安全最佳實務。
   + 若要產生分隔符號文字輸出，請使用下列命令。

     針對 Linux、macOS 或 Unix：

     ```
     sudo mysqldump \
         --tab=target_directory \
         --fields-terminated-by ',' \
         --fields-enclosed-by '"' \
         --lines-terminated-by 0x0d0a \
         database_name \
         --master-data=2 \
         --single-transaction \
         --order-by-primary \
         -ppassword
     ```

     在 Windows 中：

     ```
     mysqldump ^
         --tab=target_directory ^
         --fields-terminated-by "," ^
         --fields-enclosed-by """ ^
         --lines-terminated-by 0x0d0a ^
         database_name ^
         --master-data=2 ^
         --single-transaction ^
         --order-by-primary ^
         -ppassword
     ```
**注意**  
指定此範例中所顯示提示以外的憑證，作為安全最佳實務。  
必須在 Amazon RDS 資料庫中手動建立預存程序、觸發程序、函數或事件。如果您正在複製的資料庫中存有上述物件，則請在執行 `mysqldump` 時排除這些物件。為此，請在 `mysqldump` 命令中包含下列參數：  
`--routines=0`
`--triggers=0`
`--events=0`

     針對 MySQL 8.0.22 和較低版本，當您執行 `mysqldump` 並指定分隔符號文字格式時，會傳回 `CHANGE MASTER TO` 註解。此註解會包含主控端日誌檔案的名稱與位置。針對 MySQL 8.0.23 和更高版本，當您使用分隔符號文字格式執行 `mysqldump` 時，會傳回 `CHANGE REPLICATION SOURCE TO` 註解。此註解會包含來源日誌檔案的名稱與位置。如果外部執行個體是 MySQL 8.0.23 和更高版本，請記下 `MASTER_LOG_FILE` 和 `MASTER_LOG_POS` 的值。設定複寫時您需要這些值。

     MySQL 8.0.22 和較低版本會傳回下列輸出：

     ```
     -- Position to start replication or point-in-time recovery from
     --
     -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000031', MASTER_LOG_POS=107;
     ```

     MySQL 8.0.23 和更高版本會傳回下列輸出：

     ```
     -- Position to start replication or point-in-time recovery from
     --
     -- CHANGE SOURCE TO SOURCE_LOG_FILE='mysql-bin-changelog.000031', SOURCE_LOG_POS=107;
     ```

     針對 MySQL 8.0.22 和較低版本，如果您使用 SQL 格式，您可以在備份檔案的 `CHANGE MASTER TO` 註解中取得主控端日誌檔案的名稱與位置。針對 MySQL 8.0.23 和更高版本，如果您使用 SQL 格式，您可以在備份檔案的 `CHANGE REPLICATION SOURCE TO` 註解中取得來源日誌檔案的名稱與位置。

1. 壓縮複製的資料，以減少複製資料到 Amazon RDS 資料庫所需的網路資源量。請記下備份檔案的大小。決定要建立多大的 Amazon EC2 執行個體時，您需要此資訊。完成後，請使用 GZIP 或您慣用的壓縮公用程式壓縮備份檔。
   + 若要壓縮 SQL 輸出，請使用下列命令：

     ```
     gzip backup.sql
     ```
   + 若要壓縮分隔符號文字輸出，請使用下列命令：

     ```
     tar -zcvf backup.tar.gz target_directory
     ```

## 任務 2：建立 Amazon EC2 執行個體並複製壓縮的資料庫
<a name="mysql-importing-data-reduced-downtime-create-ec2-copy-database"></a>

比起直接在資料庫執行個體間複製未壓縮的資料，將壓縮的資料庫備份檔複製到 Amazon EC2 執行個體，需要的網路資源較少。資料位於 Amazon EC2 後，即可將資料直接複製到 MySQL 資料庫。若要節省網路資源的成本，Amazon EC2 執行個體必須與 AWS 區域 Amazon RDS 資料庫執行個體位於相同的 中。如果 Amazon EC2 執行個體與 Amazon RDS 資料庫位於相同的 AWS 區域 ，也能在匯入期間減少網路延遲。

下圖說明如何將資料庫備份複製到 Amazon EC2 執行個體。

![\[說明如何將資料庫備份複製到 Amazon EC2 執行個體的工作流程。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_3.png)


### 建立 Amazon EC2 執行個體並複製資料
<a name="mysql-importing-data-reduced-downtime-create-ec2"></a>

1. 在您 AWS 區域 計劃建立 Amazon RDS 資料庫的 中，建立虛擬私有雲端 (VPC)、VPC 安全群組和 VPC 子網路。確認 VPC 安全群組的傳入規則會允許您應用程式連線至 AWS所需的 IP 地址。您可以指定 IP 位址範圍 (例如 `203.0.113.0/24`) 或另一個 VPC 安全群組。您可以使用 [Amazon VPC 主控台](https://console.aws.amazon.com/vpc)來建立及管理 VPC、子網路和安全群組。如需詳細資訊，請參閱《Amazon Virtual Private Cloud 使用者指南》**中的 [Amazon VPC 入門](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html#getting-started)。

1. 開啟 [Amazon EC2 主控台](https://console.aws.amazon.com/ec2)，然後選擇 AWS 區域 以同時包含您的 Amazon EC2 執行個體和 Amazon RDS 資料庫。使用您在步驟 1 中建立的 VPC、子網路和安全群組，啟動 Amazon EC2 執行個體。確認您選取的執行個體類型具有足夠的儲存空間，足以供未壓縮的資料庫備份檔使用。如需 Amazon EC2 執行個體的詳細資訊，請參閱《Amazon Elastic Compute Cloud 使用者指南》**中的 [Amazon EC2 入門](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)。

1. 若要從 Amazon EC2 執行個體連線至 Amazon RDS 資料庫，請編輯您的 VPC 安全群組。新增會指定您 EC2 執行個體私有 IP 地址的傳入規則。您可在 EC2 主控台視窗中，從 **Instance** (執行個體) 窗格的 **Details** (詳細資訊) 分頁標籤找到私有 IP 地址。若要編輯 VPC 安全群組並新增傳入規則，請選取 EC2 主控台導覽窗格中的 **Security Groups** (安全群組)，接著選擇您的安全群組，然後新增 MySQL 或 Aurora 的傳入規則，指定 EC2 執行個體的私有 IP 地址。如需了解如何將傳入規則新增至 VPC 安全群組，請參閱《Amazon Virtual Private Cloud 使用者指南》**中的[安全群組規則](https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html)。

1. 將壓縮的資料庫備份檔從本機系統複製到 Amazon EC2 執行個體。如有必要請使用 `chmod`，確認您擁有 Amazon EC2 執行個體的目標目錄寫入許可。您可使用 `scp` 命令或 Secure Shell (SSH) 用戶端來複製檔案。下列命令是範例 `scp` 命令：

   ```
   scp -r -i key pair.pem backup.sql.gz ec2-user@EC2 DNS:/target_directory/backup.sql.gz
   ```
**重要**  
複製敏感資料時，請務必使用安全網路傳輸通訊協定。

1. 使用下列命令連線至您的 Amazon EC2 執行個體，並安裝最新更新與 MySQL 客戶端工具：

   ```
   sudo yum update -y
   sudo yum install mysql -y
   ```

   如需詳細資訊，請參閱《Amazon Elastic Compute Cloud 使用者指南》**中適用於 Linux 執行個體的[連線到您的執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-connect-to-instance-linux)。
**重要**  
此範例會在 Amazon Linux 發行版的 Amazon Machine Image (AMI) 上安裝 MySQL 用戶端。此範例不會在不同的發行版上安裝 MySQL 用戶端，例如 Ubuntu 或 Red Hat Enterprise Linux。如需安裝 MySQL 的資訊，請參閱 MySQL 文件中的[安裝 MySQL](https://dev.mysql.com/doc/refman/8.4/en/installing.html)。

1. 連線到 Amazon EC2 執行個體後，將您的資料庫備份檔解壓縮。下列命令為範例。
   + 若要將 SQL 輸出解壓縮，請使用下列命令：

     ```
     gzip backup.sql.gz -d
     ```
   + 若要將分隔符號文字輸出解壓縮，請使用下列命令：

     ```
     tar xzvf backup.tar.gz
     ```

## 任務 3：建立 MySQL 資料庫，並從 Amazon EC2 執行個體匯入資料
<a name="mysql-importing-data-reduced-downtime-create-database-import-data"></a>

在與您 Amazon EC2 執行個體相同的 AWS 區域 中建立 RDS for MySQL 資料庫執行個體或 RDS for MySQL 多可用區域資料庫叢集後，即可從 Amazon EC2 匯入資料庫備份檔，且速度會比透過網際網路匯入更快。

下圖說明如何將備份從 Amazon EC2 執行個體匯入至 MySQL 資料庫。

![\[工作流程說明如何將備份從 EC2 執行個體匯入至 MySQL 資料庫。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_4.png)


### 建立 MySQL 資料庫並匯入資料
<a name="mysql-importing-data-reduced-downtime-create-database"></a>

1. 判斷需要何種資料庫執行個體類別及多大的儲存空間，才能支援這個 Amazon RDS 資料庫預計的工作負載。在此流程的過程中，決定資料載入程序需要多少空間與處理容量才夠。也請決定處理生產工作負載所需的資源。您可根據來源 MySQL 資料庫的大小與資源加以估計。如需詳細資訊，請參閱[ 資料庫執行個體類別](Concepts.DBInstanceClass.md)。

1. 在包含 Amazon EC2 執行個體 AWS 區域 的 中建立資料庫執行個體或多可用區域資料庫叢集。

   若要建立 RDS for MySQL 多可用區域資料庫叢集，請遵循 [為 Amazon RDS 建立多可用區域資料庫叢集](create-multi-az-db-cluster.md) 中的指示。

   若要建立 RDS for MySQL 資料庫執行個體，請遵循 [建立 Amazon RDS 資料庫執行個體](USER_CreateDBInstance.md) 中的指示，並使用下列指導方針：
   + 指定與您來源資料庫執行個體相容的資料庫引擎版本。
   + 指定與 Amazon EC2 執行個體相同的虛擬私有雲端 (VPC) 和 VPC 安全群組。這種作法可確保您的 Amazon EC2 執行個體與 Amazon RDS 執行個體能在網路上看見彼此。確保您的資料庫執行個體可以公開存取。若要如下一節中說明的方式，以您的來源資料庫設定複寫，必須將資料庫執行個體設為公開存取。
   + 匯入資料庫備份前，請勿設定多個可用區域、備份保留期或僅供讀取複本。匯入完成後，您可以設定生產執行個體的多可用區域和備份保留。

1. 檢視 Amazon RDS 資料庫的預設組態選項。如果資料庫的預設參數群組沒有您想要的組態選項，請尋找其他提供您所需選項的參數群組，或者建立新的參數群組。如需建立參數群組的詳細資訊，請參閱 [Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

1. 以主要使用者身分連線至新的 Amazon RDS 資料庫。建立必要的使用者，以支援需存取資料庫執行個體的管理員、應用程式和服務。Amazon RDS 資料庫的主機名稱是此資料庫執行個體的**端點**值 (不含連接埠號碼)，例如 `mysampledb.123456789012.us-west-2.rds.amazonaws.com`。端點值可在 Amazon RDS 主控台的資料庫詳細資訊中找到。

1. 連線到您的 Amazon EC2 執行個體。如需詳細資訊，請參閱《Amazon Elastic Compute Cloud 使用者指南》**中適用於 Linux 執行個體的[連線到您的執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-connect-to-instance-linux)。

1. 使用 `mysql` 命令，以遠端主機的形式從 Amazon EC2 執行個體連線至 Amazon RDS 資料庫。下列命令為範例：

   ```
   mysql -h host_name -P 3306 -u db_master_user -p
   ```

   *host\$1name* 是 Amazon RDS 資料庫端點。

1. 出現 `mysql` 提示時，請執行 `source` 命令，並傳入資料庫傾印檔案的名稱。此命令會將資料載入至 Amazon RDS 資料庫執行個體。
   + 若為 SQL 格式，請使用下列命令：

     ```
     mysql> source backup.sql;
     ```
   + 若為分隔符號文字格式，請先建立資料庫 (如果它不是您在設定 Amazon RDS 資料庫時建立的預設資料庫)。

     ```
     mysql> create database database_name;
     mysql> use database_name;
     ```

     接著建立資料表。

     ```
     mysql> source table1.sql
     mysql> source table2.sql
     etc...
     ```

     然後匯入資料。

     ```
     mysql> LOAD DATA LOCAL INFILE 'table1.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '0x0d0a';
     mysql> LOAD DATA LOCAL INFILE 'table2.txt' INTO TABLE table2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '0x0d0a';
     etc...
     ```

     若要提升效能，您可透過多個連線平行執行這些操作，如此您的所有資料表就會建立並隨後載入。
**注意**  
在您一開始傾印資料表時，如果有透過 `mysqldump` 使用了任何資料格式設定選項，請確實使用與 `LOAD DATA LOCAL INFILE` 相同的選項，以確保資料檔案內容可順利解譯。

1. 在匯入的資料庫中，對一兩個資料表執行簡單的 `SELECT` 查詢，確認匯入作業執行成功。

如果您不再需要此程序中使用的 Amazon EC2 執行個體，請終止 EC2 執行個體以減少 AWS 資源用量。若要終止 EC2 執行個體，請參閱《Amazon Elastic Compute Cloud 使用者指南》**中的[終止執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#terminating-instances-console)。

## 任務 4：從外部資料庫將資料複寫到新的 Amazon RDS 資料庫
<a name="mysql-importing-data-reduced-downtime-replicate-data"></a>

在複製資料並傳輸至 MySQL 資料庫期間，您的來源資料庫可能就會完成更新。因此，您可以使用複寫功能，讓複製的資料庫保持在與來源資料庫相同的最新狀態。

![\[工作流程說明如何將資料從外部 MySQL 資料庫複寫到 Amazon RDS 上的資料庫。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_5.png)


在 Amazon RDS 資料庫上啟動複寫功能所需的許可有其限制，且不供 Amazon RDS 主要使用者使用。因此，請對您的主要引擎版本使用適當的 Amazon RDS 預存程序：
+ [mysql\$1rds\$1set\$1external\$1master (RDS for MySQL 主要版本 8.0 及更低版本)](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) 
+ [mysql.rds\$1set\$1external\$1source (RDS for MySQL 主要版本 8.4 及更新版本)](mysql-stored-proc-replicating.md#mysql_rds_set_external_source)
+ [mysql.rds\$1set\$1external\$1master\$1gtid](mysql_rds_set_external_master_gtid.md) 用來設定複寫，[mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 用來啟動複寫

### 啟動複寫
<a name="mysql-importing-data-reduced-downtime-start-replication"></a>

在任務 1 中，[當您設定複寫選項時](#mysql-importing-data-reduced-downtime-set-replication-options)，您會開啟二進位記錄，並為來源資料庫設定唯一的伺服器 ID。現在，您可將 Amazon RDS 資料庫設為複本，並將即時資料庫設為來源複寫執行個體。

1. 在 Amazon RDS 主控台中，將託管來源資料庫之伺服器的 IP 位址，新增至 Amazon RDS 資料庫的 VPC 安全群組。如需 VPC 安全群組的詳細資訊，請參閱《Amazon Virtual Private Cloud 使用者指南》**中的[設定安全群組規則](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-security-group-rules.html)。

   您可能還需要設定本機網路，以允許從 Amazon RDS 資料庫的 IP 位址建立連線，使其能與來源執行個體通訊。若要尋找 Amazon RDS 資料庫的 IP 位址，請使用 `host` 命令：

   ```
   host host_name
   ```

   *host\$1name* 是來自 Amazon RDS 資料庫端點的 DNS 名稱，例如 `myinstance.123456789012.us-east-1.rds.amazonaws.com`。您可在 Amazon RDS 主控台的資料庫執行個體詳細資訊中找到端點值。

1. 使用您選擇的用戶端，連線至來源執行個體，然後建立複寫作業所需的使用者。此帳戶只供複寫作業使用，務必限制其存取您的網域，以提升安全性。下列命令為範例：

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```
**注意**  
指定此處所顯示提示以外的憑證，作為安全最佳實務。

1. 若為來源執行個體，請將 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 權限授予複寫使用者。舉例來說，若要將所有資料庫的 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 權限授予您網域中的「`repl_user`」使用者，請發出下列命令：

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

1. 使 Amazon RDS 資料庫成為複本。使用適當的 Amazon RDS 預存程序，以主要使用者身分連線至 Amazon RDS 資料庫，並將來源資料庫識別為來源複寫執行個體：
   + [mysql\$1rds\$1set\$1external\$1master (RDS for MySQL 主要版本 8.0 及更低版本)](mysql-stored-proc-replicating.md#mysql_rds_set_external_master)
   + [mysql.rds\$1set\$1external\$1source (RDS for MySQL 主要版本 8.4 及更新版本)](mysql-stored-proc-replicating.md#mysql_rds_set_external_source)

   如果您有 SQL 格式的備份檔，請使用您在步驟 4 中所確定的主控端日誌檔案名稱和主控端日誌位置。如果您使用的是分隔符號文字格式，請使用您在建立備份檔案時確認的名稱和位置。以下是範例命令：

   **MySQL 8.4 和更高版本**

   ```
   CALL mysql.rds_set_external_source ('myserver.mydomain.com', 3306,
       'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);
   ```

   **MySQL 8.0 和較低版本**

   ```
   CALL mysql.rds_set_external_master ('myserver.mydomain.com', 3306,
       'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);
   ```
**注意**  
指定此處所顯示提示以外的憑證，作為安全最佳實務。

1. 在 Amazon RDS 資料庫上，若要啟動複寫，請執行下列使用 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 預存程序的命令：

   ```
   CALL mysql.rds_start_replication;
   ```

1. 在 Amazon RDS 資料庫上，執行 [SHOW REPLICA STATUS](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html) 命令，以判斷複本是否為來源複寫執行個體的最新狀態。`SHOW REPLICA STATUS` 命令的結果包括 `Seconds_Behind_Master` 欄位。若 `Seconds_Behind_Master` 欄位傳回的值為 0，即表示複本已是來源複寫執行個體的最新狀態。
**注意**  
MySQL 以前的版本使用 `SHOW SLAVE STATUS` 而不是 `SHOW REPLICA STATUS`。如果您使用的 MySQL 是 8.0.23 之前的版本，請使用 `SHOW SLAVE STATUS`。

1. 在 Amazon RDS 資料庫處於最新狀態之後，請開啟自動備份，如此您就可以在需要時還原該資料庫。您可以使用 [Amazon RDS 主控台](https://console.aws.amazon.com/rds/)來開啟或修改 Amazon RDS 資料庫的自動備份。如需詳細資訊，請參閱[備份簡介](USER_WorkingWithAutomatedBackups.md)。

## 任務 5：將即時應用程式重新導向至 Amazon RDS 執行個體
<a name="mysql-importing-data-reduced-downtime-redirect-app"></a>

在 MySQL 資料庫處於來源複寫執行個體的最新狀態之後，現在您可以更新即時應用程式，以使用 Amazon RDS 執行個體。

![\[說明如何停止複寫並將即時應用程式導向至 Amazon RDS 上的資料庫的工作流程。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_6.png)


### 將您的即時應用程式重新導向至 MySQL 資料庫並停止複寫
<a name="mysql-importing-data-reduced-downtime-redirect-app-stop-app"></a>

1. 若要新增 Amazon RDS 資料庫的 VPC 安全群組，請新增託管應用程式之伺服器的 IP 地址。如需有關修改 VPC 安全群組的詳細資訊，請參閱《Amazon Virtual Private Cloud 使用者指南》**中的[設定安全群組規則](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-security-group-rules.html)。

1. 確認 [SHOW REPLICA STATUS](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html) 命令結果中的 `Seconds_Behind_Master` 欄位為 0，這表示複本為來源複寫執行個體的最新狀態。

   ```
   SHOW REPLICA STATUS;
   ```
**注意**  
MySQL 以前的版本使用 `SHOW SLAVE STATUS` 而不是 `SHOW REPLICA STATUS`。如果您使用的 MySQL 是 8.0.23 之前的版本，請使用 `SHOW SLAVE STATUS`。

1. 交易完成時關閉所有與此來源的連線。

1. 更新您的應用程式，以使用 Amazon RDS 資料庫。這裡所謂的更新，通常包括變更連線設定，以識別 Amazon RDS 資料庫的主機名稱和連接埠、要與其連線的使用者帳戶和密碼，以及要使用的資料庫。

1. 連線到資料庫執行個體。

   對至多可用區域資料庫叢集，請連線至寫入器資料庫執行個體。

1. 執行下列使用 [mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) 預存程序的命令，停止 Amazon RDS 執行個體的複寫：

   ```
   CALL mysql.rds_stop_replication;
   ```

1. 在您的 Amazon RDS 資料庫上使用適當的 Amazon RDS 預存程序，將複寫組態重設，讓此執行個體不再識別為複本：
   +  [mysql\$1rds\$1reset\$1external\$1master (RDS for MySQL 主要版本 8.0 和較低版本)](mysql-stored-proc-replicating.md#mysql_rds_reset_external_master) 
   + [mysql.rds\$1reset\$1external\$1source (RDS for MySQL 主要版本 8.4 及更新版本)](mysql-stored-proc-replicating.md#mysql_rds_reset_external_source)

   **MySQL 8.4 和更高版本**

   ```
   CALL mysql.rds_reset_external_source;
   ```

   **MySQL 8.0 和較低版本**

   ```
   CALL mysql.rds_reset_external_master;
   ```

1. 開啟其他 Amazon RDS 功能，例如多可用區域支援和僅供讀取複本。如需詳細資訊，請參閱[設定及管理 Amazon RDS 的多可用區域部署](Concepts.MultiAZ.md)及[使用資料庫執行個體僅供讀取複本](USER_ReadRepl.md)。

# 匯入任何 Amazon RDS for MySQL 資料庫執行個體來源的資料
<a name="mysql-importing-data-any-source"></a>

使用 Amazon RDS，您可以將現有的 MySQL 資料從任何來源遷移至 RDS for MySQL 資料庫執行個體。您可以將資料從內部部署資料庫、其他雲端提供者或現有的 RDS for MySQL 資料庫執行個體傳輸到目標 RDS for MySQL 資料庫執行個體。透過此功能，您可以合併資料庫、實作災難復原解決方案，或是從自我管理的資料庫轉換。常見案例包括從自我託管 MySQL 伺服器移至完全受管的 Amazon RDS 資料庫執行個體、將多個 MySQL 資料庫合併為單一資料庫執行個體，或使用生產資料建立測試環境。以下各節提供使用 `mysqldump`、備份檔案或複寫等方法來匯入 MySQL 資料的逐步說明。

## 步驟 1：建立一般檔案，其中需包含要載入的資料
<a name="mysql-importing-data-any-source-create-flat-files"></a>

使用逗號分隔值 (CSV) 等通用格式存放要載入的資料。每個資料表必須擁有各自的檔案 - 您無法將不同資料表的資料結合為同一檔案。以對應資料表的相同名稱命名各個檔案。副檔名可隨意指定。例如，如果資料表名稱為 `sales`，則檔案名稱可以是 `sales.csv` 或 `sales.txt`。

可以的話，依照預計載入之資料表的主索引鍵排序資料。這樣可以大幅縮短載入時間，並將磁碟儲存空間需求降至最低。

檔案越小，此程序的速度就會越快，效率越高。如有個別檔案未壓縮前的大小大於 1 GiB，請將檔案分割成多個檔案，再分別載入。

在泛 Unix 系統 (包括 Linux) 上，使用 `split` 命令。舉例來說，下列命令會將 `sales.csv` 檔案分割成多個小於 1 GiB 的檔案，且只會於分行處分割 (-C 1024m)。新檔案的名稱包含遞增數值尾碼。下列命令會產生具有 `sales.part_00` 和 `sales.part_01` 等名稱的檔案。

```
split -C 1024m -d sales.csv sales.part_ 
```

其他作業系統也有類似的公用程式可用。

您可以將一般檔案存放在任何位置。不過，當您在[步驟 5](#mysql-importing-data-any-source-load-data) 中載入資料時，您必須從檔案所在的相同位置叫用 `mysql` Shell，或使用您在執行 `LOAD DATA LOCAL INFILE` 時的檔案絕對路徑。

## 步驟 2：禁止任何應用程式存取目標資料庫執行個體
<a name="mysql-importing-data-any-source-stop-apps"></a>

開始載入大量資料前，請先禁止所有應用程式活動存取您預計要載入資料的目標資料庫執行個體。如果有其他工作階段會修改要載入或參考的資料表，我們尤其建議執行這項操作。這麼做可以降低載入期間違反限制條件的風險，並提升載入效能。此外，還可以將資料庫執行個體還原至載入前的時間點，以免遺失非載入作業程序所做的變更。

當然，這可能無法盡如人願，或可能不切實際。如果您無法在載入作業前停止應用程式存取資料庫執行個體，請採取因應措施，確保資料的可用性與完整性。所需的確切步驟會因特定使用案例與現場需求而異。

## 步驟 3：建立資料庫快照
<a name="mysql-importing-data-any-source-create-snapshot"></a>

如果您預計要載入資料的新資料庫執行個體內沒有資料，您可略過此步驟。否則，建議您在資料載入前後，都要建立目標 Amazon RDS 資料庫執行個體的資料庫快照。Amazon RDS 資料庫快照是您資料庫執行個體的完整備份，可用來將您的資料庫執行個體還原至已知狀態。啟動資料庫快照作業時，資料庫執行個體的輸入/輸出操作會在資料庫備份時暫停。

若在載入前先建立資料庫快照，一旦有需要，就能將資料庫還原至載入前的狀態。若能在載入後立即拍攝資料庫快照，萬一發生事故，就不必重新載入資料。您也可以在載入後使用資料庫快照將資料匯入新的資料庫執行個體中。

下列範例會執行 AWS CLI [create-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-snapshot.html) 命令來建立`AcmeRDS`執行個體的資料庫快照，並為資料庫快照提供識別符 `"preload"`。

針對 Linux、macOS 或 Unix：

```
aws rds create-db-snapshot \
    --db-instance-identifier AcmeRDS \
    --db-snapshot-identifier preload
```

在 Windows 中：

```
aws rds create-db-snapshot ^
    --db-instance-identifier AcmeRDS ^
    --db-snapshot-identifier preload
```

您也可以使用從資料庫快照還原的功能，建立試轉用的測試資料庫執行個體，或復原載入期間所做的變更。

請注意，如從資料庫快照還原資料庫，系統會建立新的資料庫執行個體，且如同所有資料庫執行個體一樣，該執行個體會具備獨一無二的識別碼與端點。若要還原資料庫執行個體，且不會變更端點，請先刪除資料庫執行個體，如此才能重新使用端點。

舉例來說，若要建立試轉或其他測試所需的資料庫執行個體，您必須賦予資料庫執行個體專屬識別符。在此例中，識別符是 `AcmeRDS-2`。範例使用與 `AcmeRDS-2` 關聯的端點連線至資料庫執行個體。如需詳細資訊，請參閱 [restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html)。

對於 Linux、macOS 或 Unix：

```
aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier AcmeRDS-2 \
    --db-snapshot-identifier preload
```

在 Windows 中：

```
aws rds restore-db-instance-from-db-snapshot ^
    --db-instance-identifier AcmeRDS-2 ^
    --db-snapshot-identifier preload
```

若要重新使用現有端點，請先刪除資料庫執行個體，然後指定相同的識別碼給還原的資料庫。如需詳細資訊，請參閱 [delete-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-db-instance.html)。

下列範例也會在刪除資料庫執行個體前擷取其最終資料庫快照。此為選用操作，但建議您採用。

對於 Linux、macOS 或 Unix：

```
aws rds delete-db-instance \
    --db-instance-identifier AcmeRDS \
    --final-db-snapshot-identifier AcmeRDS-Final

aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier AcmeRDS \
    --db-snapshot-identifier preload
```

在 Windows 中：

```
aws rds delete-db-instance ^
    --db-instance-identifier AcmeRDS ^
    --final-db-snapshot-identifier AcmeRDS-Final

aws rds restore-db-instance-from-db-snapshot ^
    --db-instance-identifier AcmeRDS ^
    --db-snapshot-identifier preload
```

## 步驟 4 (選用)：關閉 Amazon RDS 自動備份
<a name="mysql-importing-data-any-source-turn-off-automated-backups"></a>

**警告**  
如果您需要執行時間點復原，請勿關閉自動備份。

關閉自動備份可產生最佳化效能，但並非資料載入作業的必要功能。關閉自動備份會清除所有現有的備份。因此，在您關閉自動備份後，就無法執行時間點復原。關閉自動備份不會影響手動資料庫快照。所有現有手動資料庫快照仍可用於復原作業。

關閉自動備份功能可將載入時間減少約 25%，並可降低載入期間所需的儲存空間。如果您預計載入資料的新資料庫執行個體不含任何資料，則要加快載入速度，並避免備份產生額外的儲存空間需求，關閉備份功能是最簡單的方式。不過，在某些情況下，您可能會計劃載入已包含資料的資料庫執行個體。如果是這樣，請權衡關閉備份功能的好處，以及無法執行時間點復原功能的影響。

預設情況下，資料庫執行個體會開啟自動備份功能 (保留期為 1 天)。若要關閉自動備份，請將備份保留期設為零。載入後，您可以將備份保留期設為非零的值，以重新開啟自動備份功能。若要開啟或關閉備份功能，Amazon RDS 會關閉資料庫執行個體，然後重新啟動，以便開啟或關閉 MySQL 記錄功能。

執行 AWS CLI `modify-db-instance`命令將備份保留期設定為零，並立即套用變更。將保留期設為 0 需要重新啟動資料庫執行個體，請靜待重新啟動作業完成，再繼續操作。如需詳細資訊，請參閱 [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html)。

對於 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier AcmeRDS \
    --apply-immediately \
    --backup-retention-period 0
```

在 Windows 中：

```
aws rds modify-db-instance ^
    --db-instance-identifier AcmeRDS ^
    --apply-immediately ^
    --backup-retention-period 0
```

您可以使用 AWS CLI [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) 命令來檢查資料庫執行個體的狀態。下列範例顯示 `AcmeRDS` 資料庫執行個體的資料庫執行個體狀態：

```
aws rds describe-db-instances --db-instance-identifier AcmeRDS --query "*[].{DBInstanceStatus:DBInstanceStatus}"
```

當資料庫執行個體狀態為 `available` 時，您即可繼續進行下一個步驟。

## 步驟 5：載入資料
<a name="mysql-importing-data-any-source-load-data"></a>

若要將資料列從一般檔案讀取至資料庫資料表，請使用 MySQL `LOAD DATA LOCAL INFILE` 陳述式。

**注意**  
您必須從一般檔案所在的相同位置叫用 `mysql` Shell，或使用您在執行 `LOAD DATA LOCAL INFILE` 時的檔案絕對路徑。

下列範例說明如何從名為 `sales.txt` 的檔案將資料載入至資料庫中名為 `Sales` 的資料表：

```
mysql> LOAD DATA LOCAL INFILE 'sales.txt' INTO TABLE Sales FIELDS TERMINATED BY ' ' ENCLOSED BY '' ESCAPED BY '\\';
Query OK, 1 row affected (0.01 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0
```

如需 `LOAD DATA` 陳述式的詳細資訊，請參閱 MySQL 文件中的 [LOAD DATA 陳述式](https://dev.mysql.com/doc/refman/8.4/en/load-data.html)。

## 步驟 6：重新開啟 Amazon RDS 自動備份
<a name="mysql-importing-data-any-source-turn-on-automated-backups"></a>

如果您在[步驟 4](#mysql-importing-data-any-source-turn-off-automated-backups) 關閉了 Amazon RDS 自動備份，在載入完成後，您可以將備份保留期間設回載入前的值，以重新開啟 Amazon RDS 自動備份。如步驟 4 所述，Amazon RDS 會重新啟動資料庫執行個體，所以短暫停機是正常現象。

下列範例會執行 AWS CLI [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) `AcmeRDS` 命令，以開啟資料庫執行個體的自動備份，並將保留期間設定為一天：

針對 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier AcmeRDS \
    --backup-retention-period 1 \
    --apply-immediately
```

在 Windows 中：

```
aws rds modify-db-instance ^
    --db-instance-identifier AcmeRDS ^
    --backup-retention-period 1 ^
    --apply-immediately
```