相信各位線上都可能遇到過或者聽到過資料被應用程式“誤”刪,可能因為拼SQL導致謂詞為永真刪除或者更新了全部資料?或者虛驚一場?因此,面對這種情況我們要能:
1.“攻”:如何防止這種情況發生
2.“守”:如果發生了怎麼辦
對於“攻”:
因為我們是MySQL,主要拿MySQL舉例:
1.sql_safe_update:當設定為1時
對於update:如果謂詞沒有索引並且沒有limit會被拒絕
對於delete:如果謂詞永真或為空,或者謂詞沒有索引並且沒有limit被拒絕
其實這兩點對於oltp來說是很有意義的
2.在driver/proxy層面上進行過濾
可以嵌入規則引擎到driver(比如druid)或者proxy(比如cobar)中,這樣更靈活,可配置.
3.超時自動kill,對於OLTP來說如果要死就早死早超生,也叫fail fast,如果當真一個大語句update/delete很久產生的後果也是很可怕的,真要是這樣還不如直接kill掉(當然更優雅的是上面的方式,直接就根據規則拒絕掉)
4.流程自動/規範化
SQL上線流程,測試環境自動化規範化
對於“守”:
0.定期備份和有效性測試是必須的,這個是底線
1.可以建立延遲複製:
這個方法就很多了,pt-slave-delay/tungsten-replicator/blabla…
2.MySQL Flashback:(需要開啟binlog_format=row,其實如果開啟ROW模式的話,對於OLTP的應用可以把max_binlog_cache_size設定的小一些,限制影響範圍)
http://mysql.taobao.org/index.php/Patch_source_code#Add_flashback_feature_for_mysqlbinlog
各位小夥伴們歡迎補充J