mysql误删数据

  • 使用delete语句误删数据行
  • 使用drop table或者truncate table误删数据表
  • 使用drop database语句误删数据库
  • 使用rm误删mysql整个实例

对于误删行

  • 使用flashback工具闪回,把数据恢复回来。原理是修改binlog的内容,拿回原库重放,需要确保binlog_format=row和binlog_row_imsge=Full
  • 具体恢复时
    • 如果是insert,将binlog event类型是write_rows event改为delete_rows event。
    • 如果是delete则相反。
    • 如果是update,binlog里有数据修改前和修改后的值,对调这两行即可。
  • 多个事物也是按照以上原则倒叙执行。
  • 预防:把sql_safe_updates参数设置为on。这样一来,如果我们忘记在delete或者update语句中写where条件,或者where条件里面没有包含索引字段的话,这条语句的执行就会报错。

对于误删库/表

需要使用全量备份,加增量日志的方式。要求线上有定期的全量备份吗,并且实时备份binlog。

假如有人中午12点误删了一个库,恢复数据的流程如下:

取最近一次全量备份,假设这个库是一天一备,上次备份是当天0点;

用备份恢复出一个临时库;

从日志备份里面,取出凌晨0点之后的日志

把这些日志,除了误删除数据的语句外,全部应用到临时库。

注意:

为了加速数据恢复,如果这个临时库上有多个数据库,你可以在使用mysqlbinlog命令时,加上一个–database参数,用来指定误删表所在的库。这样,就避免了在恢复数据时还要应用其他库日志的情况。

在应用日志的时候,需要跳过12点误操作的那个语句的binlog:

加速恢复的方法:备份恢复出临时实例之后,将这个临时实例设置成线上备库的从库,

一个系统不可能备份无限的日志,你还需要根据成本和磁盘空间资源,设定一个日志保留
的天数。如果你的DBA团队告诉你,可以保证把某个实例恢复到半个月内的任意时间点,这就表示备份系统保留的日志时间就至少是半个月。

虽然“发生这种事,大家都不想的”,但是万一出现了误删事件,能够快速恢复数据,将损失
降到最小,也应该不用跑路了。而如果临时再手忙脚乱地手动操作,最后又误操作了,对业务造成了二次伤害,那就说不过去了。

延迟复制备库

  • 如果一个库的备份特别大,或者误操作的时间距离上一个全量备份的时间较长,比如一周一备的实例,在备份之后的第6天发生误操作,那就需要恢复6天的日志,这个恢复时间可能是要按天来计算的。
  • 延迟复制的备库是一种特殊的备库,通过 CHANGE MASTER TO MASTER_DELAY = N命令,可以指定这个备库持续保持跟主库有N秒的延迟。
  • 比如你把N设置为3600,这就代表了如果主库上有数据被误删了,并且在1小时内发现了这个误操作命令,这个命令就还没有在这个延迟复制的备库执行。这时候到这个备库上执行stopslave,再通过之前介绍的方法,跳过误操作命令,就可以恢复出需要的数据。

对于rm删除数据

只要不是恶意地把整个集群删除,而只是删掉了其中某一个节点的数据的话,HA系统就会开始工作,选出一个新的主库,从而保证整个集群的正常工作。这时,你要做的就是在这个节点上把数据恢复回来,再接入整个集群。

当然了,现在不止是DBA有自动化系统,SA(系统管理员)也有自动化系统,所以也许一个批量下线机器的操作,会让你整个MySQL集群的所有节点都全军覆没。应对这种情况,我的建议只能是说尽量把你的备份跨机房,或者最好是跨城市保存。Kill sql语句

session B是直接终止掉线程,什么都不管就直接退出吗?显然,这是不行的。

当对一个表做增删改查操作时,会在表上加MDL读锁。所以,session B虽然处于blocked状态,但还是拿着一个MDL读锁的。如果线程被kill的时候,就直接终止,那之后这个MDL读锁就没机会被释放了。

kill并不是马上停止的意思,而是告诉执行线程说,这条语句已经不需要继续执行了,可以开始“执行停止的逻辑了”。

实际上,当执行kill query thread_id_b,mysql里处理kill命令的线程做了以下事情:

  • 把session B的运行状态改为了THD::KILL_QUERY
  • 给session B的执行线程发了一个信号。

因为像图1的我们例子里面,session B处于锁等待状态,如果只是把session B的线程状态设置
THD::KILL_QUERY,线程B并不知道这个状态变化,还是会继续等待。发一个信号的目的,就
是让session B退出等待,来处理这个THD::KILL_QUERY状态。

更多相关文章

  1. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  2. Android(安卓)-- Android(安卓)JUint 与 Sqlite
  3. android 当系统存在多个Launcher时,如何设置开机自动进入默认的La
  4. Android(安卓)SQLiteDatabase的使用
  5. android 通话记录次数
  6. Android(安卓)SQLiteDatabase的使用
  7. Android布局优化:ViewStub标签实现延迟加载(源码解析原理)
  8. tab上显示数字
  9. android页面管理器。可以实现完整退出android软件

随机推荐

  1. Android新控件MotionLayout介绍(三)
  2. Android Notification 通知
  3. android 开发问题集,android问题总结,and
  4. Activity详解——Activity的xml配置
  5. ImageView的scaletype属性
  6. Android 基础知识 学习总结
  7. Android基本布局-FrameLayout
  8. Android学习之练笔---计算器的实现
  9. Mac下启动AndroidStudio失败
  10. Android 读取元素中的数据