最近遇到一個需求涉及存儲過程,被突然問題到如何同步問題問到了,趕緊補課學習一下。
首先,先看一下trigger、procedure和event的定義都是什麼?
trigger: 觸發器是一個被指定關聯到一個表的數據對象,當對個表的特別事件出現時,它被激活。
procedure:是一組為了完成特定功能的SQL語句集。
event:定時任務,類似Linux的crontab。
其次,mysql的同步中可以設定不同的binlog_format,包括statment、row和mix。
statment:語句級,記錄原始SQL語句。
row:行級,記錄受到影響的行的真實修改情況。
mix:上面兩種的混合,基礎使用語句級,當會導致數據不一致的時候會采用行格式。
最後,分別在statement和row兩種格式下,看看trigger、procedure和event是如何記錄binlog的。
1、statement+trigger
binlog會把create trigger記錄下來,並推給slave,然後記錄正常的sql語句,不會記錄trigger中的任何sql。
2、row+trigger
binlog會把create trigger記錄下來,然後會將正常的sql和trigger的sql的所有執行結果記錄下來,並推送給slave。
3、statement+procedure
binlog中會把create procedure記錄下來,然後不會記錄call語句,而是將procedu中的sql用語句級記錄下來,推送給slave。
4、row+procedure
binlog會將create procedure記錄下來,然後不會記錄call procedure,而是會把所有執行的記過記錄在binlog中,然後推送給slave。
5、statement+event
binlog會將create event記錄下來,並會將event中的操作記錄成語句級,推送給slave。
6、row+event
binlog會將create event記錄下來,並將event中的所有操作按照行格式記錄下來,推送給slave。
這期間的問題:
1、由於create都是語句級的,從庫會自動更改binlog_format。
2、從庫如果binlog_format是statement但是主庫是row的話,同步會報錯,需要將從庫也改成row才會恢復。
以上這2點很容易造成同步中斷,故不建議在mysql中使用以上3種設置,如果要用最好使用statement格式。