減少將資料匯入 Amazon RDS for MariaDB 資料庫執行個體時的停機時間
某些情況下,您可能需要將資料從支援即時應用程式的外部 MariaDB 資料庫,匯入 RDS for MariaDB 資料庫執行個體。使用下列程序,將對應用程式可用性的影響降至最低。如果您使用的是超大型資料庫,也可使用這個程序。使用此程序,您可以減少經由網路傳輸至 AWS 的資料量來降低匯入成本。
此程序中,您需將資料庫資料的複本傳輸至 Amazon EC2 執行個體,並將資料匯入至新的 Amazon RDS 資料庫。接著,將應用程式重新導向 Amazon RDS 資料庫前,請使用複寫功能將 Amazon RDS 資料庫更新至與即時外部執行個體相同的最新狀態。如果外部執行個體版本是 MariaDB 10.0.24 或更高版本,且目標執行個體為 RDS for MariaDB 時,請根據全域交易識別符 (GTID) 來設定 MariaDB 複寫。若為其他情況,請根據二進位日誌座標設定複寫。建議 GTID 型複寫 (如果您的外部資料庫可以支援它),因為 GTID 型複寫是更可信賴的方法。如需詳細資訊,請參閱 MariaDB 文件中的 Global transaction ID
下圖顯示將外部 MariaDB 資料庫匯入 Amazon RDS 上的 MariaDB 資料庫。
任務 1:建立現有資料庫的複本
要將大量資料遷移至 RDS for MariaDB 資料庫,並將停機時間降至最低,第一步是建立來源資料的複本。
下圖顯示建立 MariaDB 資料庫的備份。
您可使用 mysqldump 或 mariadb-dump 公用程式,以 SQL 或分隔符號文字等任一格式建立資料庫備份。在 MariaDB 10.5 中,用戶端稱為 mariadb-dumpmariadb-dump 而非 mysqldump。建議您在非生產環境中分別測試各種格式,以了解哪種方法能將 mysqldump 或 mariadb-dump 的執行時間減至最少。
亦建議您衡量 mysqldump 或 mariadb-dump 的效能與使用分隔符號文字格式載入所帶來的效益。使用分隔符號文字格式的備份會為每個傾印的資料表分別建立索引標籤分隔文字檔案。您可以使用 LOAD DATA LOCAL INFILE 命令平行載入這些檔案,縮短匯入資料庫所需的時間。如需詳細資訊,請參閱《從任何來源程序匯入資料》中的 步驟 5:載入資料。
開始備份作業前,請確認在要複製到 Amazon RDS 的 MariaDB 資料庫上設定複寫選項。複寫選項包括開啟二進位日誌及設定獨一無二的伺服器 ID。設定這些選項後,伺服器會開始記錄資料庫交易,並調整至就緒狀態,以擔任後續程序的來源複寫執行個體。
請確認您了解下列建議和注意事項:
-
對
mysqldump或mariadb-dump使用--single-transaction選項,因為它會傾印資料庫的一致狀態。若要確保有效的傾印檔案,請勿在執行mysqldump或mariadb-dump時執行資料定義語言 (DDL) 陳述式。您可以為這些作業排定維護時段。 -
從傾印檔案中排除下列結構描述:
-
sys -
performance_schema -
information_schema
mysqldump或mariadb-dump公用程式預設已排除這些結構描述。 -
-
如需遷移使用者與權限,建議您使用可產生資料控制語言 (DCL) 以重建使用者與權限的工具,例如 pt-show-grants
公用程式。
設定複寫選項
-
編輯
my.cnf檔案。這個檔案通常位於/etc底下。sudo vi /etc/my.cnf將
log_bin和server_id選項新增至[mysqld]部分。log_bin選項會提供二進位記錄檔的檔案名稱識別符。server_id選項會為來源與複本關係提供伺服器唯一識別碼。以下範例顯示
my.cnf檔案的[mariadb]部分的更新結果。[mariadb] log-bin server-id=1 log-basename=master1 binlog-format=mixed如需詳細資訊,請參閱 MariaDB 說明文件中的 Setting the Replication Master Configuration
一節。 -
若要使用多可用區域資料庫叢集進行複寫,請啟用
gtid_strict_mode。如需詳細資訊,請參閱 MariaDB 文件中的 gtid_strict_mode。 使用資料庫執行個體複寫不需要啟用
gtid_strict_mode。 -
重新啟動
mariadb服務。sudo service mariadb restart
建立現有資料庫的備份複本
-
您可使用
mysqldump或mariadb-dump公用程式,以 SQL 或分隔符號文字等任一格式建立資料備份。如需提升效能並確保資料完整性,請使用
mysqldump和mariadb-dump的--order-by-primary和--single-transaction選項。為避免備份中包含 MySQL 系統資料庫,請勿以
mysqldump或mariadb-dump搭配使用--all-databases選項。如需詳細資訊,請參閱 MySQL 文件中的使用 mysqldump 建立資料快照。 如有必要,請使用
chmod,確保建立備份檔的目錄可以寫入。重要
在 Windows 上,以管理員身分執行命令視窗。
-
若要產生 SQL 輸出,請使用下列命令。對於 MariaDB 10.11 及更低版本,請將
mariadb-dump取代為mysqldump。在 Linux、macOS 或 Unix 中:
sudo mariadb-dump \ --databasesdatabase_name\ --master-data=2 \ --single-transaction \ --order-by-primary \ -r backup.sql \ -ulocal_user\ -ppassword注意
指定此範例中所顯示提示以外的憑證,作為安全最佳實務。
在 Windows 中:
mariadb-dump ^ --databasesdatabase_name^ --master-data=2 ^ --single-transaction ^ --order-by-primary ^ -r backup.sql ^ -ulocal_user^ -ppassword注意
指定此範例中所顯示提示以外的憑證,作為安全最佳實務。
-
若要產生分隔文字輸出,請使用下列命令。對於 MariaDB 11.01 及更高版本,請將
mysqldump取代為mariadb-dump。在 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或mariadb-dump時排除這些物件。為此,請在mysqldump或mariadb-dump命令中包含以下參數:。-
--routines=0 -
--triggers=0 -
--events=0
當您執行
mysqldump命令並指定使用分隔符號文字格式時,系統會傳回CHANGE MASTER TO註解。此註解會包含主控端日誌檔案的名稱與位置。如果外部執行個體不是 MariaDB 10.0.23 或更舊版本,請注意MASTER_LOG_FILE和MASTER_LOG_POS的值。設定複寫時您需要這些值。MariaDB 版本會傳回下列輸出。
-- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000031', MASTER_LOG_POS=107; -
-
-
如果您正在使用的外部執行個體是 MariaDB 10.0.24 或更新版本,可使用 GTID 型複寫功能。在外部 MariaDB 執行個體上執行
SHOW MASTER STATUS命令,以取得二進位日誌檔案的名稱和位置,接著在外部 MariaDB 執行個體上執行BINLOG_GTID_POS命令,將其轉換為 GTID。SELECT BINLOG_GTID_POS('binary_log_file_name',binary_log_file_position);請記下系統傳回的 GTID。您設定複寫時會需要使用。
-
壓縮複製的資料,以減少複製資料到 Amazon RDS 資料庫所需的網路資源量。請記下備份檔案的大小。決定要建立多大的 Amazon EC2 執行個體時,您需要此資訊。完成後,請使用 GZIP 或您慣用的壓縮公用程式壓縮備份檔。
-
若要壓縮 SQL 輸出,請使用下列命令:
gzip backup.sql -
若要壓縮分隔文字輸出,請使用下列命令:
tar -zcvf backup.tar.gztarget_directory
-
任務 2:建立 Amazon EC2 執行個體並複製壓縮的資料庫
比起直接在資料庫執行個體間複製未壓縮的資料,將壓縮的資料庫備份檔複製到 Amazon EC2 執行個體,需要的網路資源較少。資料放進 Amazon EC2 後,即可將資料直接複製到 MariaDB 資料庫。若要節省網路資源成本,您的 Amazon EC2 執行個體必須與您的 Amazon RDS 資料庫執行個體處於相同的 AWS 區域。如果 Amazon EC2 執行個體與 Amazon RDS 資料庫處於相同的 AWS 區域,也能在匯入期間減少網路延遲。
下圖顯示將資料庫備份複製到 Amazon EC2 執行個體。
建立 Amazon EC2 執行個體並複製資料
-
在您規劃要建立 Amazon RDS 資料庫的 AWS 區域中,建立虛擬私有雲端 (VPC)、VPC 安全群組和 VPC 子網路。確認 VPC 安全群組的傳入規則會允許您應用程式連線至 AWS 所需的 IP 地址。您可以指定 IP 地址範圍 (例如
203.0.113.0/24) 或另一個 VPC 安全群組。您可以使用 Amazon VPC 主控台來建立及管理 VPC、子網路和安全群組。如需詳細資訊,請參閱《Amazon Virtual Private Cloud 使用者指南》中的 Amazon VPC 入門。 -
開啟 Amazon EC2 主控台
,接著選擇要包含 Amazon EC2 執行個體與 Amazon RDS 資料庫的 AWS 區域。使用您在步驟 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 執行個體,並安裝最新更新與 MariaDB 客戶端工具:
sudo yum update -y sudo yum install mariadb1011-client-utils -y如需詳細資訊,請參閱《Amazon Elastic Compute Cloud 使用者指南》中的連線到您的執行個體和 MariaDB 文件中的MariaDB 連接器
。 -
連線到 Amazon EC2 執行個體後,將您的資料庫備份檔解壓縮。下列命令為範例。
-
若要將 SQL 輸出解壓縮,請使用下列命令:
gzip backup.sql.gz -d -
若要將分隔符號文字輸出解壓縮,請使用下列命令:
tar xzvf backup.tar.gz
-
任務 3:建立 MariaDB 資料庫,並從 Amazon EC2 執行個體匯入資料
在與您 Amazon EC2 執行個體相同的 AWS 區域 中建立 RDS for MariaDB 資料庫執行個體,即可從 Amazon EC2 匯入資料庫備份檔,且比起透過網際網路匯入,速度更快。
下圖顯示將備份從 Amazon EC2 執行個體匯入 MariaDB 資料庫。
建立 MariaDB 資料庫並匯入資料
-
判斷需要何種資料庫執行個體類別及多大的儲存空間,才能支援這個 Amazon RDS 資料庫預計的工作負載。在此流程的過程中,決定資料載入程序需要多少空間與處理容量才夠。同時決定處理生產工作負載所需的資源。您可根據來源 MariaDB 資料庫的大小與資源加以估計。如需更多詳細資訊,請參閱 資料庫執行個體類別。
-
在包含 Amazon EC2 執行個體的 AWS 區域 中建立資料庫執行個體。請遵循 建立 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 格式,請使用下列命令:
MariaDB [(none)]> source backup.sql; -
若為分隔符號文字格式,請先建立資料庫 (如果它不是您在設定 Amazon RDS 資料庫時建立的預設資料庫)。
MariaDB [(none)]> create databasedatabase_name; MariaDB [(none)]> usedatabase_name;接著建立資料表。
MariaDB [(none)]> sourcetable1.sql MariaDB [(none)]> sourcetable2.sql etc...然後匯入資料。
MariaDB [(none)]> LOAD DATA LOCAL INFILE 'table1.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '0x0d0a'; MariaDB [(none)]> LOAD DATA LOCAL INFILE 'table2.txt' INTO TABLE table2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '0x0d0a'; etc...若要提升效能,您可透過多個連線平行執行這些操作,如此您的所有資料表就會建立並隨後載入。
注意
在您一開始傾印資料表時,如果有透過
mysqldump或mariadb-dump使用任何資料格式設定選項,請確認LOAD DATA LOCAL INFILE使用相同選項,才能確保資料檔案內容可順利解讀。
-
-
在匯入的資料庫中,對一兩個資料表執行簡單的
SELECT查詢,確認匯入作業執行成功。
若您不再需要此程序所使用的 Amazon EC2 執行個體,請終止 EC2 執行個體,減少 AWS 資源的使用量。若要終止 EC2 執行個體,請參閱《Amazon Elastic Compute Cloud 使用者指南》中的終止執行個體。
任務 4:將資料從外部資料庫複寫到新的 Amazon RDS 資料庫
在複製資料並傳輸至 MariaDB 資料庫期間,您的來源資料庫可能就會完成更新。您可以使用複寫功能,讓複製的資料庫保持在與來源資料庫相同的最新狀態。
在 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'; -
如果您使用 SQL 格式建立備份檔,且外部執行個體並非 MariaDB 10.0.24 或更新版本,請透過執行下列命令來查看該檔案的內容:
cat backup.sql該檔案包括
CHANGE MASTER TO註解,內含主控端日誌檔案的名稱與位置。若您使用--master-data命令的mysqldump選項,備份檔內就會包含這個註解。請注意MASTER_LOG_FILE和MASTER_LOG_POS的值。-- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000031', MASTER_LOG_POS=107;如果您使用分隔符號文字格式來建立備份檔,且外部執行個體並非 MariaDB 10.0.24 或更高版本,您應該已在任務 1 當您建立現有資料庫的備份複本時中的步驟 1 時,就取得二進位日誌座標。
如果外部執行個體是 MariaDB 10.0.24 或更高版本,您應該已在任務 1 當您建立現有資料庫的備份複本時中的步驟 2 時,就取得 GTID,以此啟動複寫作業。
-
使 Amazon RDS 資料庫成為複本。如果外部執行個體並非 MariaDB 10.0.24 或更高版本,請以主要使用者身分連線至 Amazon RDS 資料庫,接著使用 mysql.rds_set_external_master 預存程序找到來源資料庫,將其視為來源複寫執行個體。
如果您有 SQL 格式的備份檔,請使用您在步驟 4 中所確定的主控端日誌檔案名稱和主控端日誌位置。如果您使用的是分隔符號文字格式,請使用您在建立備份檔時確定的名稱和位置。下列命令為範例:
CALL mysql.rds_set_external_master ('myserver.mydomain.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);注意
指定此處所顯示提示以外的憑證,作為安全最佳實務。
如果外部執行個體是 MariaDB 10.0.24 或更高版本,請以主要使用者身分連線至 Amazon RDS 資料庫,接著使用 mysql.rds_set_external_master_gtid 預存程序找到來源資料庫,將其視為來源複寫執行個體。請使用您在任務 1 當您建立現有資料庫的備份副本時中的步驟 2 中確定的 GTID。下列命令為範例:
CALL mysql.rds_set_external_master_gtid ('source_server_ip_address', 3306, 'ReplicationUser', 'password', 'GTID', 1);是來源複寫執行個體的 IP 地址。目前不支援 EC2 私有 DNS 地址。source_server_ip_address注意
指定此處所顯示提示以外的憑證,作為安全最佳實務。
-
在 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,即表示複本已是來源複寫執行個體的最新狀態。若為 MariaDB 10.5、10.6、10.11、11.4 或 11.8 資料庫執行個體,請使用 mysql.rds_replica_status 預存程序,而非執行 MySQL 命令。
-
在 Amazon RDS 資料庫處於最新狀態之後,請開啟自動備份,如此您就可以在需要時還原該資料庫。您可以使用 Amazon RDS 主控台
,開啟或修改 Amazon RDS 資料庫的自動備份。如需更多詳細資訊,請參閱 備份簡介。
任務 5:將您的即時應用程式重新導向至 Amazon RDS 執行個體
在 MariaDB 資料庫處於來源複寫執行個體的最新狀態之後,現在您可以更新即時應用程式,以使用 Amazon RDS 執行個體。
將您的即時應用程式重新導向至 MariaDB 資料庫並停止複寫
-
若要新增 Amazon RDS 資料庫的 VPC 安全群組,請新增託管應用程式之伺服器的 IP 地址。如需有關修改 VPC 安全群組的詳細資訊,請參閱《Amazon Virtual Private Cloud 使用者指南》中的設定安全群組規則。
-
確認 SHOW REPLICA STATUS
命令結果中的 Seconds_Behind_Master欄位為 0,這表示複本與來源複寫執行個體保持同步。SHOW REPLICA STATUS;若為 MariaDB 10.5、10.6、10.11、11.4 或 11.8 資料庫執行個體,請使用 mysql.rds_replica_status 程序,而非執行 MySQL 命令。
-
交易完成時關閉所有與此來源的連線。
-
更新您的應用程式,以使用 Amazon RDS 資料庫。這裡所謂的更新,通常包括變更連線設定,以識別 Amazon RDS 資料庫的主機名稱和連接埠、要與其連線的使用者帳戶和密碼,以及要使用的資料庫。
-
連線到資料庫執行個體。
-
執行下列使用 mysql.rds_stop_replication 預存程序的命令來停止 Amazon RDS 執行個體的複寫:
CALL mysql.rds_stop_replication; -
在您的 Amazon RDS 資料庫上執行下列使用 mysql.rds_reset_external_master 預存程序來重設複寫組態,使得此執行個體不再視為複本。
CALL mysql.rds_reset_external_master; -
開啟其他 Amazon RDS 功能,例如異地同步備份支援和僅供讀取複本。如需詳細資訊,請參閱設定及管理 Amazon RDS 的多可用區域部署及使用資料庫執行個體僅供讀取複本。