諸如可載入函數和儲存程式 (儲存程序和函數、觸發程序和事件) 等已調用功能的複製提供下列特性
功能的影響永遠會被複製。
下列陳述式會使用基於陳述式的複製來複製
但是,使用這些陳述式建立、修改或刪除的功能影響會使用基於列的複製來複製。
注意嘗試使用基於陳述式的複製來複製已調用功能會產生警告 陳述式在陳述式格式中記錄是不安全的。例如,嘗試使用基於陳述式的複製來複製可載入函數會產生此警告,因為 MySQL 伺服器目前無法判斷該函數是否為確定性的。如果您絕對確定已調用功能的效果是確定性的,您可以安全地忽略此類警告。
在
CREATE EVENT
和ALTER EVENT
的情況下事件的狀態在複本上會設為
REPLICA_SIDE_DISABLED
,無論指定的狀態為何 (這不適用於DROP EVENT
)。建立事件的來源會由其伺服器 ID 在複本上識別。
INFORMATION_SCHEMA.EVENTS
中的ORIGINATOR
資料行會儲存此資訊。如需詳細資訊,請參閱 第 15.7.7.19 節「SHOW EVENTS 陳述式」。
功能實作會以可更新的狀態駐留在複本上,因此如果來源失敗,則複本可以用作來源,而不會遺失事件處理。
若要判斷 MySQL 伺服器上是否有在不同伺服器 (先前作為來源) 上建立的任何排程事件,請查詢資訊結構描述 EVENTS
資料表,方式與此處顯示的類似
SELECT EVENT_SCHEMA, EVENT_NAME
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED';
或者,您可以使用 SHOW EVENTS
陳述式,如下所示
SHOW EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED';
當將具有此類事件的複本升級為來源時,您必須使用 ALTER EVENT
來啟用每個事件,其中 event_name
ENABLEevent_name
是事件的名稱。
如果有多個來源參與在此複本上建立事件,並且您希望識別僅在具有伺服器 ID source_id
的給定來源上建立的事件,請修改 EVENTS
表格上的先前查詢,以包含 ORIGINATOR
欄位,如下所示
SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED'
AND ORIGINATOR = 'source_id'
您可以類似的方式將 ORIGINATOR
與 SHOW EVENTS
陳述式一起使用
SHOW EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED'
AND ORIGINATOR = 'source_id'
REPLICA_SIDE_DISABLED
取代已棄用的 SLAVESIDE_DISABLED
。
在啟用從來源複製的事件之前,您應在複本上停用 MySQL 事件排程器(使用類似 SET GLOBAL event_scheduler = OFF;
的陳述式),執行任何必要的 ALTER EVENT
陳述式,重新啟動伺服器,然後再重新啟用複本上的事件排程器(使用類似 SET GLOBAL event_scheduler = ON;
的陳述式)-
如果您稍後將新來源降級回複本,您必須手動停用所有由 ALTER EVENT
陳述式啟用的事件。您可以透過在單獨的表格中儲存先前顯示的 SELECT
陳述式中的事件名稱,或使用 ALTER EVENT
陳述式將事件重新命名為具有常見前綴,例如 replicated_
,以識別它們。
如果您重新命名事件,那麼當將此伺服器降級回複本時,您可以透過查詢 EVENTS
表格來識別事件,如下所示
SELECT CONCAT(EVENT_SCHEMA, '.', EVENT_NAME) AS 'Db.Event'
FROM INFORMATION_SCHEMA.EVENTS
WHERE INSTR(EVENT_NAME, 'replicated_') = 1;