MySQL binlog-do-db選項是危險的[轉]


很多人通過 binlog-do-db, binlog-ignore-db, replicate-do-db 和   replicate-ignore-db 來過濾復制(某些數據庫), 盡管有些使用, 但是,在我看來,他們是危險的,並且他們被濫用了.   對於很多的實例,有更安全的替換方案

 

為什么危險很簡單: 他們並不像你想的那樣工作. 想象如下的場景: 你設置了  binlog-ignore-db = garbage, 所以 garbage數據庫(在slave上不存在這個數據庫)  中的數據不會被復制

 

mysql> delete from garbage.junk;
mysql> use garbage;
mysql> update production.users set disabled = 1 where user = "root";

 

復 制會broke2次, 第一次,因為 slave嘗試着去之西你給第一條語句,但是slave上並沒有這樣的表"garbage.junk" ,   第二次, 隱含的, 因為 對 production.users不會被 復制,因為 root帳號並沒有在slave上被禁用掉.

 

為 什么? 因為 binlog-ignore-db 並不像你想的那樣執行, 我之前說的, "在garbage數據庫中的數據不會被復制" 是錯的,  實際上(數據庫)並沒有這么做.事實上, 他是通過默認的數據庫為“garbage" 的連接, 過濾二進制的(SQL)語句日志的. 換句話說, 過濾不是基於 查詢的字符串的, 而實際於你used的數據庫.

 

其他我提到的配置選項也都類似. binlog-do-db 和 binlog-ignore-db 語句是特別危險的,因為他們將語句寫入了二進制日志. 意味着你不能使用二進制日志從備份恢復指定時間的數據.

 

安 全的替換方案是 在 slave上配置過濾, 使用基於查詢中真正涉及到的表的選項, 這些是: replicate-wild-* 選項, 例如,  避免復制 garbage數據庫中的數據的安全的方案是 配置:  replicate-wild-ignore-table=garbage.%.  這樣做仍然有一些特殊的情況, 不能正常工作,但可以在更多的情況下正常工作,並且會遇到更少的意外 (gotchas).

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM