Mysql儲存程式 函式 觸發程式及複製 常見問題

2022-03-31 20:18:10 字數 1837 閱讀 3268

mysql 5.1儲存程式和函式對複製起作用嗎?

是的,在儲存程式和函式中被執行標準行為被從主mysql伺服器複製到從伺服器。有少數限制,它們在20.4節,「儲存子程式和 觸發程式二進位制日誌功能」中詳述。

在主伺服器上建立的儲存程式和函式可以被複製到從伺服器上麼?

是的,通過一般ddl語句執行的儲存程式和函式,其在主伺服器上的建立被複製到從伺服器,所以目標將存在兩個伺服器上。對儲存程式和函式的alter 和drop語句也被複製。

行為如何在已複製的儲存程式和函式裡發生?

mysql紀錄每個發生在儲存程式和函式裡的dml事件,並複製這些單獨的行為到從伺服器。執行儲存程式和函式的切實呼叫不被複製。

對一起使用儲存程式,函式和複製有什麼特別的安全要求麼?

是的,因為乙個從伺服器有許可權來執行任何讀自主伺服器的二進位制日誌的語句,指定的安全約束因與複製一起使用的儲存程式和函式而存在。如果複製或二進位制日誌大體上是啟用的(為point-in-time恢復的目的),那麼mysql dba 有兩個安全選項可選:

任何想建立儲存程式的使用者必須被賦予super許可權。

作為選擇,乙個dba可以設定log_bin_trust_routine_creators系統變數為1,它將會允許有標準create routine許可權的人來建立乙個儲存程式和函式。

對複製儲存程式和函式的行為有什麼限制?

嵌入到儲存程式中的不確定(隨機)或時基行不能適當地複製。隨機產生的結果,僅因其本性,是你可**的和不能被確實轉殖的。因此,複製到從伺服器的隨機行為將不會映象那些產生在主伺服器上的。注意, 宣告儲存程式或函式為deterministic或者在log_bin_trust_routine_creators中設定系統變數為0 將會允許隨即值操作被呼叫。

此外,時基行為不能在從伺服器上重新產生,因為在儲存程式中通過對複製使用的二進位制日誌來計時這樣的時基行為是不可重新產生的,因為該二進位制日誌僅紀錄dml事件且不包括計時約束。

最後,在大型dml行為(如大批插入)中非互動表發生錯誤,該非互動表可能經歷複製,在複製版的非互動表中主伺服器可以被部分地從dml行為更新。但是因為發生的那個錯誤,對從伺服器沒有更新。 對函式的dml行為,工作區將被用ignore關鍵詞來執行,以便於在主伺服器上導致錯誤的更新被忽略,並且不會導致錯誤的更新被複製到從伺服器。

上述的限制會影響mysql作 point-in-time恢復的能力嗎?

影響複製的同一限制會影響point-in-time恢復。

mysql要做什麼來改正前述的限制呢?

將來發行的mysql預期有乙個功能去選擇複製該如何被處理:

基於語句的複製(當前實現)。

行級別複製(它將解決所有早先描述的限制)。

觸發程式對複製起作用麼?

mysql 5.1中的觸發程式和複製象在大多數其它資料庫引擎中一樣工作,在那些引擎中,通過觸發程式在主伺服器上執行的行為不被複製到從伺服器。取而代之的是,位於主mysql伺服器的表中的 觸發程式需要在那些存在於任何mysql從伺服器上的表內被建立,以便於觸發程式可以也可以在從伺服器上被啟用。

乙個行為如何通過從主伺服器上覆制到從伺服器上的觸發程式來執行呢?

首先,主伺服器上的觸發程式必須在從伺服器上重建。一旦重建了,複製流程就象其它參與到複製中的標準dml語句一樣工作。例如:考慮乙個已經插入觸發程式after的emp表,它位於主mysql伺服器上。同樣的emp表和after插入 觸發程式也存在於從伺服器上。複製流程可能是:

1.    對emp做乙個insert語句。

2.   emp上的after觸發程式啟用。

3.    insert語句被寫進二進位制日誌。

4.    從伺服器上的複製拾起insert語句給emp表,並在從伺服器上執行它。

5.    位於從伺服器emp上的after觸發程式啟用。

MySQL使用觸發程式

觸發程式是與表有關的命名資料庫物件,當表上出現特定事件時,將啟用該物件。在某些觸發程式的用法中,可用於檢查插入到表中的值,或對更新涉及的值進行計算。觸發程式與表相關,當對表執行insert delete或update語句時,將啟用觸發程式。可以將觸發程式設定為在執行語句之前或之後啟用。例如,可以在從...

mysql儲存程式包括 Mysql 儲存程式

1儲存過程 create procedure greeting begin 77 16 for username 60 for hostname 1 for declare user char 77 character set utf8 set user select current user if...

Mysql 儲存程式

1儲存過程 create procedure greeting begin 77 16 for username 60 for hostname 1 for declare user char 77 character set utf8 set user select current user if...