MySQL安全更新之safe_updates介绍说明
对于研发而言,线上数据库update和delete是非常频繁的,因而经常出现update和delete时,后面忘记添加where条件的限制,导致整个表误删除,或者是误更新,造成很多灾难是非常常见的事情,如何彻底解决这样的人为的数据库故障或者减少这种人为的故障了,那就是从根本上控制好mysql数据库的权限,禁止给研发人员update和delete数据库的权限,严格SQL语句上线之前的审核,减少人为的操作mysql库的故障。然而这种数据库的权限的把控往往是很难严格意义上把控好的。只能是减少类似这样的故障的发生。
下面咱们简单介绍下client端mysql的safe_updates 参数的使用,它从一定程度上还是可以避免上面的update和delete时,后面忘记添加where条件而带来的悲剧。
sql_safe_updates具体的使用方法咱们可以man 下mysql
同时也可以把参数写入到/etc/my.cnf配置文件
在my.cnf配置文件开启参数safe-updates就行。
查看当前mysql session会话下的sql_safe_updates
查看全局的配置参数sql_safe_updates
创建测试表并且插入数据测试
给表zx_sorces中的字段titles字段添加一个索引A
查看该表存在的索引
通过查看表结构也是可以看到索引的
查看当前sql的模式,0代表sql没有开启安全模式,1代表sql开启了安全模式
设置sql为安全模式:
退出当前的MySQL的session会话层,重新登录mysql查看当前的sql_safe_updates为1,代表开启了sql的安全模式
给表中插入测试数据:
演示一:
简单翻译一下:你正在使用 安全更新模式(safe upate mode)并且你在尝试 update 一个表时 没有用带有键的列 作为where条件。
初学者在修改一个值时可能会用以下语句:
update table_name set column=‘new_value’
而这正是很多人常犯的错误。因为他没有限定条件,会将表中所有的记录都修改一遍。
为了防止这种错误出现,我们可以开启安全更新模式(safe update mode):
set [global] SQL_SAFE_UPDATES = 1;
在update操作中:
1.当update table 时,后面没有where条件,是会拒绝更新的。
2.当where条件中列(column)没有索引可用且无limit限制时会拒绝更新。
一旦加上limit限制是可以更新的:
3.当where条件为常量且无limit限制时会拒绝更新。
例如:update zx_scores set titles=‘班长’ where icon=1;是会拒绝跟新的
一旦加上limit限制是可以更新的:
当where条件为常量且有limit限制时是可以更新的:
在delete操作中:
1.当①where条件为常量,且无limit限制时拒绝删除。
当①where条件为常量,且有limit限制是可以删除的。
2.当②或where条件为空,且无limit限制时拒绝删除。
3.当③或where条件中 列(column)没有索引可用且无limit限制时拒绝删除。
但是titles字段上创建了索引A,所以可以删除
需要注意的是:
update操作中,where可以为常量 ,where条件中列(column)可以没有索引,但是需要有limit限制。
然而delete要严格一些:where不能为常量,且where条件中列(column)不能没有索引!