- 浏览: 7936412 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
有的时候,线上容易不小心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有开关可以防止误操作,一定程度上减少发生机会。
可以设置:
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;
发表评论
-
让 InnoDB 多任务运行
2018-09-06 16:06 781今天偶然看到的一招,记录下 如果服务器上的参数 innodb_ ... -
mysql中查询连接工作状态
2018-05-31 15:13 682#!/bin/bash while true do mysql ... -
MYSQL BACKUP的SHELL相关语句
2018-05-25 20:33 545#!/bin/bash ###############Basi ... -
MySQL This function has none of DETERMINISTIC, NO SQL...错误1418 的原因分析及解决方法
2018-05-08 11:17 615MySQL开启bin-log后,调用存储过程或者函数以及触发器 ... -
NUMA的选择
2018-04-24 09:52 1402现在的机器上都是有 ... -
关于MYSQL 5.7线程池的好文收集
2018-03-27 10:57 1526来自腾讯工程师的好文: https://www.jianshu ... -
MYSQL 的审计日志插件
2017-11-30 10:19 1279MYSQL 的审计日志插件,可惜目前只是LINUX用: 来自M ... -
(转)MySQL InnoDB缓冲池配置详解
2017-10-09 16:55 4063一、InnoDB缓冲池 InnoDB维护一个称为缓冲池的内存 ... -
(转)MySQL 5.7默认SQL模式带来的问题总结
2017-10-05 18:46 1862http://www.ywnds.com/?p=8865 在 ... -
(转)MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍
2017-10-05 18:45 1185http://www.ywnds.com/?p=8184 ON ... -
MySQL 5.6 新功能之 Index Condition Pushdown (ICP)
2017-10-05 15:52 789http://www.cnblogs.com/zhoujiny ... -
mysql 5.7中的MBR和BKA算法
2017-10-03 15:11 1716一、什么是MRR MMR全称是Multi-Range Re ... -
(收藏)万字总结:学习MySQL优化原理,这一篇就够了!
2017-09-30 23:37 1187http://dbaplus.cn/news-155-1531 ... -
(转)MySQL中NULL和空值的区别
2017-09-23 15:57 2228MySQL中NULL和空值的区别 http://www.yw ... -
mysql 5.7中关于count(*)的优化
2017-09-20 19:15 2349在mysql 5.7中,对于select count(*) f ... -
MySQL 索引设计概要
2017-09-12 21:12 512<<MySQL 索引设计概要>>,不错 ... -
10分钟学会理解和解决MySQL乱码问题
2017-07-22 18:21 543http://cenalulu.github.io/mysql ... -
MySQL的or/in/union与索引优化
2017-07-22 08:29 951https://mp.weixin.qq.com/s/ZWez ... -
MYSQL中查看某个表或库的大小语句
2017-04-02 09:12 1955在information_schema.tables中有相关记 ... -
(收藏)MYSQL大表方案
2017-01-09 19:58 1434https://segmentfault.com/a/1190 ...
相关推荐
首先,一旦发现误删除,首要任务是立即停止对数据库的任何写入操作,防止新数据覆盖已被删除的数据。这为恢复提供了可能的空间。如果事先有定期备份,那么最直接的方法就是通过备份文件恢复。将备份还原到一个临时...
在MySQL数据库管理中,删除数据是一项常见的操作,但误用`DELETE`命令可能导致无法挽回的数据丢失。为了防止这种意外情况发生,我们可以采取两种策略来确保数据的安全性,即使执行了删除操作,也能轻松恢复。 方法...
3. 工具会输出误操作前的INSERT和UPDATE等SQL语句,你可以将这些语句在数据库中执行,以恢复到误操作前的状态。 通过这种方式,我们可以大大缩短恢复数据的时间,降低业务中断的风险。因此,对于承载重要业务数据的...
MySQL数据库中的INSERT、UPDATE、DELETE和REPLACE语句是数据操作语言(DML)的核心,它们用于在数据库中创建、修改和删除数据。下面将详细解释这些语句的使用方法。 1. INSERT语句: - 基本用法:INSERT INTO `...
MySQL数据库的binlog日志是数据安全的重要保障,它记录了所有的DDL(Data Definition Language,如CREATE、ALTER、DROP等)和DML(Data Manipulation Language,如INSERT、UPDATE、DELETE等)语句,但不包括SELECT...
MySQL数据误删除是每个数据库管理员或运维人员都可能面临的问题,一旦发生,可能导致严重的业务损失。幸运的是,MySQL提供了一种名为Binlog(二进制日志)的功能,记录了所有更改数据库的数据操作,这为数据恢复提供...
4. **数据操作**:包括INSERT语句用于向表中插入数据,UPDATE用于修改现有数据,DELETE用于删除数据,以及SELECT用于查询数据,这是SQL中最基本的操作。 5. **查询语言(SQL)**:深入解析SELECT语句的高级用法,如...
前一段时间接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对DBA而言,回滚数据着实是一件头疼的事情,凡涉及到恢复线上数据必然对应用带来一定的影响。大多数情况是开发误操作delete数据,...
开发人员在操作数据库时,可能会不小心执行了不带WHERE条件的UPDATE或DELETE语句,从而导致大量数据的误删除或错误更新。为了避免此类人为误操作,本文将介绍几种有效的方法来防止MySQL数据库的误操作。 首先,...
MySQL中的`sql_safe_updates`参数是一个非常实用的配置选项,用于增强数据库的安全性,防止由于错误的UPDATE或DELETE语句导致的数据丢失。该参数的主要作用是限制用户在没有明确WHERE子句或者WHERE子句不能有效定位...
MySQL的二进制日志(binlog)是数据库系统中至关重要的组件,它记录了所有对MySQL数据库进行的改变操作,包括表结构的修改(如CREATE、ALTER TABLE等)和表数据的更新(INSERT、UPDATE、DELETE等)。binlog不记录...
用户可以创建、修改或删除用户,分配不同的访问权限,如SELECT、INSERT、UPDATE、DELETE等,确保数据库安全。 3. 表管理:用户可以方便地查看、创建和修改数据库表的结构。这包括添加、删除或修改字段,调整字段...
4. **SQL查询语言**:SQL(Structured Query Language)是操作数据库的语言,包括SELECT用于查询数据,INSERT用于插入数据,UPDATE用于更新数据,DELETE用于删除数据。学会编写复杂的JOIN、GROUP BY和HAVING子句来...
为了防止误删除,通常建议使用带有 `IF EXISTS` 的版本: ```sql DROP DATABASE IF EXISTS school; ``` #### 创建 MySQL 表 创建表时,需要指定表名以及列的数据类型和其他属性。例如,创建一个教师表 `teacher`...
点击这些按钮,JSP页面会通过Servlet或JDBC直接与MySQL数据库进行交互,执行相应的CRUD(Create、Read、Update、Delete)操作。 在CRUD操作中,JSP页面通常通过POST请求发送用户操作到服务器端,Servlet或JSP本身的...
删除用户则使用`DELETE`语句,但通常需要额外的确认机制,以防止误操作。 在实际开发中,我们通常不会直接与SQL语句打交道,而是通过编程语言(如Python、Java、PHP等)的数据库驱动或ORM(对象关系映射)框架来...
- 为了能够在命令行中直接运行MySQL的相关命令,需要将MySQL的bin目录添加到系统环境变量Path中。 - 修改方法:在系统环境变量中找到Path,将`%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;`这...
在MySQL数据库中,`DELETE`语句用于从表中删除特定行的数据。然而,有时我们可能会遇到一些特定的错误情况,比如在尝试使用`DELETE`配合`NOT IN`子查询时,可能会碰到问题。这个问题主要涉及到`NOT IN`子查询与`...
由于MySQL不会提供任何确认或警告,误删或误改数据的风险较高,因此在执行更新和删除操作时,务必确保查询条件的准确性,防止不必要的数据丢失。 总结来说,本章全面讲解了MySQL中插入、更新和删除数据的基本操作,...
3. **更新(Update)**:管理员能够修改错误的考勤信息,比如在系统中纠正因设备故障导致的误记录。 4. **删除(Delete)**:在必要时,如员工离职或数据清理,可以删除相关考勤记录。 5. **关键词查询**:通过输入...