當時用的MySQL版本是:5.6.10php
下面咱們在MySQL 5.6.10版本作測試,查看slave庫信息是處於同步的一個狀態:mysql
在master庫上查看status信息:sql
在master庫上執行無效grant語句:架構
mysql> grant file on sakila.* to admin@'192.168.10.129';
相信你們都看到圖了吧,binlog由mysql-bin.000012變成了mysql-bin.000013,那就意味着當執行了無效的grant的時候,可能作了相似flush logs的操做,咱們查看mysql-bin.000012發現報這樣的錯:ide
RELOAD DATABASE; # Shall generate syntax error
如今咱們回到slave庫查看一下信息:測試
看到了,同步已經斷開,報The incident LOST_EVENTS occured on the master. Message: error writing to the binary log錯誤!!!!spa
如下幾種grant寫法,都觸發刷新了binlog:日誌
測試發現,不管是5.5仍是5.6都不能針對庫來受權,5.6針對庫受權file權限,都會觸發刷新了新的binlog,5.5版本則不會,後面會測試MySQL5.5版本。針對全部庫受權file權限是沒問題的,以下:blog
出現同步斷開的解決方法:
1)使用sql_slave_skip_counter跳過事件,但此方法只適用於基於二進制日誌原理的複製,不適用於基於GTID原理的複製。
2)使用slave_skip_errors跳過錯誤。
3) 在從庫上作change master操做,從新切換master_log_file和master_log_pos。(因爲無效的grant語句執行後會建立新的二進制日誌,所 以能夠指定主庫show master status的master_log_file和master_log_pos)事件
下面咱們在MySQL 5.5.40測試:
查看slave庫的信息以下:
在mater查看status並執行無效grant語句:
能夠看到,binlog仍是原來的binlog,並無出現像MySQL5.6的那種狀況,咱們查看下slave的狀況能夠看到依然處於同步狀態:
總結:如今愈來愈多公司用MySQL5.6的版本了,的確MySQL5.6的版本,相對MySQL5.5版本已經改善了很多,因此不少公司已經升級 或者直接用上了MySQL5.6,若是線上用的中5.6版本的MySQL,grant受權的時候就要注意了,無效grant可能會觸發刷新了 binlog,特別對於那種一主多庫的架構,slave提供讀的狀況,就更要注意了,這多是一個bug,在網上找資料的時候,看到5.6.11還有 5.6.13都有出現這樣的狀況,有興趣的朋友能夠測試下MariaDB,若是有別的看法的朋友,但願能一塊兒請請討論分享下,謝謝。
參考資料:
http://www.psce.com/blog/2013/04/09/granting-privileges-may-break-replication-in-mysql-5-6-10/
https://bugs.mysql.com/bug.php?id=68892(自備×××)
做者:xuanzhi
出處:Azhi的博客 http://www.cnblogs.com/xuanzhi201111
您的支持是對博主最大的鼓勵,感謝您的認真閱讀。本文版權歸做者全部,歡迎轉載,但請保留該聲明。