mysq參數sql_safe_updates限制範圍

         在mysql運維中出現過很多由於update/delete條件錯誤致使數據被誤更新或者刪除的case,爲避免相似問題的發生,能夠用sql_safe_updates參數來對update/delete作限制。這個參數設置爲on後,可防止因程序bug或者DBA手工誤操做致使的整個表被更新或者刪除的狀況。mysql

  設置這個參數時須要注意一下幾點:sql

           a、設置前須要確認程序中全部的update和delete都符合sql_safe_updates的限制規範,否則程序會報錯。數據庫

           b、5.0,5.1都是session級別的,5.6是global&session級別;低版本的數據庫只能在程序建立session時設置帶上set sql_safe_updates=on;高版本的數據庫能夠直接set global set sql_safe_updates=on,設置完成後讓程序重連後生效。session

限制規範:運維

示例表結構:spa

CREATE TABLE `delay_monitor` (
 `id` int(11) NOT NULL,
 `Ftime` datetime DEFAULT NULL,
 `Fgtid` varchar(128) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin​

一、updateblog

a、報錯條件:不帶where、帶where無索引、where條件爲常量索引

     不帶where:update delay_monitor set Ftime=now();it

      帶where無索引:update delay_monitor set Ftime=now() where Fgtid='test';io

      where條件爲常量:update delay_monitor set Ftime=now() where 1;

 b、執行條件:帶where帶索引、不帶where+帶limit、帶where無索引+limit、帶where有索引+limit、where條件爲常量+limit

       帶where帶索引:update delay_monitor set Ftime=now() where id=2;

       不帶where+帶limit: update delay_monitor set Ftime=now()  limit 1;

       帶where無索引+limit:update delay_monitor set Ftime=now() where Fgtid='test' limit 1;

       帶where有索引+limit:update delay_monitor set Ftime=now() where id =2 limit1;

        where條件爲常量+limit:update delay_monitor set Ftime=now() where 1 limit 1;

 二、delete

 相對於update,delelte的限制會更爲嚴格;where條件爲常量或者爲空,將不予執行。

a、報錯條件:不帶where、帶where無索引、不帶where+帶limit、where條件爲常量、where條件爲常量+limit

      不帶where:delete delay_monitor set Ftime=now();

      帶where無索引:delete delay_monitor set Ftime=now() where Fgtid='test';

      不帶where+帶limit: delete delay_monitor set Ftime=now()  limit 1;

      where條件爲常量:delete delay_monitor set Ftime=now() where 1;

      where條件爲常量+limit:delete delay_monitor set Ftime=now() where 1 limit 1; 

b、執行條件:帶where帶索引、帶where無索引+limit、帶where有索引+limt

      帶where帶索引:delete delay_monitor set Ftime=now() where id=2;

      帶where無索引+limit:delete delay_monitor set Ftime=now() where Fgtid='test' limit 1;

      帶where有索引+limit:delete delay_monitor set Ftime=now() where id =2 limit1;

總結以下表:key表示全部、const表示常量

操做  no where where key where nokey  limit where nokey+limit where key+limit      where const where const+limit
delete     NO YES NO NO YES YES NO     NO
update NO YES NO YES YES YES NO YES
相關文章
相關標籤/搜索