金鑰環遷移會將金鑰從一個金鑰儲存區複製到另一個金鑰儲存區,讓 DBA 可以將 MySQL 安裝切換到不同的金鑰儲存區。成功的遷移作業會有這個結果
目的地金鑰儲存區包含遷移之前擁有的金鑰,以及來源金鑰儲存區的金鑰。
來源金鑰儲存區在遷移前後保持不變(因為複製的是金鑰,而不是移動)。
如果要複製的金鑰已經存在於目的地金鑰儲存區中,則會發生錯誤,並且目的地金鑰儲存區會還原到遷移前的狀態。
金鑰環使用金鑰環元件和金鑰環外掛程式管理金鑰儲存區。這與遷移策略有關,因為來源和目的地金鑰儲存區的管理方式決定了執行特定類型金鑰遷移的程序
從一個金鑰環外掛程式遷移到另一個金鑰環外掛程式:MySQL 伺服器有一個提供此功能的操作模式。
從金鑰環外掛程式遷移到金鑰環元件:MySQL 伺服器有一個提供此功能的操作模式。
從一個金鑰環元件遷移到另一個金鑰環元件:mysql_migrate_keyring 公用程式提供此功能。
從金鑰環元件遷移到金鑰環外掛程式:MySQL 伺服器有一個提供此功能的操作模式。
以下章節討論離線和線上遷移的特性,並說明如何執行遷移。
金鑰遷移是離線或線上
離線遷移:當您確定本機主機上沒有任何執行中的伺服器正在使用來源或目的地金鑰儲存區時使用。在這種情況下,遷移作業可以將金鑰從來源金鑰儲存區複製到目的地,而不會有執行中的伺服器在作業期間修改金鑰儲存區內容的可能性。
線上遷移:當本機主機上有執行中的伺服器正在使用來源金鑰儲存區時使用。在這種情況下,必須小心防止伺服器在遷移期間更新金鑰儲存區。這涉及連線到執行中的伺服器,並指示其暫停金鑰環作業,以便可以安全地將金鑰從來源金鑰儲存區複製到目的地。金鑰複製完成後,允許執行中的伺服器恢復金鑰環作業。
當您規劃金鑰遷移時,請使用以下幾點來決定應該執行離線或在線遷移
請勿對正在運行的伺服器使用的金鑰儲存執行離線遷移。
在線遷移期間暫停金鑰環操作,是透過連線到正在運行的伺服器,並在複製金鑰之前將其全域
keyring_operations
系統變數設定為OFF
,並在複製金鑰之後設定為ON
來完成。這有幾個含義:keyring_operations
是在 MySQL 5.7.21 中引入的,因此只有在正在運行的伺服器來自 MySQL 5.7.21 或更高版本時,才有可能進行在線遷移。如果正在運行的伺服器版本較舊,則必須停止它、執行離線遷移,然後重新啟動它。其他地方所有提及keyring_operations
的遷移說明均受此條件約束。用於連線到正在運行的伺服器的帳戶必須具有修改
keyring_operations
所需的權限。這些權限是ENCRYPTION_KEY_ADMIN
,以及SYSTEM_VARIABLES_ADMIN
或已棄用的SUPER
權限。如果線上遷移操作異常退出(例如,如果被強行終止),則
keyring_operations
可能會保持在正在運行的伺服器上停用,使其無法執行金鑰環操作。在這種情況下,可能需要連線到正在運行的伺服器並使用此語句手動啟用keyring_operations
SET GLOBAL keyring_operations = ON;
線上金鑰遷移可暫停單個正在運行的伺服器上的金鑰環操作。如果要執行涉及多個正在運行的伺服器使用金鑰儲存的遷移,請使用涉及多個正在運行的伺服器的金鑰遷移中描述的程序。
只有在正在運行的伺服器允許使用 TLS 的 Socket 連線或 TCP/IP 連線時,才支援使用遷移伺服器的在線金鑰遷移;例如,當伺服器在 Windows 平台上運行並且僅允許共享記憶體連線時,則不支援。
如果 MySQL 伺服器以支援金鑰遷移的特殊操作模式調用,則該伺服器將成為遷移伺服器。遷移伺服器不接受用戶端連線。相反,它只運行足夠長的時間來遷移金鑰,然後退出。遷移伺服器會將錯誤報告到主控台(標準錯誤輸出)。
遷移伺服器支援以下遷移類型
從一個金鑰環外掛程式遷移到另一個外掛程式。
從金鑰環外掛程式遷移到金鑰環組件。
從金鑰環組件遷移到金鑰環外掛程式。
遷移伺服器不支援從一個金鑰環組件遷移到另一個組件。對於這種遷移類型,請參閱使用 mysql_migrate_keyring 工具進行金鑰遷移。
要使用遷移伺服器執行金鑰遷移操作,請確定指定所涉及的金鑰環外掛程式或組件所需的金鑰遷移選項,以及遷移是離線還是在線
若要指示來源金鑰環外掛程式和目的地金鑰環外掛程式或組件,請指定以下選項
--keyring-migration-source
:管理要遷移金鑰的來源金鑰環組件或外掛程式。--keyring-migration-destination
:要複製遷移金鑰的目的地金鑰環外掛程式或組件。--keyring-migration-to-component
:如果目的地是金鑰環組件,則必須使用此選項。--keyring-migration-from-component
:如果來源是金鑰環組件,則必須使用此選項。
--keyring-migration-source
和--keyring-migration-destination
選項會向伺服器表示,它應該以金鑰遷移模式執行。對於金鑰遷移操作,這兩個選項都是強制性的。每個外掛程式或組件都使用其程式庫檔案的名稱指定,包括任何平台特定的擴展名,例如.so
或.dll
。來源和目的地必須不同,並且遷移伺服器必須同時支援它們。對於離線遷移,不需要其他金鑰遷移選項。
對於在線遷移,目前有一些正在運行的伺服器正在使用來源或目的地金鑰儲存。要調用遷移伺服器,請指定其他金鑰遷移選項,以指示如何連線到正在運行的伺服器。這是有必要的,以便遷移伺服器可以連線到正在運行的伺服器,並告訴它在遷移操作期間暫停使用金鑰環。
使用以下任何選項都表示在線遷移
--keyring-migration-host
:正在運行的伺服器所在的主機。這始終是本機主機,因為遷移伺服器只能在本地外掛程式和組件管理的金鑰儲存之間遷移金鑰。--keyring-migration-user
、--keyring-migration-password
:用於連線到正在運行的伺服器的帳戶憑證。--keyring-migration-port
:對於 TCP/IP 連線,要連線到正在運行的伺服器的連接埠號碼。--keyring-migration-socket
:對於 Unix Socket 檔案或 Windows 具名管道連線,要連線到正在運行的伺服器的 Socket 檔案或具名管道。
有關金鑰遷移選項的其他詳細資訊,請參閱第 8.4.4.15 節「金鑰環命令選項」。
啟動遷移伺服器,並使用金鑰遷移選項指示來源和目的地金鑰儲存,以及遷移是離線還是在線,可能還需要其他選項。請記住以下幾點
可能需要其他伺服器選項;也可能需要其他非金鑰環選項。指定這些選項的一種方法是使用
--defaults-file
來命名包含所需選項的選項檔案。遷移伺服器期望路徑名稱選項值是完整路徑。相對路徑名稱可能不會按您的預期解析。
除非使用
--user
選項指定一個非root
使用者名稱以該使用者身分運行伺服器,否則以金鑰遷移模式調用伺服器的使用者不得是root
作業系統使用者。以金鑰遷移模式運行的伺服器的使用者必須具有讀取和寫入任何本地金鑰環檔案的權限,例如基於檔案的外掛程式的資料檔案。
如果您從與通常用於運行 MySQL 的系統帳戶不同的系統帳戶調用遷移伺服器,它可能會建立在正常操作期間伺服器無法存取的金鑰環目錄或檔案。假設 mysqld 通常以
mysql
作業系統使用者的身分運行,但您在以isabel
身分登入時調用遷移伺服器。遷移伺服器建立的任何新目錄或檔案都歸isabel
所有。當以mysql
作業系統使用者身分運行的伺服器嘗試存取isabel
擁有的檔案系統物件時,後續啟動將失敗。為避免此問題,請以
root
作業系統使用者的身分啟動遷移伺服器,並提供--user=
選項,其中user_name
user_name
是通常用於運行 MySQL 的系統帳戶。或者,遷移後,請檢查金鑰環相關的檔案系統物件,並使用 chown、chmod 或類似命令來變更其所有權和權限(如果需要),以便正在運行的伺服器可以存取這些物件。
在兩個金鑰環外掛程式之間進行離線遷移的範例命令列(在一行中輸入命令)
mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
--keyring-migration-source=keyring_okv.so
--keyring-migration-destination=keyring_aws.so
在兩個金鑰環外掛程式之間進行在線遷移的範例命令列
mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
--keyring-migration-source=keyring_okv.so
--keyring-migration-destination=keyring_aws.so
--keyring-migration-host=127.0.0.1
--keyring-migration-user=root
--keyring-migration-password=root_password
若要在目的地是金鑰環組件而不是金鑰環外掛程式時執行遷移,請指定 --keyring-migration-to-component
選項,並將組件命名為 --keyring-migration-destination
選項的值。
從金鑰環外掛程式到金鑰環組件進行離線遷移的範例命令列
mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
--keyring-migration-to-component
--keyring-migration-source=keyring_okv.so
--keyring-migration-destination=component_keyring_encrypted_file.so
請注意,在這種情況下,沒有指定 keyring_encrypted_file_password
值。組件資料檔案的密碼列在組件設定檔中。
從金鑰環外掛程式到金鑰環組件進行在線遷移的範例命令列
mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
--keyring-migration-to-component
--keyring-migration-source=keyring_okv.so
--keyring-migration-destination=component_keyring_encrypted_file.so
--keyring-migration-host=127.0.0.1
--keyring-migration-user=root
--keyring-migration-password=root_password
若要在來源是金鑰環組件而不是金鑰環外掛程式時執行遷移,請指定 --keyring-migration-from-component
選項,並將組件命名為 --keyring-migration-source
選項的值。
從金鑰環組件到金鑰環外掛程式進行離線遷移的範例命令列
mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
--keyring-migration-from-component
--keyring-migration-source=component_keyring_file.so
--keyring-migration-destination=keyring_okv.so
--keyring-okv-conf-dir=/usr/local/mysql/mysql-keyring-okv
從金鑰環組件到金鑰環外掛程式進行在線遷移的範例命令列
mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
--keyring-migration-from-component
--keyring-migration-source=component_keyring_file.so
--keyring-migration-destination=keyring_okv.so
--keyring-okv-conf-dir=/usr/local/mysql/mysql-keyring-okv
--keyring-migration-host=127.0.0.1
--keyring-migration-user=root
--keyring-migration-password=root_password
金鑰遷移伺服器按如下方式執行遷移操作
(僅限在線遷移)使用連線選項連線到正在運行的伺服器。
(僅限在線遷移)停用正在運行的伺服器上的
keyring_operations
。載入來源和目的地金鑰儲存的金鑰環外掛程式或組件程式庫。
將金鑰從來源金鑰儲存複製到目的地。
卸載來源和目的地金鑰儲存的金鑰環外掛程式或組件程式庫。
(僅限在線遷移)在正在運行的伺服器上啟用
keyring_operations
。(僅限在線遷移)從正在運行的伺服器中斷連線。
如果在金鑰遷移期間發生錯誤,則目的地金鑰儲存會還原為遷移前的狀態。
在成功執行在線金鑰遷移操作後,可能需要重新啟動正在運行的伺服器
如果執行中的伺服器在遷移前使用的是來源金鑰儲存區,且在遷移後應繼續使用,則遷移後無需重新啟動。
如果執行中的伺服器在遷移前使用的是目標金鑰儲存區,且在遷移後應繼續使用,則遷移後應重新啟動,以載入所有遷移到目標金鑰儲存區的金鑰。
如果執行中的伺服器在遷移前使用的是來源金鑰儲存區,但在遷移後應使用目標金鑰儲存區,則必須重新設定以使用目標金鑰儲存區並重新啟動。在這種情況下,請注意,雖然執行中的伺服器在遷移期間暫停修改來源金鑰儲存區,但在遷移和後續重新啟動之間的時間間隔內並未暫停。應注意伺服器在此時間間隔內不要修改來源金鑰儲存區,因為任何此類變更都不會反映在目標金鑰儲存區中。
mysql_migrate_keyring 工具會將金鑰從一個金鑰環元件遷移到另一個。它不支援涉及金鑰環外掛程式的遷移。對於該類型的遷移,請使用在金鑰遷移模式下運作的 MySQL 伺服器;請參閱使用遷移伺服器進行金鑰遷移。
若要使用 mysql_migrate_keyring 執行金鑰遷移作業,請確定指定所涉及金鑰環元件所需的金鑰遷移選項,以及遷移是離線還是線上。
若要指示來源和目標金鑰環元件及其位置,請指定以下選項
--source-keyring
:管理要遷移金鑰的來源金鑰環元件。--destination-keyring
:要將遷移的金鑰複製到的目標金鑰環元件。--component-dir
:包含金鑰環元件程式庫檔案的目錄。這通常是本機 MySQL 伺服器的plugin_dir
系統變數的值。
所有三個選項都是必要的。每個金鑰環元件名稱都是一個元件程式庫檔案名稱,指定時不含任何平台特定的副檔名,例如
.so
或.dll
。例如,若要使用程式庫檔案為component_keyring_file.so
的元件,請將選項指定為--source-keyring=component_keyring_file
。來源和目標必須不同,而且 mysql_migrate_keyring 必須同時支援它們。對於離線遷移,不需要其他選項。
對於線上遷移,某些執行中的伺服器目前正在使用來源或目標金鑰儲存區。在這種情況下,請指定
--online-migration
選項以表示線上遷移。此外,請指定連線選項,以指示如何連線到執行中的伺服器,以便 mysql_migrate_keyring 可以連線到它並告知它在遷移作業期間暫停使用金鑰環。--online-migration
選項通常與連線選項結合使用,例如以下選項--host
:執行中伺服器所在的主機。這永遠是本機主機,因為 mysql_migrate_keyring 只能在由本機元件管理的金鑰儲存區之間遷移金鑰。--user
、--password
:用於連線到執行中伺服器的帳戶憑證。--port
:對於 TCP/IP 連線,要連線到執行中伺服器的連接埠號碼。--socket
:對於 Unix socket 檔案或 Windows 具名管道連線,要連線到執行中伺服器的 socket 檔案或具名管道。
如需所有可用選項的說明,請參閱第 6.6.8 節「mysql_migrate_keyring — 金鑰環金鑰遷移工具」。
啟動 mysql_migrate_keyring,並提供選項以指示來源和目標金鑰儲存區以及遷移是離線還是線上,以及其他可能選項。請記住以下注意事項
呼叫 mysql_migrate_keyring 的使用者不得為
root
作業系統使用者。呼叫 mysql_migrate_keyring 的使用者必須具有讀取和寫入任何本機金鑰環檔案的權限,例如基於檔案的外掛程式的資料檔案。
如果您從與一般用於執行 MySQL 的系統帳戶不同的系統帳戶呼叫 mysql_migrate_keyring,它可能會建立伺服器在正常運作期間無法存取的金鑰環目錄或檔案。假設 mysqld 通常以
mysql
作業系統使用者身分執行,但是您以isabel
身分登入時呼叫 mysql_migrate_keyring。由 mysql_migrate_keyring 建立的任何新目錄或檔案都歸isabel
所有。當以mysql
作業系統使用者身分執行的伺服器嘗試存取isabel
擁有的檔案系統物件時,後續的啟動會失敗。若要避免此問題,請以
mysql
作業系統使用者身分呼叫 mysql_migrate_keyring。或者,在遷移後,檢查與金鑰環相關的檔案系統物件,並在必要時使用 chown、chmod 或類似命令變更其所有權和權限,以便執行中的伺服器可以存取這些物件。
假設您想要將金鑰從 component_keyring_file
遷移到 component_keyring_encrypted_file
,且本機伺服器將其金鑰環元件程式庫檔案儲存在 /usr/local/mysql/lib/plugin
中。
如果沒有執行中的伺服器使用金鑰環,則允許離線遷移。呼叫 mysql_migrate_keyring,如下所示(在一行中輸入命令)
mysql_migrate_keyring
--component-dir=/usr/local/mysql/lib/plugin
--source-keyring=component_keyring_file
--destination-keyring=component_keyring_encrypted_file
如果執行中的伺服器正在使用金鑰環,您必須改為執行線上遷移。在這種情況下,必須提供 --online-migration
選項,以及指定要連線哪個伺服器和要使用的 MySQL 帳戶所需的任何連線選項。
以下命令執行線上遷移。它使用 TCP/IP 連線和 admin
帳戶連線到本機伺服器。此命令會提示輸入密碼,您應該在收到提示時輸入
mysql_migrate_keyring
--component-dir=/usr/local/mysql/lib/plugin
--source-keyring=component_keyring_file
--destination-keyring=component_keyring_encrypted_file
--online-migration --host=127.0.0.1 --user=admin --password
mysql_migrate_keyring 執行遷移作業的方式如下
(僅限在線遷移)使用連線選項連線到正在運行的伺服器。
(僅限在線遷移)停用正在運行的伺服器上的
keyring_operations
。載入來源和目標金鑰儲存區的金鑰環元件程式庫。
將金鑰從來源金鑰儲存複製到目的地。
卸載來源和目標金鑰儲存區的金鑰環元件程式庫。
(僅限在線遷移)在正在運行的伺服器上啟用
keyring_operations
。(僅限在線遷移)從正在運行的伺服器中斷連線。
如果在金鑰遷移期間發生錯誤,則目的地金鑰儲存會還原為遷移前的狀態。
在成功執行在線金鑰遷移操作後,可能需要重新啟動正在運行的伺服器
如果執行中的伺服器在遷移前使用的是來源金鑰儲存區,且在遷移後應繼續使用,則遷移後無需重新啟動。
如果執行中的伺服器在遷移前使用的是目標金鑰儲存區,且在遷移後應繼續使用,則遷移後應重新啟動,以載入所有遷移到目標金鑰儲存區的金鑰。
如果執行中的伺服器在遷移前使用的是來源金鑰儲存區,但在遷移後應使用目標金鑰儲存區,則必須重新設定以使用目標金鑰儲存區並重新啟動。在這種情況下,請注意,雖然執行中的伺服器在遷移期間暫停修改來源金鑰儲存區,但在遷移和後續重新啟動之間的時間間隔內並未暫停。應注意伺服器在此時間間隔內不要修改來源金鑰儲存區,因為任何此類變更都不會反映在目標金鑰儲存區中。
線上金鑰遷移提供暫停單一執行中伺服器上的金鑰環作業。如果有多個執行中的伺服器正在使用所涉及的金鑰儲存區,請使用以下程序來執行遷移
手動連線到每個執行中的伺服器,並設定
keyring_operations=OFF
。這可確保沒有執行中的伺服器正在使用來源或目標金鑰儲存區,並滿足離線遷移的必要條件。使用遷移伺服器或 mysql_migrate_keyring 對每個暫停的伺服器執行離線金鑰遷移。
手動連線到每個執行中的伺服器,並設定
keyring_operations=ON
。
所有執行中的伺服器都必須支援 keyring_operations
系統變數。任何不支援的伺服器都必須在遷移前停止,並在遷移後重新啟動。