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条件的恢复相关推荐

  1. mysql 恢复delete操作_MySQL 误操作后数据恢复(update,delete忘加where条件)

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...

  2. mysql 修改数据 where_MySQL 误删数据、误更新数据(update,delete忘加where条件)

    MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写 ...

  3. mysql 清除分区数据恢复_MySQL 误操作后数据恢复(update,delete忘加where条件)【转】...

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...

  4. update和delete操作忘加where条件导致全表更新的处理方法

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...

  5. SQL SERVER 数据库delete 未加where 条件数据误删恢复办法

    步骤: 1.下载ApexSQLLog.链接: https://pan.baidu.com/s/1lXW7TILAc7MHcCskhXvgeg 提取码: 7tix 复制这段内容后打开百度网盘手机App, ...

  6. 比CRUD多一点儿(三):UPDATE、DELETE语句

    这是MySQL系列笔记的第一部分,本系列笔记希望能按照笔者自己学习MySQL技术的经历来记录,避免纯粹按照内容一块一块总结,也就是不同于一般按内容分配章节的书籍的结构,会有一个平滑的阅读曲线.内容比较 ...

  7. mysql update delete_MySQL中UPDATE与DELETE语句的使用教程

    UPDATE 更新UPDATE SET 语法用于修改更新数据表中的数据. 语法: UPDATE tb_name SET column1 = new_value1,column2 = new_value ...

  8. 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解

    转自:http://www.jb51.net/article/39199.htm 本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍, ...

  9. INSERT、UPDATE、DELETE、TRUNCATE指令详解

    DML语言: DML(Data Manipulation Language),数据操纵语言,在SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT.UPDATE.DELETE三种指令 ...

最新文章

  1. 反射拷贝对象的思路:
  2. 服务器系统需要定期清理吗,windows 2008服务器系统清理
  3. golang查找重复行
  4. 【极值问题】【CF1063B】 Labyrinth
  5. 手把手系列:(一)用Benchmarksql测试Oracle数据库性能
  6. QImage、 QPixmap、 QBitmap、 QPicture区别
  7. 陌屿授权系统v2.0源码
  8. .NET Core 3.0中的新功能和增强功能
  9. 数据结构排序系列详解之六 树形选择排序
  10. 【服务器】宝塔LNMP安装Discuz!
  11. 如何高效的使用Google
  12. BNU 鸣人的查克拉
  13. The eighth day
  14. 17-面向对象之语法(2)
  15. Hbase和Hive安装
  16. win7开机启动项设置_Win7系统电脑使用注册表查看开机启动项操作方法
  17. linux操作系统 第02章 linux操作做基础
  18. Linux服务器-Linux服务器的类型
  19. Java 程序获取本机 ip 地址
  20. php serv u提权脚本,.NET/Perl/PHP 三个版本的 ServU提权程序 -电脑资料

热门文章

  1. Hololens开发笔记
  2. 做视频类网站如何选择云服务器?
  3. Cannot set priority of timelineserver process 23314以及leveldb-timeline-store.ldb does not exist解决
  4. 完美解决安装Eclipse2020-3报错问题及正确安装,冲冲冲!!!
  5. php上传文件并存储到mysql数据库的方法
  6. 黑鲨Android系统耗电高,已达安卓顶配,黑鲨2pro作为主力机,聊聊使用感受
  7. 学习笔记 time模块练习 纪念日计算
  8. 《通关!游戏设计之道(continue...)》
  9. springcloud bootstrap context加载过程解析以及怎么成为main context的parent
  10. mysql汉字按英文字母排序