mysq参数sql_safe_updates限制范围
在mysql运维中出现过不少因为update/delete条件错误导致数据被误更新或者删除的case,为避免类似问题的发生,可以用sql_safe_updates参数来对update/delete做限制。这个参数设置为on后,可防止因程序bug或者DBA手工误操作导致的整个表被更新或者删除的情况。
设置这个参数时需要注意一下几点:
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,设置完成后让程序重连后生效。
限制规范:
示例表结构:
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
1、update
a、报错条件:不带where、带where无索引、where条件为常量
不带where:update delay_monitor set Ftime=now();
带where无索引:update delay_monitor set Ftime=now() where Fgtid='test';
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;
2、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 |
mysq参数sql_safe_updates限制范围的更多相关文章
- 在MySQL中阻止UPDATE语句没有添加WHERE条件的发生
如果在生产环境中使用UPDATE语句更新表数据,此时如果忘记携带本应该添加的WHERE条件,那么..Oh,no…后果可能不堪设想.那么有没有什么办法可以阻止这样的事情发生,又不使用任何的审核工具呢.. ...
- 闪回工具flashback
Ⅰ.背景 早先操作数据误操作后,我们一般通过全量备份+binlog的方式来实现恢复(前滚) 有时只想撤销一个几分钟前的操作,采用这种方式就会显得很笨重 大家都知道Oracle有个叫做flashback ...
- mysq优化参数详解:innodb_buffer_pool_size,innodb_file_per_table
Mysql配置参数: thread_pool:如果支持的话,使用线程池 innodb_buffer_pool_size:物理内存50%-70%最高80%独立实例,多实例:60% innodb_flus ...
- mysq建表参数设置
建表的完整性约束: not null 与 default unique primary auto_increment foreign key 外键的变种 三种关系 一.介绍 约束条件与数据类型的宽度 ...
- mysql sql_safe_updates 不支持子查询的更新。
考虑到开发人员有时候不小心误更新数据,要求线上库的 MySQL 实例都设置 sql_safe_updates=1 来避免没有索引的 update.delete. 结果有一天开发发现下面的一个SQL 没 ...
- MySQ binlog三种模式
MySQ binlog三种模式及设置方法 1.1 Row Level 行模式 日志中会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改 优点:在row level模式下,bin- ...
- mysql 5.6 参数详解
系统变量提供的是各种与服务器配置和功能有关的信息.大部分的系统变量都可以在服务器启动时进行设置.在运行时,每一个系统变量都拥有一个全局值或会话值,或者同时拥有这两个值.许多系统变量都是动态的,也就是说 ...
- Mysql参数汇总
凡是需要耐心. 参数为静态参数则黄色字体标记. 参数为全局变量则粗体标记. 参数为全局.会话变量则不标记. auto_increment_increment auto_increment_offset ...
- MySQL系统变量sql_safe_updates总结
MySQL系统变量sql_safe_updates总结 在MySQL中,系统变量sql_safe_updates是个非常有意思的系统变量,在Oracle和SQL Server中都没有见过这样的参数 ...
随机推荐
- Python 学习系列----第一章:基础知识
1.1 常量-----不能改变它的值 1.2 数 在Python 中数可以分为整数.浮点数和复数. PS:在Python中不用区分'long int'类型.默认的整数类型可以任意长.(译者注:长度应该 ...
- TitleLayout——一个Android轻松实现标题栏的库
TitleLayout 多功能.通用的.可在布局或者使用Java代码实现标题栏: 支持沉浸式状态栏: 支持左侧返回按钮不需要手动实现页面返回: 支持左侧按钮,中间标题,右边按钮点击 左侧支持图片+文字 ...
- MITNIK ATTACK
Https 443 http 80 TCP/IP 协议栈:将数据封装包头 传输层报头 Ack回复确认位 FIN结束位 SIN 开始位 RST 重置位 Seq 序号位 网络层报头 目的地址 原地址 报文 ...
- 扫雷游戏制作过程(C#描述):第五节、菜单操作(续)
前言 这里给出教程原文地址. 该项目已经放在github上托管. 发布版已经分享到百度网盘 菜单操作(续) 接着节前一章节的内容,我们继续完善菜单栏的功能. 我们首先,先完善Rank的选项,我们希望我 ...
- 201521123119《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 Q1.ArrayList代码分析 Q1.1 解释ArrayList的contains源代码 这段代码的主要目的是判断在对ArrayList遍历时所用的方法,在输入参 ...
- python之异常
一.异常与错误 1.语法错误 错误一: if 错误二: def text: pass 错误三: print(sjds 2.逻辑错误 #用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num ...
- bootStrap事例代码
最近在学bootStrap,在慕课网中有这么一个例子-.感觉以后会用到这些代码.保存起来. <!DOCTYPE html> <html lang="zh-cn"& ...
- 你必知必会的SQL面试题
写在前面的话 本文参考原博<走向面试之数据库基础:一.你必知必会的SQL语句练习-Part 1>和<走向面试之数据库基础:一.你必知必会的SQL语句练习-Part 2>进行练习 ...
- JSP页面格式化数字或时间 基于struts的
jsp日期格式化 转自: http://blog.csdn.net/chj225500/article/details/7251552 在直接<s:textfield中也要日期格式化,平时使用日 ...
- mysql truncate、delete与drop区别
相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. 不同点: 1. t ...