相信各位線上都可能遇到過或者聽到過資料被應用程式“誤”刪,可能因為拼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