MySQL – log_bin_trust_function_creators

測試環境為 CentOS 7 / CentOS 8 x86_64 (虛擬機)

在建立 Stored Function 時卻得到以下的錯誤訊息.

This function has none of DETERMINISTIC, NO SQL,or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)  

奇怪另外一台相同的版本 MySQL (其實是 MariaDB) 可以建立自訂函數,這是為什麼?

主要原因是當你有使用 Binlog 的機制時,會被限制建立 儲存程序 ( Stored Routines ) 包含 Procedure 與 Function .

這一台的 MySQL (其實是 MariaDB) 使用了 Master Slave Replication 的技術.其 Master 的資料庫會透過 Binlog 的機制把所有會變動到資料的指令儲存到 Binlog ,其中包含 CREATE , ALTER TABLE , INSERT , UPDATE , DELETE … (不包含 SELECT 和 SHOW 這一類不影響資料的) .

Slave 透過 IO Thread 的方式 ( IO Thread 會請 Master 發送 Binlog 有更新的部分,並儲存至 Slave 的 Relay Log )
Slave 再透過 SQL Thread 讀取剛剛 IO Thread 儲存的 Relay Log 來執行有更新的部分(指令), 讓兩邊透過非同步的方式來同步資料.

更多關於主從式資料庫 (Master Slave Replication) 請參考 http://benjr.tw/102278

如需建立 儲存程序 ( Stored Routines ) 需開啟 log_bin_trust_function_creators 功能,建議先在 Slave 設定,再到 Master 設定.

[root@localhost ~]# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 263
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

暫時 開啟 log_bin_trust_function_creators

以下是暫時 開啟 log_bin_trust_function_creators 功能的方式,服務重啟就會失效了.

MariaDB [(none)]> SHOW VARIABLES LIKE '%FUN%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)

MariaDB [(none)]> SET GLOBAL log_bin_trust_function_creators = 1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SHOW VARIABLES LIKE '%FUN%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON    |
+---------------------------------+-------+
1 row in set (0.00 sec)

永久有效 log_bin_trust_function_creators

CentOS 7 檔案位於 /etc/my.cnf , CentOS 8 檔案位於 /etc/my.cnf.d/mariadb-server.cnf 設定檔 [mysqld] 區塊加入以下相關設定.

[root@localhost ~]# vi /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
log_bin_trust_function_creators=1

重啟資料庫服務.

[root@localhost ~]# systemctl restart mariadb
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料