Web開發經驗(1)防止MySQL數據庫誤更新/刪除

引言

  數據庫一直是個大問題。若是沒有作數據備份,或者是開啓binlog,那真得就是沒了就是沒了,全表更新就是真的回不去了,就算開啓了備份,也很麻煩。光是數據恢復就夠喝一壺的,並且說不影響線上正在跑的業務,那是騙人的。那麼若是作到防止數據庫誤刪或者是誤更新,能夠參考下如下幾點,下面總結的都是業務層面,和一些配置層面。mysql

防禦手段

業務代碼

  • update delete 儘可能不容許where條件爲空程序員

    • ThinkPHP框架where爲空致使全表
    $whereString = "";
        $whereArr    = [];
        $sql1 = M('test')->where($whereString)->buildSql();
        $sql2 = M('test')->where($whereArr)->buildSql();
        echo $sql1;  // SELECT * FROM mall_test
        echo $sql2;  //  SELECT * FROM mall_test
    • 分析:
      那麼問題就很尷尬了。程序員沒好好檢查下where條件,有可能傳了空的字符串或者數組,TP框架源碼我看了下,也僅僅只作了是否有傳參的檢查,這還遠遠不夠
    • 解決思路:
      業務代碼中每次where必須檢查,大原則上不容許where爲空。數據查詢也不行,不當心掃描全表也形成IO和內網帶寬的開銷
  • 軟刪除代替物理刪除
      這個就是比較常見的手段了,通常是多加一個字段is_delete等等標記狀態的字段,若有必要,再加上刪除時間。軟刪除的好處也很明顯,若是是業務發現誤刪,還能有迴旋的餘地。又或者,在一些線上業務中,好比說能夠多一個功能,好比說用戶是VIP,能夠恢復之前刪除的文章或者是圖片等等,看似很厲害,很貼心,其實就是改變刪除狀態而已。

數據庫配置

  • 啓動參數限制更新必須有條件(這裏以mysql爲例)
    -U, --safe-updates Only allow UPDATE and DELETE that uses keys.
    其實UPDATE更新表也要注意防止全表更新,由於更新也產生了不可逆的結果。
  • grant配置權限
    分配的用戶應該知足最小可用權限。好比WEB應用的操做數據庫帳號。root帳號在非必須狀況下,儘可能不要參與平常運維,維護的工做。勤於多多分配帳號。權限的話也要控制好,好比你開放DROP TURNCATE等等這些危險命令幹嗎。若是是用了軟刪除的邏輯,那麼DELETE應該也不容許開放sql

相關文章
相關標籤/搜索