`

mysql中保险开关防止UPDATE,DELETE误删除

 
阅读更多
有的时候,线上容易不小心UPDATE,DELETE的时候,无加限制条件,从而引起灾难,
但其实MYSQL有开关可以防止误操作,一定程度上减少发生机会。
可以设置:
sql_safe_updates
其中 :
当sql_safe_updates设置为1时,update:要有where,并查询条件必须使用为索引字段,或者使用limit,或者两个条件同时存在,才能正常执行。delete:where条件中带有索引字段可删除,where中查询条件不是索引,得必须有limit。主要是防止update和deLete没有使用索引导致变更及删除大量数据。参数默认值为0

更多参考来自:
http://www.itopers.com/blog/posts/database/mysql/sql_safe_updates.html

如下例子:

CREATE TABLE `sql_safe` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `balance` decimal(12,2) unsigned NOT NULL DEFAULT '0.00',
  `uid` bigint(20) NOT NULL,
  `nuid` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_uid` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
mysql> select * from sql_safe;
+----+---------+-----+------+
| id | balance | uid | nuid |
+----+---------+-----+------+
|  1 |    0.10 | 123 |  123 |
|  2 |  212.00 | 124 |  124 |
|  3 |    1.01 | 150 |  150 |
|  4 |    2.00 | 129 |  129 |
|  5 |   23.10 | 130 |  130 |
|  6 |  236.00 | 126 |  126 |
|  7 |   26.01 | 127 |  127 |
|  8 |   31.00 | 131 |  131 |
+----+---------+-----+------+
8 rows in set (0.00 sec)
mysql> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
+------------------+-------+
#语句A:
mysql> update sql_safe set balance = balance - 10;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

#语句B:
mysql> update sql_safe set balance = balance - 10 where nuid = 123;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

#语句C:
mysql> update sql_safe set balance = balance - 10 where uid = 123;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

#语句D:
mysql> update sql_safe set balance = balance - 10 limit 1;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 1
语句A和语句B一个是没有使用where,一个是没有用到索引,都提示执行失败,报ERROR 1175

语句C和语句D一个是where中使用了索引字段,一个是使用了limit,都是精确到了部分数据。

关于Warnings: 1这个,是out of range的原因,这个后续再说明下各个数值字段类型超范围的处理。

Delete会不一样些,条件更为严格:

#语句E:
mysql> delete from sql_safe ;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

#语句F:
mysql> delete from sql_safe where nuid = 123;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

#语句G:
mysql> delete from sql_safe where uid = 123;
Query OK, 1 row affected (0.00 sec)

#语句H:
mysql> delete from sql_safe where nuid = 124 limit 1;
Query OK, 1 row affected, 1 warning (0.00 sec)

#语句I:
mysql> delete from sql_safe limit 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
delete只有使用where条件带索引,或者where +limit可以正常执行,其它都会有问题。

所以说,启用这个参数,需要详细了解业务中的sql,是否都通过索引进行update/delete,如果没有,会出现sql执行报错。

另外,sql_safe_updates这个参数在各版本之间的功能都一样,唯一的区别是作用域不一样。

5.0,5.1都是session级别的,5.5,5.6是global&session级别。

正因为这个作用域的限制,在低版本中无法在线在数据库中直接开启这个功能,高版本中可在线开启,但也需要中断现有连接才能生效。

那么如果才能让这个sql_safe_updates这个功能生效?

1、低版本数据库只能程序端直接在创建session时,带上set sql_safe_updates = 1

2、高版本数据库可以set global sql_safe_updates = 1;然后让前端程序重新创建连接。也可在创建session时,set sql_safe_updates = 1;
分享到:
评论

相关推荐

    MySQL执行delete误删除数据恢复

    首先,一旦发现误删除,首要任务是立即停止对数据库的任何写入操作,防止新数据覆盖已被删除的数据。这为恢复提供了可能的空间。如果事先有定期备份,那么最直接的方法就是通过备份文件恢复。将备份还原到一个临时...

    MySQL防止delete命令删除数据的两种方法

    在MySQL数据库管理中,删除数据是一项常见的操作,但误用`DELETE`命令可能导致无法挽回的数据丢失。为了防止这种意外情况发生,我们可以采取两种策略来确保数据的安全性,即使执行了删除操作,也能轻松恢复。 方法...

    MySQL误操作后快速恢复数据的方法

    3. 工具会输出误操作前的INSERT和UPDATE等SQL语句,你可以将这些语句在数据库中执行,以恢复到误操作前的状态。 通过这种方式,我们可以大大缩短恢复数据的时间,降低业务中断的风险。因此,对于承载重要业务数据的...

    MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解

    MySQL数据库中的INSERT、UPDATE、DELETE和REPLACE语句是数据操作语言(DML)的核心,它们用于在数据库中创建、修改和删除数据。下面将详细解释这些语句的使用方法。 1. INSERT语句: - 基本用法:INSERT INTO `...

    使用binlog日志恢复MySQL数据库删除数据的方法

    MySQL数据库的binlog日志是数据安全的重要保障,它记录了所有的DDL(Data Definition Language,如CREATE、ALTER、DROP等)和DML(Data Manipulation Language,如INSERT、UPDATE、DELETE等)语句,但不包括SELECT...

    MySQL数据误删除的快速解决方法(MySQL闪回工具)

    MySQL数据误删除是每个数据库管理员或运维人员都可能面临的问题,一旦发生,可能导致严重的业务损失。幸运的是,MySQL提供了一种名为Binlog(二进制日志)的功能,记录了所有更改数据库的数据操作,这为数据恢复提供...

    mysql数据库的几个中文教程

    4. **数据操作**:包括INSERT语句用于向表中插入数据,UPDATE用于修改现有数据,DELETE用于删除数据,以及SELECT用于查询数据,这是SQL中最基本的操作。 5. **查询语言(SQL)**:深入解析SELECT语句的高级用法,如...

    MySQL 两种恢复数据的方法

    前一段时间接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对DBA而言,回滚数据着实是一件头疼的事情,凡涉及到恢复线上数据必然对应用带来一定的影响。大多数情况是开发误操作delete数据,...

    MySQL数据库防止人为误操作的实例讲解

    开发人员在操作数据库时,可能会不小心执行了不带WHERE条件的UPDATE或DELETE语句,从而导致大量数据的误删除或错误更新。为了避免此类人为误操作,本文将介绍几种有效的方法来防止MySQL数据库的误操作。 首先,...

    mysql利用参数sql_safe_updates限制update/delete范围详解

    MySQL中的`sql_safe_updates`参数是一个非常实用的配置选项,用于增强数据库的安全性,防止由于错误的UPDATE或DELETE语句导致的数据丢失。该参数的主要作用是限制用户在没有明确WHERE子句或者WHERE子句不能有效定位...

    mysql binlog日志恢复【亲测有效,有例子实测】

    MySQL的二进制日志(binlog)是数据库系统中至关重要的组件,它记录了所有对MySQL数据库进行的改变操作,包括表结构的修改(如CREATE、ALTER TABLE等)和表数据的更新(INSERT、UPDATE、DELETE等)。binlog不记录...

    MySQLAdministrator5.0汉化包

    用户可以创建、修改或删除用户,分配不同的访问权限,如SELECT、INSERT、UPDATE、DELETE等,确保数据库安全。 3. 表管理:用户可以方便地查看、创建和修改数据库表的结构。这包括添加、删除或修改字段,调整字段...

    mysql必知必会

    4. **SQL查询语言**:SQL(Structured Query Language)是操作数据库的语言,包括SELECT用于查询数据,INSERT用于插入数据,UPDATE用于更新数据,DELETE用于删除数据。学会编写复杂的JOIN、GROUP BY和HAVING子句来...

    mysql 如果符合合同号好是服务

    为了防止误删除,通常建议使用带有 `IF EXISTS` 的版本: ```sql DROP DATABASE IF EXISTS school; ``` #### 创建 MySQL 表 创建表时,需要指定表名以及列的数据类型和其他属性。例如,创建一个教师表 `teacher`...

    学生信息管理MyEclipse软件用JSP连接MySQL对表中数据显示增加删除

    点击这些按钮,JSP页面会通过Servlet或JDBC直接与MySQL数据库进行交互,执行相应的CRUD(Create、Read、Update、Delete)操作。 在CRUD操作中,JSP页面通常通过POST请求发送用户操作到服务器端,Servlet或JSP本身的...

    实现对mysql数据库的简单增删改查功能

    删除用户则使用`DELETE`语句,但通常需要额外的确认机制,以防止误操作。 在实际开发中,我们通常不会直接与SQL语句打交道,而是通过编程语言(如Python、Java、PHP等)的数据库驱动或ORM(对象关系映射)框架来...

    mysql基础操作

    - 为了能够在命令行中直接运行MySQL的相关命令,需要将MySQL的bin目录添加到系统环境变量Path中。 - 修改方法:在系统环境变量中找到Path,将`%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;`这...

    关于mysql delete的问题小结

    在MySQL数据库中,`DELETE`语句用于从表中删除特定行的数据。然而,有时我们可能会遇到一些特定的错误情况,比如在尝试使用`DELETE`配合`NOT IN`子查询时,可能会碰到问题。这个问题主要涉及到`NOT IN`子查询与`...

    完整精品数据库课件 MySQL从入门到精通 第08章 插入、更新与删除数据(共10页).ppt

    由于MySQL不会提供任何确认或警告,误删或误改数据的风险较高,因此在执行更新和删除操作时,务必确保查询条件的准确性,防止不必要的数据丢失。 总结来说,本章全面讲解了MySQL中插入、更新和删除数据的基本操作,...

    考勤打卡(mysql).zip

    3. **更新(Update)**:管理员能够修改错误的考勤信息,比如在系统中纠正因设备故障导致的误记录。 4. **删除(Delete)**:在必要时,如员工离职或数据清理,可以删除相关考勤记录。 5. **关键词查询**:通过输入...

Global site tag (gtag.js) - Google Analytics