是的,在存儲程序和函數中被執行標准行為被從主MySQL服務器復制到從服務器。
2.在主服務器上創建的存儲程序和函數可以被復制到從服務器上麼?
是的,通過一般DDL語句執行的存儲程序和函數,其在主服務器上的創建被復制到從服務器,所以目標將存在兩個服務器上。對存儲程序和函數的ALTER 和DROP語句也被復制。
3.行為如何在已復制的存儲程序和函數裡發生?
MySQL紀錄每個發生在存儲程序和函數裡的DML事件,並復制這些單獨的行為到從服務器。執行存儲程序和函數的切實調用不被復制。
4.對一起使用存儲程序,函數和復制有什麼特別的安全要求麼?
是的,因為一個從服務器有權限來執行任何讀自主服務器的二進制日志的語句,指定的安全約束因與復制一起使用的存儲程序和函數而存在。如果復制或二進制日志大體上是激活的(為point-in-time恢復的目的),那麼MySQL DBA 有兩個安全選項可選:
任何想創建存儲程序的用戶必須被賦予SUPER權限。
作為選擇,一個DBA可以設置log_bin_trust_routine_creators系統變量為1,它將會允許有標准CREATE ROUTINE權限的人來創建一個存儲程序和函數。
5.對復制存儲程序和函數的行為有什麼限制?
嵌入到存儲程序中的不確定(隨機)或時基行不能適當地復制。隨機產生的結果,僅因其本性,是你可預測的和不能被確實克隆的。因此,復制到從服務器的隨機行為將不會鏡像那些產生在主服務器上的。注意, 聲明存儲程序或函數為DETERMINISTIC或者在log_bin_trust_routine_creators中設置系統變量為0 將會允許隨即值操作被調用。
此外,時基行為不能在從服務器上重新產生,因為在存儲程序中通過對復制使用的二進制日志來計時這樣的時基行為是不可重新產生的,因為該二進制日志僅紀錄DML事件且不包括計時約束。
最後,在大型DML行為(如大批插入)中非交互表發生錯誤,該非交互表可能經歷復制,在復制版的非交互表中主服務器可以被部分地從DML行為更新。但是因為發生的那個錯誤,對從服務器沒有更新。 對函數的DML行為,工作區將被用IGNORE關鍵詞來執行,以便於在主服務器上導致錯誤的更新被忽略,並且不會導致錯誤的更新被復制到從服務器。