首先看下mysql误删数据排名最前的几种是:mysql
1.误删文件linux
2.误删库、表sql
3.错误全表删除 / 更新数据库
4.升级操做失误后端
都来看看你命中过几个,hoho。工具
简单说下我亲手造的一个大事故吧。测试
那大概是一个春暖花开的季节,个人心里是激动澎湃的,由于已经安排了休假计划。在这前几天,已经把一个新项目的数据库环境都部署好了,包括自动化备份。spa
等我美美的出去玩的时候,悲剧发生了,业务要求进行数据回滚,但发现备份文件不可用,缘由是 备份时指定的字符集和表字符集不一致。我勒个擦,原来该项目采用新的字符集,可是我没有认真检查确认并修改备份脚本,结果致使备份失效。最后,由于这个事,当季度绩效结果被降档,boss也为此背锅~视频
好吧,回到正题, 先说几点我平时预防误操做致使文件/数据丢失不成熟的建议:blog
1.欲删除文件时,将rm命令改为mv,可在系统层面将rm命令作个alias(或参考 Windows / Mac OSX作法,删除文件时先进回收站)。
删除数据库、表时,不要用drop命令,而是rename到一个专用归档库里;
2.删除表中数据时,不要直接用delete或truncate命令,尤为是truncate命令,目前不支持事务,没法回滚。
3.用delete命令删除数据时,应当先显式开启事务,这样误操做时,还有机会进行回滚。
4.要大批量删除数据时,能够将这些数据insert...select到一个新表,确认无误后再删除。或者反其道行之,把要保留的数据写到新表,而后将表重命名对掉。
5.执行重要命令以前,先准备好相关命令,再三确认无误才之行,对于新鸟而言,最好请你的boss坐你旁边镇场几回,不然极有可能会连累你们~
以上几条,也是我本身奉行的原则。总之,要时刻保持对线上生产环境的敬畏之心。虽然说如今大部分操做能够靠平台来完成了,但平台也不是万能的,不也发生过平台自己的缺陷形成数据丢失、代码回滚、部署失误等事故嘛,我就不点名了。加Java后端高级技术群:479499375 免费领取价值1.8w的全套资料及视频。
再牛 x 的梦想也抵不住傻 x 似的坚持!
只要坚持就能成功。
作好备份,无论是物理备份仍是逻辑备份!
作好备份,无论是物理备份仍是逻辑备份!
作好备份,无论是物理备份仍是逻辑备份!
重要的事情说三遍都不嫌多。
说完预防措施,咱们再说万一发生误操做时,怎么以最快速度进行补救。 咱们分别列举几种常见的状况:
1.执行DROP DATABASE / DROP TABLE命令误删库表,若是碰巧采用共享表空间模式的话,还有恢复的机会。若是没有,请直接从备份文件恢复吧。神马,你连备份文件都没有?那麻烦退出DBA届吧,一个连备份都懒得作的人,不配成为DBA的。
2.接上,采用共享表空间模式下,误删后马上杀掉(kill -9)mysql相关进程(mysqld_safe、mysqld),而后尝试从ibdataX文件中恢复数据。
3.误删除正在运行中的MySQL表ibd或ibdataX文件。请当即申请对该实例进行维护,固然,不是指把实例关闭,而是把业务暂停,或者把该实例从线上环境摘除,再也不写入新数据,而后利用linux系统的proc文件特色,把该ibd文件从内存中拷出来,再进行恢复,由于此时mysqld实例在内存中是保持打开该文件的,切记这时不要把mysqld实例关闭了。
4.接上,把复制出来的ibdataX或ibd文件拷贝回datadir后,重启mysqld进入recovery模式,innodb_force_recovery 选项从 0 - 6 逐级测试,直至能备份出(整个实例或单表的)全部数据后,再重建实例(或单表),恢复数据。
5.未开启事务模式下,执行delete误删数据。意识到后当即将mysqld(以及mysqld_safe)进程杀掉(kill -9),不要任何犹豫,而后再用工具将表空间数据读取出来。由于执行delete删除后,实际数据并没被物理清除,只是先打上deleted-mark标签,后续再统一清理,所以还有时间差。
6.执行truncate误清整表。若是没使用共享表空间模式的话,基本别想了,走备份恢复+binlog吧。
7.执行不带where条件的update,或者update错数据。也别费劲了,走备份恢复+binlog吧。