日期: 2014年5月23日
博客: 鐵錨
最近在查看MariaDB主從復制服務器 Master 的錯誤日志時看到很多條警告信息,都是提示 UUID()函數不安全,可能 Slave 產生的值和 Master不一致, 警告信息大致如下:
140522 15:11:10 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. Statement: insert into t_user(userId,userName) values(uuid(),'FunYoung')大致翻譯為中文如下所示:
140522 15:11:10 [警告] 因為使用的格式是 BINLOG_FORMAT = STATEMENT, 所以寫入到二進制日志中的語句可能是不安全的. 語句不安全是因為使用了一個系統函數, 在 slave從服務器上執行可能會生成不一致的數值. 語句如下: insert into t_user(userId,userName) values(uuid(),'FunYoung')看樣子是說,因為slave的 UUID() 函數產生的值可能和Master的不一致,所以使用 BINLOG_FORMAT = STATEMENT這種日志格式是不安全的。
在網上找了一些資料,顯示 5.0 版本是絕對有問題的,怎麼辦呢? 要麼修改實現,比如在應用層生成 UUID,要麼就采用基於行,而不是基於語句的二進制日志格式。
據說 5.0 以後是不一定的,翻看了一些官方文檔,好像 5.6 版本修正了這個問題。 參考鏈接: 22 Changes in MySQL 5.6.0
還有個是09年的文檔,說是當時有這個問題 : https://drupal.org/node/502622
還有一個更詳細的文章: Beware of MySQL 5.6 server UUID when cloning slaves
我們使用的是MariaDB5.5,應該是兼容 MySQL5.5吧,經排查這個問題系統已經自己解決了。
MariaDB [(none)]> select version(); +--------------------+ | version() | +--------------------+ | 5.5.34-MariaDB-log | +--------------------+ 1 row in set (0.00 sec)如果你遇到這個問題,假如還可以升級數據庫系統,那就升級到最新版那就沒事了。
如果不能升級DMBS,那麼就需要在應用層,或者采用 基於行的復制方式 了。