如何以最短停機時間加密 MySQL 或 MariaDB 的未加密 Amazon RDS 資料庫執行個體?
我嘗試為 MySQL 或 MariaDB 建立未加密 Amazon Relational Database Service (Amazon RDS) 執行個體的加密讀取複本。但是,我收到錯誤。
簡短描述
Amazon RDS 對加密的資料庫執行個體設定了下列限制:
- 您無法修改現有的未加密 Amazon RDS 資料庫執行個體來加密執行個體。
- 您無法從未加密執行個體建立加密的讀取複本。
因為您無法加密現有的 Amazon RDS 執行個體,所以必須建立新的加密執行個體。否則,在建立未加密 Amazon RDS for MySQL 執行個體的加密讀取複本時,即會收到下列錯誤:
"You cannot create an encrypted Read Replica from an unencrypted DB instance.(Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID:)"
若要加密未加密的資料庫執行個體,以最短的停機時間,請完成下列步驟:
- 加密從未加密資料庫執行個體之讀取複本取得的未加密快照。
- 從加密快照還原新的資料庫執行個體,以部署新的加密資料庫執行個體。
- 使用 MySQL 複寫將來源變更同步至新的加密資料庫執行個體。
- 驗證新的加密資料庫執行個體與來源資料庫執行個體同步。
- 切換您的連線,然後將流量重新導向至新的資料庫執行個體。
解決方法
加密未加密的快照
若要加密您從未加密的讀取複本取得的未加密快照,請完成下列步驟:
-
為來源未加密的 Amazon RDS 資料庫執行個體建立臨時讀取複本。在此範例中,來源未加密的資料庫執行個體稱為 SOURCE-EU,而臨時讀取複本稱為 TEMP-RR。
-
連線至 TEMP-RR 並監控複本延遲,直到 Seconds_Behind_Master 在值為 0 時保持穩定。穩定值表示 TEMP-RR 與 SOURCE-EU 同步。
mysql> SHOW SLAVE STATUS \G Seconds_Behind_Master: 0
-
停止 TEMP-RR 上的複寫程序:
MySQL > call mysql.rds_stop_replication; +---------------------------+ | Message | +---------------------------+ | Slave is down or disabled | +---------------------------+
-
請注意 TEMP-RR 中 Relay_Master_Log_File 和 Exec_Master_Log_Pos 的值:
mysql> SHOW SLAVE STATUS \G Relay_Master_Log_File: mysql-bin-changelog.000012 Exec_Master_Log_Pos: 123
-
在 SOURCE-EU 中,設定 binlog retention hours 參數,以保留完成作業所需時間的二進位日誌。在下列範例中,binlog retention hours 會設定為 24 小時:
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
-
對 TEMP-RR 進行快照。或者,進行快照後刪除 TEMP-RR。
-
複製 TEMP-RR 的快照,然後將啟用加密設為是。
從加密的快照還原新的資料庫執行個體
若要從加密的快照還原新的資料庫執行個體,請完成下列步驟:
- 從開啟加密的已複製快照中,還原新的資料庫執行個體。在此範例中,新的加密資料庫執行個體稱為 NEW-RR-EN。
- 修改 SOURCE-EU 安全群組的傳入規則,以允許來自 NEW-RR-EN 的流量。如果您在兩個資料庫執行個體上使用相同的安全群組,則您可以使用與 SOURCE-EU 相同的安全群組 ID 參照。
**注意:**允許從 NEW-RR-EN 到 SOURCE-EU 的傳出流量。
將來源執行個體的變更同步到新的加密執行個體
若要使用 MySQL 複寫以將來源變更同步到新的加密資料庫執行個體,請完成下列步驟:
- 登入 SOURCE-EU。
- 設定複寫使用者,然後對使用者授予必要許可:
**注意:**將 repl_user 取代為您的複寫使用者名稱,並且將 password123 取代為您的密碼。mysql> create user 'repl_user'@'%' identified by 'password123'; mysql> grant replication slave, replication client on *.* to 'repl_user'@'%'; mysql> show grants for 'repl_user'@'%';
- 連線至 NEW-RR-EN,然後建立 SOURCE-EU 的複寫連線:
**注意:**將 rds-endpoint 取代為 SOURCE-EU 的 資料庫執行個體端點。將 repl_user 和 password123 取代為您建立的使用者名稱和密碼。使用 Relay_Master_Log_File 和 Exec_Master_Log_Pos 值來設定包含 mysql.rds_set_external_master 程序的複寫。如果 SOURCE-EU 為可公開存取,而且 NEW-RR-EN 已設為「私密」,則請使用 SOURCE-EU 的私密 IP 位址,而不是 rds-endpoint。mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );
- 從 NEW-RR-EN 開始複寫:
mysql > CALL mysql.rds_start_replication;
驗證加密執行個體是否與來源執行個體進行同步
若要驗證新的加密資料庫執行個體是否與來源資料庫執行個體進行同步,請完成下列步驟:
-
從 NEW-RR-EN 確認複寫成功,並在 SOURCE-EU 和 NEW-RR-EN 之間完成同步:
mysql> SHOW SLAVE STATUS \G
如果您在來源資料庫執行個體與讀取複本之間的順利連線,則輸出看起來類似於下列內容:
Slave_IO_State: Waiting for master to send eventSeconds Behind master: 0
-
在 Seconds_Behind_Master 為 0 值時保持穩定後,請停止流量並關閉 SOURCE-EU 上的連線。
注意: 停止所有連線至 SOURCE-EU 的應用程式伺服器和用戶端,以確定 SOURCE-EU 沒有新的變更。或者,您可以暫時鎖定 SOURCE-EU 使用的安全群組。您必須防止來自任何應用程式或用戶端的傳入流量,NEW-RR-EN 和使用者執行這些動作時的主機除外。
切換您的連線,然後將流量重新導向至新的資料庫執行個體
若要切換連線並將流量重新導向至新的資料庫執行個體,請完成下列步驟:
-
身為資料庫的主要使用者,請連線至 NEW-RR-EN,然後停止複寫:
MySQL > call mysql.rds_stop_replication;
**重要事項:**執行此命令後,NEW-RR-EN 再也不會複寫 SOURCE-EU 的資料。
-
若要將 NEW-RR-EN 升級至獨立伺服器,請停止 SOURCE-EU 和 NEW-RR-EN 之間的複寫關係:
MySQL > call mysql.rds_reset_external_master;
-
若要將所有應用程式、用戶端及資料庫連線指向至 NEW-RR-EN,請在所有連線字串中指定 NEW-RR-EN DNS 端點。或者,重新命名 SOURCE-EU,然後修改 NEW-RR-EN,以使用 SOURCE-EU 所用的相同名稱。
-
確認 NEW-RR-EN 上的安全群組規則允許來自適當應用程式和用戶端的傳入流量。
-
刪除 SOURCE-EU。
**注意:**在正式作業環境中套用此作業之前,最佳實務是對測試執行個體測試此作業
相關資訊
在 MySQL 網站上對複寫進行疑難排解
相關內容
- 已提問 10 個月前lg...
- 已提問 1 年前lg...
- 已提問 14 天前lg...
- 已提問 19 天前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前