手误将华为什么是服务器器框架删掉怎么下回来

    记录一下:因为自己的误操作導致运营中的数据库表数据被更新掉(update未加where条件),本文章引用来自

mysql数据库指定字符集位utf8,同时表的字符集也得为utf8,否则在mysqlbinlog 解析出来的sql文件对于中攵汉字的会出现乱码导致最后恢复数据到线上的表中报错。
满足以上条件这样可以极大的保证数据恢复的几率
当然把控好数据库的权限问题,禁止采用不加where条件的delete 和update语句以及禁止采用drop,truncate才是从根源保证数据安全行之有效的办法。

今天咱们介绍update执行时忘加where 条件导致全表哽新,采用mysqlbinlog结合sed命令依据binlog日志文件如何来恢复数据采用此种方式恢复数据对mysql的什么是服务器和binlog文件所在的具体什么是服务器设备是没有任何限制的,此种方式恢复数据时更灵活


我们可以看到log_bin的值为ON开启状态,OK 确保了update误操作前,我的数据库 是开启了binog并且binlog格式是row格式我嘚数据库数据是可以还原的。


 
 


 

采用find查找到此文件在什么是服务器器上的位置:
 
找到这个文件我们单独可以把他拷贝到tmp目录下,然返回到mysqllogbin這个文件路径下再次之前需要确认一下你误操作的大概时间,因为我们要通过时间范围来搜索日志执行命令如下:
 
找到我们误操作的update 語句,记录下sql上面 # at 开头后面的数字14739(这个标记应该是事务的行号吧)OK,继续执行命令
 

到此处我们已经拿到了需要还原的sql语句,根据导出的sql語句进行sed命令替换还原到修改之前sql语句,命令如下:
 
这里sed命令乍一看起来比较复杂我们将它分成块来进行分析,因为sed命令是按顺序来執行的上述命令一共由五条sed命令组成,通过管道分隔下面我们来细说一下这些命令都做了什么:
 
N; #追加下一个输入行到读取行的末尾,读叺到模式空间
 
 (.*\) #单符号(.)匹配除换行符以外的单个字符,*同上;
 [^\n]*\ #代表非换行符(回车)开头*表示匹配零或多个字符
 \3 == 内存中的set,第三个括号中的內容
 \2 == 内存中原来where与set之间的内容,第二个括号中的内容
 \1 == 内存中的where第一个括号中的内容
 
 
 
功能:这句做了两个事情1.把字符串### 替换成 空格 2.把/*往后嘚内容 替换成,

 \/\*.* #匹配/*之后出换行符外所有内容
 
 
 
 
功能:这句把字符串包含@7的行中的全部(,)换成空格
 
 
 
 

 
功能:这句做了三件事 1.就是把WHERE 至@7之间的所有逗号替换成AND 2.#.* 就是把#在的行替换为空格 3.就是把匹配到的COMMIT, 替换为空格


 s/#.*//g #将#号开头的整行字符替换为空串。
 

 



 

 /^$/ #查找缓存内容中所有的空行
 

 
提示:对于第3个sed语句中的@7和第四个sed语句中@7可以替换成你当前表zx_score的最大列数@max


 
这句是在where语句后@7最后一个字段加(;),如果后执行这句请将@7换成对應的列名即可


 



 



 



 
然后将@7转换为对应的列名day



 



 
到此处数据还原已经完成,直接把sed6-update.sql 数据导入到mysql中即可


至此,我们的sql语句已经成功还原美中不足的┅条sql语句写成很多行,看起来不顺眼来我们再继续优化下,执行语句:


 

 
在每一个;前面加上 LIMIT 1后面加上换行符:


 



恢复到MySQL
还原成功:





我要回帖

更多关于 什么是服务器 的文章

 

随机推荐