本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
以較短的停機時間將資料匯入至 Amazon RDS for MySQL 資料庫
某些情況下,您可能需要將資料從支援即時應用程式的外部 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 資料庫匯入至 Amazon RDS 上的 MySQL 資料庫。
任務 1:建立現有資料庫的複本
要將大量資料遷移至 RDS for MySQL 資料庫,並將停機時間降至最低,第一步是建立來源資料的複本。
下圖說明如何建立 MySQL 資料庫的備份。
您可使用 mysqldump 公用程式,以 SQL 或分隔符號文字等任一格式建立資料庫備份。建議您在非生產環境中分別測試各種格式,以了解哪種方法能將 mysqldump 的執行時間減至最少。
此外也建議您衡量 mysqldump 的效能與使用分隔符號文字格式載入所帶來的效益。使用分隔符號文字格式的備份會為每個傾印的資料表分別建立定位鍵分隔文字檔案。您可以使用 LOAD DATA LOCAL INFILE 命令平行載入這些檔案,縮短匯入資料庫所需的時間。如需詳細資訊,請參閱「從任何來源程序匯入資料」中的 步驟 5:載入資料。
開始備份作業前,請確認在要複製到 Amazon RDS 的 MySQL 資料庫上設定複寫選項。複寫選項包括開啟二進位日誌及設定獨一無二的伺服器 ID。設定這些選項後,伺服器會開始記錄資料庫交易,並調整至就緒狀態,以擔任後續程序的來源複寫執行個體。
請確認您了解下列建議和注意事項:
-
對
--single-transaction使用mysqldump選項,因為它會傾印資料庫的一致狀態。若要確保有效的傾印檔案,請勿在執行mysqldump時執行資料定義語言 (DDL) 陳述式。您可以為這些作業排定維護時段。 -
從傾印檔案中排除下列結構描述:
-
sys -
performance_schema -
information_schema
mysqldump公用程式已預設排除這些結構描述。 -
-
如需遷移使用者與權限,建議您使用可產生資料控制語言 (DCL) 以重建使用者與權限的工具,例如 pt-show-grants
公用程式。
設定複寫選項
-
編輯
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 文件中的設定複寫來源組態
。 -
如需使用多可用區域資料庫叢集進行複寫,請將
ENFORCE_GTID_CONSISTENCY和GTID_MODE參數設為ON。mysql> SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;mysql> SET @@GLOBAL.GTID_MODE = ON;使用資料庫執行個體進行複製時,不需要這些設定。
-
重新啟動
mysql服務。sudo service mysqld restart
建立現有資料庫的備份複本
-
您可使用
mysqldump公用程式,以 SQL 或分隔符號文字等任一格式建立資料備份。針對 MySQL 8.0.25 和較低版本,請指定
--master-data=2以建立可用來在伺服器之間啟動複寫的備份檔案。針對 MySQL 8.0.26 和更高版本,請指定--source-data=2以建立可用來在伺服器之間啟動複寫的備份檔案。如需詳細資訊,請參閱 MySQL 文件中的 mysqldump — 資料庫備份計畫。 如需提升效能並確保資料完整性,請使用
mysqldump的--order-by-primary和--single-transaction選項。為避免備份中包含 MySQL 系統資料庫,請勿以
mysqldump搭配使用--all-databases選項。如需詳細資訊,請參閱 MySQL 文件中的使用 mysqldump 建立資料快照。 如有必要,請使用
chmod,確保建立備份檔的目錄可以寫入。重要
在 Windows 上,以管理員身分執行命令視窗。
-
若要產生 SQL 輸出,請使用下列命令:
針對 Linux、macOS 或 Unix:
sudo mysqldump \ --databasesdatabase_name\ --master-data=2 \ --single-transaction \ --order-by-primary \ -r backup.sql \ -ulocal_user\ -ppassword注意
指定此範例中所顯示提示以外的憑證,作為安全最佳實務。
在 Windows 中:
mysqldump ^ --databasesdatabase_name^ --master-data=2 ^ --single-transaction ^ --order-by-primary ^ -r backup.sql ^ -ulocal_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註解中取得來源日誌檔案的名稱與位置。 -
-
-
壓縮複製的資料,以減少複製資料到 Amazon RDS 資料庫所需的網路資源量。請記下備份檔案的大小。決定要建立多大的 Amazon EC2 執行個體時,您需要此資訊。完成後,請使用 GZIP 或您慣用的壓縮公用程式壓縮備份檔。
-
若要壓縮 SQL 輸出,請使用下列命令:
gzip backup.sql -
若要壓縮分隔文字輸出,請使用下列命令:
tar -zcvf backup.tar.gztarget_directory
-
任務 2:建立 Amazon EC2 執行個體並複製壓縮的資料庫
比起直接在資料庫執行個體間複製未壓縮的資料,將壓縮的資料庫備份檔複製到 Amazon EC2 執行個體,需要的網路資源較少。資料位於 Amazon EC2 後,即可將資料直接複製到 MySQL 資料庫。若要節省網路資源的成本,Amazon EC2 執行個體必須與 AWS 區域 Amazon RDS 資料庫執行個體位於相同的 中。如果 Amazon EC2 執行個體與 Amazon RDS 資料庫處於相同的 AWS 區域 ,也能在匯入期間減少網路延遲。
下圖顯示將資料庫備份複製到 Amazon EC2 執行個體。
建立 Amazon EC2 執行個體並複製資料
-
在您 AWS 區域 計劃建立 Amazon RDS 資料庫的 中,建立虛擬私有雲端 (VPC)、VPC 安全群組和 VPC 子網路。確認 VPC 安全群組的傳入規則會允許您應用程式連線至 AWS所需的 IP 地址。您可以指定 IP 地址範圍 (例如
203.0.113.0/24) 或另一個 VPC 安全群組。您可以使用 Amazon VPC 主控台來建立及管理 VPC、子網路和安全群組。如需詳細資訊,請參閱《Amazon Virtual Private Cloud 使用者指南》中的 Amazon VPC 入門。 -
開啟 Amazon EC2 主控台
,然後選擇 AWS 區域 以同時包含您的 Amazon EC2 執行個體和 Amazon RDS 資料庫。使用您在步驟 1 中建立的 VPC、子網路和安全群組,啟動 Amazon EC2 執行個體。確認您選取的執行個體類型具有足夠的儲存空間,足以供未壓縮的資料庫備份檔使用。如需 Amazon EC2 執行個體的詳細資訊,請參閱《Amazon Elastic Compute Cloud 使用者指南》中的 Amazon EC2 入門。 -
若要從 Amazon EC2 執行個體連線至 Amazon RDS 資料庫,請編輯您的 VPC 安全群組。新增會指定您 EC2 執行個體私有 IP 地址的傳入規則。您可在 EC2 主控台視窗中,從 Instance (執行個體) 窗格的 Details (詳細資訊) 分頁標籤找到私有 IP 地址。若要編輯 VPC 安全群組並新增傳入規則,請選取 EC2 主控台導覽窗格中的 Security Groups (安全群組),接著選擇您的安全群組,然後新增 MySQL 或 Aurora 的傳入規則,指定 EC2 執行個體的私有 IP 地址。如需了解如何將傳入規則新增至 VPC 安全群組,請參閱《Amazon Virtual Private Cloud 使用者指南》中的安全群組規則。
-
將壓縮的資料庫備份檔從本機系統複製到 Amazon EC2 執行個體。如有必要,請使用
chmod,確認您擁有 Amazon EC2 執行個體的目標目錄寫入許可。您可使用scp命令或 Secure Shell (SSH) 用戶端來複製檔案。下列命令是範例scp命令:scp -r -ikey pair.pem backup.sql.gz ec2-user@EC2 DNS:/target_directory/backup.sql.gz重要
複製敏感資料時,請務必使用安全網路傳輸通訊協定。
-
使用下列命令連線至您的 Amazon EC2 執行個體,並安裝最新更新與 MySQL 客戶端工具:
sudo yum update -y sudo yum install mysql -y如需詳細資訊,請參閱《Amazon Elastic Compute Cloud 使用者指南》中適用於 Linux 執行個體的連線到您的執行個體。
重要
此範例會在 Amazon Linux 發行版的 Amazon Machine Image (AMI) 上安裝 MySQL 用戶端。此範例不會在不同的發行版上安裝 MySQL 用戶端,例如 Ubuntu 或 Red Hat Enterprise Linux。如需安裝 MySQL 的資訊,請參閱 MySQL 文件中的安裝 MySQL
。 -
連線到 Amazon EC2 執行個體後,將您的資料庫備份檔解壓縮。下列命令為範例。
-
若要將 SQL 輸出解壓縮,請使用下列命令:
gzip backup.sql.gz -d -
若要將分隔符號文字輸出解壓縮,請使用下列命令:
tar xzvf backup.tar.gz
-
任務 3:建立 MySQL 資料庫,並從 Amazon EC2 執行個體匯入資料
在與您 Amazon EC2 執行個體相同的 AWS 區域 中建立 RDS for MySQL 資料庫執行個體或 RDS for MySQL 多可用區域資料庫叢集後,即可從 Amazon EC2 匯入資料庫備份檔,且速度會比透過網際網路匯入更快。
下圖說明如何將備份從 Amazon EC2 執行個體匯入至 MySQL 資料庫。
建立 MySQL 資料庫並匯入資料
-
判斷需要何種資料庫執行個體類別及多大的儲存空間,才能支援這個 Amazon RDS 資料庫預計的工作負載。在此流程的過程中,決定資料載入程序需要多少空間與處理容量才夠。也請決定處理生產工作負載所需的資源。您可根據來源 MySQL 資料庫的大小與資源加以估計。如需詳細資訊,請參閱 資料庫執行個體類別。
-
在包含 Amazon EC2 執行個體 AWS 區域 的 中建立資料庫執行個體或多可用區域資料庫叢集。
若要建立 RDS for MySQL 多可用區域資料庫叢集,請遵循 為 Amazon RDS 建立多可用區域資料庫叢集 中的指示。
若要建立 RDS for MySQL 資料庫執行個體,請遵循 建立 Amazon RDS 資料庫執行個體 中的指示,並使用下列指導方針:
-
指定與您來源資料庫執行個體相容的資料庫引擎版本。
-
指定與 Amazon EC2 執行個體相同的虛擬私有雲端 (VPC) 和 VPC 安全群組。這種作法可確保您的 Amazon EC2 執行個體與 Amazon RDS 執行個體能在網路上看見彼此。確保您的資料庫執行個體可以公開存取。若要如下一節中說明的方式,以您的來源資料庫設定複寫,必須將資料庫執行個體設為公開存取。
-
匯入資料庫備份前,請勿設定多個可用區域、備份保留期或僅供讀取複本。匯入完成後,您可以設定生產執行個體的多可用區域和備份保留。
-
-
檢視 Amazon RDS 資料庫的預設組態選項。如果資料庫的預設參數群組沒有您想要的組態選項,請尋找其他提供您所需選項的參數群組,或者建立新的參數群組。如需建立參數群組的詳細資訊,請參閱 Amazon RDS 的參數群組。
-
以主要使用者身分連線至新的 Amazon RDS 資料庫。建立支援需存取資料庫執行個體的管理員、應用程式和服務所需的使用者。Amazon RDS 資料庫的主機名稱是此資料庫執行個體的端點值 (不含連接埠編號),例如:
mysampledb.123456789012.us-west-2.rds.amazonaws.com。您可在 Amazon RDS 主控台的資料庫詳細資訊中找到端點值。 -
連線到您的 Amazon EC2 執行個體。如需詳細資訊,請參閱《Amazon Elastic Compute Cloud 使用者指南》中適用於 Linux 執行個體的連線到您的執行個體。
-
使用
mysql命令,以遠端主機的形式從 Amazon EC2 執行個體連線至 Amazon RDS 資料庫。下列命令為範例:mysql -hhost_name-P 3306 -udb_master_user-phost_name是 Amazon RDS 資料庫端點。 -
出現
mysql提示時,請執行source命令並傳入資料庫傾印檔案的名稱。此命令會將資料載入 Amazon RDS 資料庫執行個體。-
若為 SQL 格式,請使用下列命令:
mysql> source backup.sql; -
若為分隔符號文字格式,請先建立資料庫 (如果它不是您在設定 Amazon RDS 資料庫時建立的預設資料庫)。
mysql> create databasedatabase_name; mysql> usedatabase_name;接著建立資料表。
mysql> sourcetable1.sql mysql> sourcetable2.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相同的選項,以確保資料檔案內容可順利解譯。
-
-
在匯入的資料庫中,對一兩個資料表執行簡單的
SELECT查詢,確認匯入作業執行成功。
如果您不再需要此程序中使用的 Amazon EC2 執行個體,請終止 EC2 執行個體以減少 AWS 資源用量。若要終止 EC2 執行個體,請參閱《Amazon Elastic Compute Cloud 使用者指南》中的終止執行個體。
任務 4:將資料從外部資料庫複寫到新的 Amazon RDS 資料庫
在複製資料並傳輸至 MySQL 資料庫期間,您的來源資料庫可能就會完成更新。因此,您可以使用複寫功能,讓複製的資料庫保持在與來源資料庫相同的最新狀態。
在 Amazon RDS 資料庫上啟動複寫功能所需的許可有其限制,且不供 Amazon RDS 主要使用者使用。因此,請對您的主要引擎版本使用適當的 Amazon RDS 預存程序:
啟動複寫
在任務 1 中,當您設定複寫選項時,您會開啟二進位記錄,並為來源資料庫設定唯一的伺服器 ID。現在,您可將 Amazon RDS 資料庫設為複本,並將即時資料庫設為來源複寫執行個體。
-
在 Amazon RDS 主控台中,將託管來源資料庫之伺服器的 IP 地址,新增至 Amazon RDS 資料庫的 VPC 安全群組。如需 VPC 安全群組的詳細資訊,請參閱《Amazon Virtual Private Cloud 使用者指南》中的設定安全群組規則。
您可能還需要設定本機網路,以允許從 Amazon RDS 資料庫的 IP 位址建立連線,使其能與來源執行個體通訊。若要尋找 Amazon RDS 資料庫的 IP 位址,請使用
host命令:hosthost_namehost_name是來自 Amazon RDS 資料庫端點的 DNS 名稱,例如myinstance.123456789012.us-east-1.rds.amazonaws.com。您可在 Amazon RDS 主控台的資料庫執行個體詳細資訊中找到端點值。 -
使用您選擇的用戶端,連線至來源執行個體,然後建立複寫作業所需的使用者。此帳戶只供複寫作業使用,務必限制其存取您的網域,以提升安全性。下列命令為範例:
CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';注意
指定此處所顯示提示以外的憑證,作為安全最佳實務。
-
若為來源執行個體,請將
REPLICATION CLIENT和REPLICATION SLAVE權限授予複寫使用者。舉例來說,若要將所有資料庫的REPLICATION CLIENT和REPLICATION SLAVE權限授予您網域中的「repl_user」使用者,請發出下列命令:GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com'; -
使 Amazon RDS 資料庫成為複本。使用適當的 Amazon RDS 預存程序,以主要使用者身分連線至 Amazon RDS 資料庫,並將來源資料庫識別為來源複寫執行個體:
如果您有 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);注意
指定此處所顯示提示以外的憑證,作為安全最佳實務。
-
在 Amazon RDS 資料庫上,若要啟動複寫,請執行下列使用 mysql.rds_start_replication 預存程序的命令:
CALL mysql.rds_start_replication; -
在 Amazon RDS 資料庫上,執行 SHOW REPLICA STATUS
命令,以判斷複本是否為來源複寫執行個體的最新狀態。 SHOW REPLICA STATUS命令的結果包括Seconds_Behind_Master欄位。若Seconds_Behind_Master欄位傳回的值為 0,即表示複本已是來源複寫執行個體的最新狀態。注意
MySQL 以前的版本使用
SHOW SLAVE STATUS而不是SHOW REPLICA STATUS。如果您使用的 MySQL 是 8.0.23 之前的版本,請使用SHOW SLAVE STATUS。 -
在 Amazon RDS 資料庫處於最新狀態之後,請開啟自動備份,如此您就可以在需要時還原該資料庫。您可以使用 Amazon RDS 主控台
來開啟或修改 Amazon RDS 資料庫的自動備份。如需詳細資訊,請參閱備份簡介。
任務 5:將您的即時應用程式重新導向至 Amazon RDS 執行個體
在 MySQL 資料庫處於來源複寫執行個體的最新狀態之後,現在您可以更新即時應用程式,以使用 Amazon RDS 執行個體。
將您的即時應用程式重新導向至 MySQL 資料庫並停止複寫
-
若要新增 Amazon RDS 資料庫的 VPC 安全群組,請新增託管應用程式之伺服器的 IP 地址。如需有關修改 VPC 安全群組的詳細資訊,請參閱《Amazon Virtual Private Cloud 使用者指南》中的設定安全群組規則。
-
確認 SHOW REPLICA STATUS
命令結果中的 Seconds_Behind_Master欄位為 0,這表示複本為來源複寫執行個體的最新狀態。SHOW REPLICA STATUS;注意
MySQL 以前的版本使用
SHOW SLAVE STATUS而不是SHOW REPLICA STATUS。如果您使用的 MySQL 是 8.0.23 之前的版本,請使用SHOW SLAVE STATUS。 -
交易完成時關閉所有與此來源的連線。
-
更新您的應用程式,以使用 Amazon RDS 資料庫。這裡所謂的更新,通常包括變更連線設定,以識別 Amazon RDS 資料庫的主機名稱和連接埠、要與其連線的使用者帳戶和密碼,以及要使用的資料庫。
-
連線到資料庫執行個體。
對至多可用區域資料庫叢集,請連線至寫入器資料庫執行個體。
-
執行下列使用 mysql.rds_stop_replication 預存程序的命令,停止 Amazon RDS 執行個體的複寫:
CALL mysql.rds_stop_replication; -
在您的 Amazon RDS 資料庫上使用適當的 Amazon RDS 預存程序,將複寫組態重設,讓此執行個體不再識別為複本:
MySQL 8.4 和更高版本
CALL mysql.rds_reset_external_source;MySQL 8.0 和較低版本
CALL mysql.rds_reset_external_master; -
開啟其他 Amazon RDS 功能,例如多可用區域支援和僅供讀取複本。如需詳細資訊,請參閱設定及管理 Amazon RDS 的多可用區域部署及使用資料庫執行個體僅供讀取複本。