UPDATE或者DELETE忘加WHERE条件的恢复
2019独角兽企业重金招聘Python工程师标准>>>
1、建立测试表
mysql> create table test( -> id int not null auto_increment, -> name char(20) not null, -> sex char(4) not null, -> score varchar(10) not null, -> primary key(id) -> );
Query OK, 0 rows affected (0.11 sec)
2、插入数据
mysql> insert into test(name,sex,score) values('张三','男',86);
Query OK, 1 row affected (0.01 sec)
……
mysql> select * from test;
+----+--------+-----+-------+
| id | name | sex | score |
+----+--------+-----+-------+
| 1 | 张三 | 男 | 86 |
| 2 | 李四 | 男 | 88 |
| 3 | 王五 | 男 | 90 |
| 4 | 麻六 | 男 | 92 |
| 5 | 小芳 | 女 | 94 |
| 6 | 小红 | 女 | 100 |
+----+--------+-----+-------+
6 rows in set (0.00 sec)mysql> update test set sex='tom';
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6 Changed: 6 Warnings: 0 mysql> select * from test;
+----+--------+-----+-------+
| id | name | sex | score |
+----+--------+-----+-------+
| 1 | 张三 | tom | 86 |
| 2 | 李四 | tom | 88 |
| 3 | 王五 | tom | 90 |
| 4 | 麻六 | tom | 92 |
| 5 | 小芳 | tom | 94 |
| 6 | 小红 | tom | 100 |
+----+--------+-----+-------+
6 rows in set (0.00 sec)
3、开始恢复,生产环境锁表,避免数据被再次污染
mysql> lock tables test read;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test(name,sex,score) values('小芳','女',94);
ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 1816 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4、分析二进制日志
[root@xiaoya data]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000001 |grep -B 15 '中'
BEGIN
/*!*/;
# at 1513
# at 1569
#160713 13:52:06 server id 1 end_log_pos 1569 Table_map: `students`.`test` mapped to number 33
#160713 13:52:06 server id 1 end_log_pos 1789 Update_rows: table id 33 flags: STMT_END_F
### UPDATE `students`.`test`
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='张三' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='男' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='86' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='张三' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='86' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### UPDATE `students`.`test`
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2='李四' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='男' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='88' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2='李四' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='88' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### UPDATE `students`.`test`
### WHERE
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @2='王五' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='男' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='90' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @2='王五' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='90' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### UPDATE `students`.`test`
### WHERE
### @1=4 /* INT meta=0 nullable=0 is_null=0 */
### @2='小红' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='女' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='92' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=4 /* INT meta=0 nullable=0 is_null=0 */
### @2='小红' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='92' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### UPDATE `students`.`test`
### WHERE
### @1=5 /* INT meta=0 nullable=0 is_null=0 */
### @2='小芳' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='女' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='96' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=5 /* INT meta=0 nullable=0 is_null=0 */
### @2='小芳' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
Binlog记录了每一行的变化情况,这里binlog格式必须是row,我们要做的就是把binlog转化成sql重新插入。
6、分析、处理二进制日志
[root@xiaoya data]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000001 |sed -n '/# at 1569/,/# at 1789/p' >mysql-test.txt
[root@xiaoya data]# cat mysql-test.txt
# at 1569
#160713 13:52:06 server id 1 end_log_pos 1569 Table_map: `students`.`test` mapped to number 33
#160713 13:52:06 server id 1 end_log_pos 1789 Update_rows: table id 33 flags: STMT_END_F
### UPDATE `students`.`test`
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='张三' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='男' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='86' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='张三' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='86' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### UPDATE `students`.`test`
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2='李四' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='男' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='88' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2='李四' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='88' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### UPDATE `students`.`test`
### WHERE
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @2='王五' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='男' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='90' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @2='王五' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='90' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### UPDATE `students`.`test`
### WHERE
### @1=4 /* INT meta=0 nullable=0 is_null=0 */
### @2='小红' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='女' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='92' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=4 /* INT meta=0 nullable=0 is_null=0 */
### @2='小红' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='92' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### UPDATE `students`.`test`
### WHERE
### @1=5 /* INT meta=0 nullable=0 is_null=0 */
### @2='小芳' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='女' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='96' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### SET
### @1=5 /* INT meta=0 nullable=0 is_null=0 */
### @2='小芳' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3='中' /* STRING(12) meta=65036 nullable=0 is_null=0 */
### @4='96' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
# at 1789
下面有一个神奇的sed
[root@xiaoya data]# sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}' mysql-test.txt | sed -r '/WHERE/{:a;N;/@4/!ba;s/### @2.*//g}' | sed 's/### //g;s/\/\*.*/,/g' | sed '/WHERE/{:a;N;/@1/!ba;s/,/;/g};s/#.*//g;s/COMMIT,//g' | sed '/^$/d'
UPDATE `students`.`test`
SET @1=1 , @2='张三' , @3='男' , @4='86' ,
WHERE @1=1 ;
UPDATE `students`.`test`
SET @1=2 , @2='李四' , @3='男' , @4='88' ,
WHERE @1=2 ;
UPDATE `students`.`test`
SET @1=3 , @2='王五' , @3='男' , @4='90' ,
WHERE @1=3 ;
UPDATE `students`.`test`
SET @1=4 , @2='小红' , @3='女' , @4='92' ,
WHERE @1=4 ;
UPDATE `students`.`test`
SET @1=5 , @2='小芳' , @3='女' , @4='96' ,
WHERE @1=5 ;
下面这个就相对简单了
[root@xiaoya data]# sed -i 's/@1/id/g;s/@2/name/g;s/@3/sex/g;s/@4/score/g' recover.sql
[root@xiaoya data]# sed -i -r 's/(score.*),/\1/g' recover.sql
[root@xiaoya data]# cat recover.sql
UPDATE `students`.`test`
SET id=1 , name='张三' , sex='男' , score='86'
WHERE id=1 ;
UPDATE `students`.`test`
SET id=2 , name='李四' , sex='男' , score='88'
WHERE id=2 ;
UPDATE `students`.`test`
SET id=3 , name='王五' , sex='男' , score='90'
WHERE id=3 ;
UPDATE `students`.`test`
SET id=4 , name='小红' , sex='女' , score='92'
WHERE id=4 ;
UPDATE `students`.`test`
SET id=5 , name='小芳' , sex='女' , score='96'
WHERE id=5 ;
6、日志处理到此ok,导入数据看一下
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec) mysql> source /usr/local/mysql/data/recover.sql
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test;
+----+--------+-----+-------+
| id | name | sex | score |
+----+--------+-----+-------+
| 1 | 张三 | 男 | 86 |
| 2 | 李四 | 男 | 88 |
| 3 | 王五 | 男 | 90 |
| 4 | 小红 | 女 | 92 |
| 5 | 小芳 | 女 | 96 |
+----+--------+-----+-------+
5 rows in set (0.00 sec)
到这里数据就完整回来了。将binglog格式设置为row有利有弊,好处是记录了每一行的实际变化,在主从复制时也不容易出问题。但是由于记录每行的变化,会占用大量磁盘,主从复制时带宽占用会有所消耗。到底是使用row还是mixed,需要在实际工作中自己去衡量,但从整体上来说,binglog的格式设置为row,都是不二的选择。
总结:
1、delete误删除和这个原理是一样的(把binlog在转换成sql重新插入)
2、解决问题的最好方式是预防问题的发生
方案一:定义别名
[root@xiaoya ~]# alias mysql='mysql -U'[root@xiaoya ~]# echo "alias mysql='mysql -U'" >>/etc/profile
[root@xiaoya ~]# source /etc/profile
指定登陆-U 后,在mysql里,执行update和delete操作,如果没有指定where或limit,则程序拒绝执行。
方案二:在[mysql]段落开启这个参数:
safe-updates
这样当我们在做DML操作时忘记加where条件时,mysqld服务器是不会执行操作的
参考:http://www.cnblogs.com/gomysql/p/3582058.html
为了方便大家交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一起来交流吧
转载于:https://my.oschina.net/u/3023401/blog/1439266
UPDATE或者DELETE忘加WHERE条件的恢复相关推荐
- mysql 恢复delete操作_MySQL 误操作后数据恢复(update,delete忘加where条件)
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...
- mysql 修改数据 where_MySQL 误删数据、误更新数据(update,delete忘加where条件)
MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写 ...
- mysql 清除分区数据恢复_MySQL 误操作后数据恢复(update,delete忘加where条件)【转】...
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...
- update和delete操作忘加where条件导致全表更新的处理方法
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...
- SQL SERVER 数据库delete 未加where 条件数据误删恢复办法
步骤: 1.下载ApexSQLLog.链接: https://pan.baidu.com/s/1lXW7TILAc7MHcCskhXvgeg 提取码: 7tix 复制这段内容后打开百度网盘手机App, ...
- 比CRUD多一点儿(三):UPDATE、DELETE语句
这是MySQL系列笔记的第一部分,本系列笔记希望能按照笔者自己学习MySQL技术的经历来记录,避免纯粹按照内容一块一块总结,也就是不同于一般按内容分配章节的书籍的结构,会有一个平滑的阅读曲线.内容比较 ...
- mysql update delete_MySQL中UPDATE与DELETE语句的使用教程
UPDATE 更新UPDATE SET 语法用于修改更新数据表中的数据. 语法: UPDATE tb_name SET column1 = new_value1,column2 = new_value ...
- 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
转自:http://www.jb51.net/article/39199.htm 本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍, ...
- INSERT、UPDATE、DELETE、TRUNCATE指令详解
DML语言: DML(Data Manipulation Language),数据操纵语言,在SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT.UPDATE.DELETE三种指令 ...
最新文章
- 反射拷贝对象的思路:
- 服务器系统需要定期清理吗,windows 2008服务器系统清理
- golang查找重复行
- 【极值问题】【CF1063B】 Labyrinth
- 手把手系列:(一)用Benchmarksql测试Oracle数据库性能
- QImage、 QPixmap、 QBitmap、 QPicture区别
- 陌屿授权系统v2.0源码
- .NET Core 3.0中的新功能和增强功能
- 数据结构排序系列详解之六 树形选择排序
- 【服务器】宝塔LNMP安装Discuz!
- 如何高效的使用Google
- BNU 鸣人的查克拉
- The eighth day
- 17-面向对象之语法(2)
- Hbase和Hive安装
- win7开机启动项设置_Win7系统电脑使用注册表查看开机启动项操作方法
- linux操作系统 第02章 linux操作做基础
- Linux服务器-Linux服务器的类型
- Java 程序获取本机 ip 地址
- php serv u提权脚本,.NET/Perl/PHP 三个版本的 ServU提权程序 -电脑资料
热门文章
- Hololens开发笔记
- 做视频类网站如何选择云服务器?
- Cannot set priority of timelineserver process 23314以及leveldb-timeline-store.ldb does not exist解决
- 完美解决安装Eclipse2020-3报错问题及正确安装,冲冲冲!!!
- php上传文件并存储到mysql数据库的方法
- 黑鲨Android系统耗电高,已达安卓顶配,黑鲨2pro作为主力机,聊聊使用感受
- 学习笔记 time模块练习 纪念日计算
- 《通关!游戏设计之道(continue...)》
- springcloud bootstrap context加载过程解析以及怎么成为main context的parent
- mysql汉字按英文字母排序