本節說明如何線上停用已上線伺服器上的 GTID 交易。此程序不需要將伺服器離線,適合在生產環境中使用。但是,如果您可以在停用 GTID 模式時將伺服器離線,則該過程會比較容易。
此過程類似於在伺服器線上時啟用 GTID 交易,但步驟相反。唯一的不同之處在於您等待記錄的交易複製的時間點。
開始之前,所有伺服器必須符合以下條件
所有伺服器的
gtid_mode
都設定為ON
。任何伺服器上都未設定
--replicate-same-server-id
選項。如果此選項與--log-replica-updates
選項(預設)一起設定,且已啟用二進位日誌(也是預設),則無法停用 GTID 交易。在沒有 GTID 的情況下,這種選項組合會在循環複製中導致無限迴圈。
在每個複本上執行以下操作;如果您使用多來源複製,則為每個通道執行此操作,並包含
FOR CHANNEL '
子句channel
'STOP REPLICA [FOR CHANNEL 'channel']; CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 0, SOURCE_LOG_FILE = file, SOURCE_LOG_POS = position [FOR CHANNEL 'channel']; START REPLICA [FOR CHANNEL 'channel'];
在每個伺服器上,執行以下陳述式
SET @@GLOBAL.gtid_mode = ON_PERMISSIVE;
在每個伺服器上,執行此處顯示的陳述式
SET @@GLOBAL.gtid_mode = OFF_PERMISSIVE;
在每個伺服器上,等待
gtid_owned
等於空字串;您可以依照此處所示檢查SELECT @@GLOBAL.gtid_owned;
在複本上,可能一開始為空,然後再次變為非空。只要至少有一次為空,這就不是問題。
等待目前存在於任何二進位日誌中的所有交易都提交到所有複本。請參閱 第 19.1.4.4 節,「驗證匿名交易的複寫」,了解檢查所有匿名交易是否已複寫到所有伺服器的一種方法。
如果您將二進位日誌用於複製以外的其他用途(例如,執行時間點備份或還原),請等待到您不需要包含 GTID 交易的舊二進位日誌。
例如,在前一個步驟完成後,您可以在執行備份的伺服器上執行
FLUSH LOGS
。然後手動進行備份,或等待您設定的任何定期備份常式的下一次迭代。理想情況下,您應該等待伺服器清除在前一個步驟 5 完成時存在的所有二進位日誌,並且等待之前進行的任何備份過期。
您應該記住,包含 GTID 交易的日誌在下一步之後無法使用。因此,在繼續操作之前,您必須確定拓撲中的任何地方都不存在未提交的 GTID 交易。
在每個伺服器上,執行以下陳述式
SET @@GLOBAL.gtid_mode = OFF;
在每個伺服器上,在
my.cnf
中設定gtid_mode=OFF
。您可以選擇性地設定enforce_gtid_consistency=OFF
;執行此操作後,您也應該將enforce_gtid_consistency=OFF
新增到您的設定檔中。
如果您想降級到較早版本的 MySQL,您現在可以使用正常的降級程序來執行此操作。