mysql数据库是可以开启安全模式,不过默认情况下,安全模式不开启的,下面就来说说什么是mysql的安全模式

不知道小伙伴们是否有过维护的数据库表业务数据被人或者因为程序bug导致全表更新,全表删除的痛苦经历,恢复业务数据真的是一个精细活,尤其与交易和钱相关的数据,必须恢复成和原来一模一样,那能不能在数据库层面架起最后一道安全堡垒,拒绝全表更新,全表删除的非法操作呢,答案是有的,在mysql中sql_safe_updates可以完美解决这个问题,下面就来给大家演示一下实际效果sql_safe_updates默认是不开启的
mysql> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | OFF   |
+------------------+-------+
1 row in set (0.01 sec)

现在就开启这个参数,如果要永久生效,需要将参数添加到数据库配置文件(my.cnf)中

mysql> set global sql_safe_updates=1;
Query OK, 0 rows affected (0.00 sec)

需要重新连接一下数据库,才会生效

mysql> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
+------------------+-------+
1 row in set (0.00 sec)

下面就开始用表进行测试

mysql> create table t_test10 (id char(10),name char(20), primary key(id));
Query OK, 0 rows affected (0.29 sec)插入语句
insert into t_test10 values('1','test1');
insert into t_test10 values('2','test2');
insert into t_test10 values('3','test3');
insert into t_test10 values('4','test4');
insert into t_test10 values('5','test5');
insert into t_test10 values('6','test6');
insert into t_test10 values('7','test7');
insert into t_test10 values('8','test8');mysql> select * from t_test10;
+----+-------+
| id | name  |
+----+-------+
| 1  | test1 |
| 2  | test2 |
| 3  | test3 |
| 4  | test4 |
| 5  | test5 |
| 6  | test6 |
| 7  | test7 |
| 8  | test8 |
+----+-------+
8 rows in set (0.00 sec)

测试一下全表删除

mysql> delete from t_test10;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
mysql> delete from t_test10 where 1=1;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.

从上面的结果看,全部被数据库安全策略拦截了 再来测试一下更新

mysql> update t_test10 set name='test';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
mysql> update t_test10 set name='test' where 1=1;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.

不带条件的更新也被拦截,那测试一下正常带条件的更新和删除看看效果

mysql> update t_test10 set name='test' where name='test1';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
mysql> delete from t_test10 where name='test2';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.

为什么会这样呢,正常更新或者删除一条记录也会被mysql数据库安全策略拦截了呢,这是因为name列没有索引

mysql> show create table t_test10\G;
*************************** 1. row ***************************Table: t_test10
Create Table: CREATE TABLE `t_test10` (`id` char(10) NOT NULL,`name` char(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)ERROR:
No query specified

在name列上加索引

mysql> alter table t_test10 add index idx_t_test10_name (name);
Query OK, 0 rows affected (0.44 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> show create table t_test10\G;
*************************** 1. row ***************************Table: t_test10
Create Table: CREATE TABLE `t_test10` (`id` char(10) NOT NULL,`name` char(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_t_test10_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

重新测试一下正常删除和更新语句

mysql> update t_test10 set name='test' where name='test1';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> delete from t_test10 where name='test2';
Query OK, 1 row affected (0.01 sec)

全部成功了,开启sql_safe_updates安全模式之后,要想正常删除或者更新,需要满足2个条件

delete,update必须带条件,或者加limit进行过滤
所带条件必须走索引

史上最实用mysql参数之一-----sql_safe_updates相关推荐

  1. 史上最简单MySQL教程详解(进阶篇)之存储过程(一)

    史上最简单MySQL教程详解(进阶篇)之存储过程(一) 史上最简单MySQL教程详解(进阶篇)之存储过程(一) 什么是存储过程 存储过程的作用 如何使用存储过程 创建存储过程 DELIMITER改变分 ...

  2. 史上最全MySQL 大表优化方案(长文)

    转载自  史上最全MySQL 大表优化方案(长文) 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 一.单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑 ...

  3. 史上最简单MySQL教程详解(进阶篇)之索引及失效场合总结

    史上最简单MySQL教程详解(进阶篇)之索引及其失效场合总结 什么是索引及其作用 索引的种类 各存储引擎对于索引的支持 简单介绍索引的实现 索引的设置与分析 普通索引 唯一索引(Unique Inde ...

  4. 史上最简单MySQL教程详解(进阶篇)之存储引擎介绍及默认引擎设置

    什么是存储引擎? MySQL存储引擎种类 MyISAM 引擎 InnoDB引擎 存储引擎操作 查看存储引擎 存储引擎的变更 修改默认引擎 什么是存储引擎? 与其他数据库例如Oracle 和SQL Se ...

  5. 史上最简单MySQL教程详解(进阶篇)之视图

    史上最简单MySQL教程详解(进阶篇)之视图 为什么要用视图 视图的本质 视图的作用 如何使用视图 创建视图 修改视图 删除视图 查看视图 使用视图检索 变更视图数据 WITH CHECK OPTIO ...

  6. 史上最全Mysql规范

    1 整体规范 1.1 注释 1)[强制]数据库所有对象必须要有注释,包括:表.字段.索引等,并且要保持最新: 1.2 字符集 1)[强制]默认使用utf8字符集,无乱码风险,除一些需要存储特殊符号的字 ...

  7. 史上最强MySQL总结大全

    目录 一.MySQL数据库基础 1,数据库的操作 1.1.显示当前数据库 1.2 .创建数据库 1.3.使用数据库 1.4.删除数据库 2.常用数据类型 2.1.数值类型 2.2.字符串类型 2.3. ...

  8. mysql insert into select大量数据插入比较慢_史上最全MySQL锁机制

    本文主要记录学习MyISAM 和 InnoDB 这两个存储引擎. 为什么要学习锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制. 因为数据也是一种供许多用户共享的资源,如何保证数据并发访问的 ...

  9. 史上最全MySQL锁机制

    本文主要记录学习MyISAM 和 InnoDB 这两个存储引擎. 为什么要学习锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制. 因为数据也是一种供许多用户共享的资源,如何保证数据并发访问的 ...

最新文章

  1. 转:Flutter Decoration背景设定(边框、圆角、阴影、形状、渐变、背景图像等)...
  2. Httpwatch 工具介绍
  3. Java核心(四)你不知道的数据集合
  4. html52D转换3D,CSS3 Transform 2D和3D转换
  5. phpunit autoload.php,关于php:Composer不会创建所有需要的phpunit包含路径
  6. restTemplate设置访问超时
  7. 大数据如何更好进行分析
  8. 我的世界之 paper和spigot 的区别 Java服务端开服
  9. 让你的CSS更尽完美的技巧
  10. github等网站访问不稳定的几种改善办法
  11. 腾讯微信客服电话怎么直接人工服务呢
  12. C/C++ 中公认的三个难点
  13. 组策略学习-统一部署桌面壁纸
  14. iPhone助阵 网易邮箱抢占移动互联网制高点
  15. Android-高级-UI-进阶之路(四)-Paint-渲染-滤镜-xfermode-使用
  16. Android电视TV盒子开发——常用ADB命令
  17. 如何用人机协同提高客服效率?阿里巴巴客服助手诞生了
  18. 海康工业相机使用:常见问题及解决方法
  19. 人脸识别项目整合操作步骤
  20. 【一】Donkey Car - 驴车-无人驾驶小车项目与硬件介绍(车身模块、运动模块)

热门文章

  1. 计算机java语言答案,2019年全国计算机二级Java语言练习试题及答案一
  2. mysql not null 索引_MySQL中 IS NULL、IS NOT NULL、!= 能用上索引吗?
  3. VS2012下基于Glut 矩阵变换示例程序:
  4. android 中如何监听按键的长按事件
  5. 数据结构java版 大学_数据结构(Java版)
  6. 《Effective C#》快速笔记(三)- 使用 C# 表达设计
  7. maven eclipse 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or new
  8. C#实现CAD数据转shape或mdb
  9. Linux Namespace机制简介
  10. 恨iPad是一种无知的畸形意识行为