返回顶部
首页 > 资讯 > 数据库 >Mysql误删数据解决方案及kill语句原理
  • 251
分享到

Mysql误删数据解决方案及kill语句原理

Mysql误删数据kill 2022-05-11 19:05:03 251人浏览 八月长安
摘要

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

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状态。

以上包含了三层意思:

  • 一个语句执行过程中有多处埋点,在这些“埋点”的地方判断线程状态,如果发现线程状态
  • 是THD::KILL_QUERY,才开始进入语句终止逻辑;
  • 如果处于等待状态,必须是一个可以被唤醒的等待,否则根本不会执行到“埋点”处;
  • 语句从开始进入终止逻辑,到终止逻辑完全完成,是有一个过程的。

一个kill不掉的例子

执行set global innodb_thread_concurrency=2,将InnoDB的并发线程上限数设置为2;然后,执行下面的序列:

可以看到:

sesssion C执行的时候被堵住了;

但是session D执行的kill query C命令却没什么效果,

直到session E执行了kill connection命令,才断开了session C的连接,提示“Lost connection to MySQL Server during query”,

但是这时候,如果在session E中执行show processlist,你就能看到下面这个图:

id=12这个线程的Commnad列显示的是Killed。也就是说,客户端虽然断开了连接,但实际上服务端上这条语句还在执行过程中。

在这个例子里,12号线程的等待逻辑是这样的:每10毫秒判断一下是否可以进入InnoDB执
行,如果不行,就调用nanosleep函数进入sleep状态。

也就是说,虽然12号线程的状态已经被设置成了KILL_QUERY,但是在这个等待进入InnoDB的循环过程中,并没有去判断线程的状态,因此根本不会进入终止逻辑阶段。

而当session E执行kill connection 命令时,是这么做的,

  • 把12号线程状态设置为KILL_CONNECTION;
  • 关掉12号线程的网络连接。因为有这个操作,所以你会看到,这时候session C收到了断开连接的提示。

那为什么执行show processlist的时候,会看到Command列显示为killed呢?其实,这就是因为在执行show processlist的时候,有一个特别的逻辑:

如果一个线程的状态是KILL_CONNECTION,就把Command列显示成Killed。

所以其实,即使是客户端退出了,这个线程的状态仍然是在等待中。只有等到满足进入InnoDB的条件后,session C的查询语句继续执行,然后才有可能判断到线程状态已经变成了KILL_QUERY或者KILL_CONNECTION,再进入终止逻辑阶段。

kill无效的第一类情况,即:线程没有执行到判断线程状态的逻辑。可能也会由于IO压力过大,读写IO的函数一直无法返回,导致不能及时判断线程的状态。

  • 第二类情况,终止逻辑耗时较长
  • 超大事物执行期间被kill,回滚操作耗时很长。
  • 大会滚操作,比如查询过程中生成了很大的临时文件,删除临时文件需要等待IO资源,导致耗时较长。
  • DDL执行到最后阶段,如果被kill,需要删除中间过程的临时文件,也需要IO资源。

ctrl+C,mysql实际上也是启动了一个连接进程发送了kill query命令。

关于客户端连接慢的误解

如果库里面的表很多,连接就会很慢。比如有一个库有上万个表,使用默认参数连接的时候,mysql会提供一个本地库名和表名补全的功能:

  • 执行show databases
  • 切到db1,执行show tables
  • 把这两个命令的结果用于构建一个本地hash表。

第三步是耗时比较长的操作,也就是我们感知到慢不是连接满,也不是服务端慢,而是客户端慢。如果在这个连接中加上 -A,就可以取消自动补全功能,很快返回。

自动补全的效果就是,在输入库名或者表名的时候,将输入前缀,可以使用tab自动补全或者显示提示。实际如果自动补全用的不多,可以每次使用都加-A。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

您可能感兴趣的文档:

--结束END--

本文标题: Mysql误删数据解决方案及kill语句原理

本文链接: https://lsjlt.com/news/9816.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Mysql误删数据解决方案及kill语句原理
    mysql误删数据 使用delete语句误删数据行 使用drop table或者truncate table误删数据表 使用drop database语句误删数据库 使用rm误删mysql整个实例...
    99+
    2022-05-11
    Mysql 误删数据 kill
  • MySQL 1130错误原因分析以及解决方案
    目录前言错误概述:原因分析解决方法:1:简单法2: 改表法。3:授权法总结 前言 相信大家在使用mysql数据库的过程中肯定都遇到过报错,其中MySQl 1130就是一个我们在远程登陆是经常遇到的错误。 本文树...
    99+
    2023-10-18
    mysql报1130错误 mysql错误代码1130 错误码1130的解决方法
  • 重启阿里云MySQL数据库错误原因、解决方案及预防措施
    在使用阿里云MySQL数据库的过程中,可能会遇到各种问题,其中重启数据库就是一个常见的问题。本文将详细探讨重启阿里云MySQL数据库时可能出现的错误,分析其原因,并提供相应的解决方案。此外,我们还将探讨一些预防此类问题的措施。 在使用阿里云...
    99+
    2023-12-11
    预防措施 阿里 重启
  • 阿里云链接MySQL数据库错误原因、解决方案及预防措施
    阿里云链接MySQL数据库时经常会出现错误,这可能是由于多种原因引起的,如网络问题、数据库服务器故障、数据库权限问题等。本文将对这些问题进行详细的分析,并提供相应的解决方案,希望能帮助用户解决在阿里云链接MySQL数据库时遇到的问题。 一、...
    99+
    2023-12-18
    预防措施 阿里 解决方案
  • 达梦数据库使用常见错误及解决方案(MySQL)
    [-4080]: 不是 group by 表达式 【例子】: select ri.*,count(bd.id) bindDeviceCount from room_ip ri left join bids_devic...
    99+
    2023-09-04
    数据库
  • Gitlab误删数据的原因有哪些及怎么解决
    这篇文章主要介绍“Gitlab误删数据的原因有哪些及怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Gitlab误删数据的原因有哪些及怎么解决”文章能帮助大家解决问题。一、误删数据的原因误触删...
    99+
    2023-07-05
  • MYSQL数据库表记录删除解决方案
    【故障类型】数据库表记录删除 【典型特征】◎ 数据表中无任何数据或只有部分数据;◎ 客户端无法查询到完整的信息。 ◆ 检测流程a. 使用磁盘编辑器对数据文件MYD进行分析;b. 手判断表记录丢失的可能原因。...
    99+
    2024-04-02
  • PHPCMS时间错误的原因及解决方案
    PHPCMS时间错误的原因及解决方案 在使用PHPCMS搭建网站时,可能会遇到时间显示错误的问题,这可能会给用户造成困扰,也会影响网站的正常运行。本文将针对PHPCMS时间错误的原因进...
    99+
    2024-03-14
    解决方案 时间错误 phpcms
  • 探讨Gitlab误删数据的原因和解决方法
    在软件开发中,版本控制是一个非常重要的环节。Gitlab作为一个版本控制系统,为团队协作和代码管理提供了很多便利。但是,当我们在使用Gitlab的时候,误删数据是一个很常见的问题,并且对项目和开发人员都可能造成很大的影响。本文将探讨Gitl...
    99+
    2023-10-22
  • Redis做数据持久化的解决方案及底层原理
    目录数据持久化RDB生成方法savebgsave优点缺点AOFAOF记录过程ServerCron作用server.hz写入策略End之前的文章介绍了Redis的简单数据结构的相关使用...
    99+
    2024-04-02
  • 阿里云连接不了MySQL数据库原因及解决方案
    本文将详细解释阿里云连接不了MySQL数据库的问题,分析其可能的原因,并提供相应的解决方案。希望通过本文的阅读,读者能够有效地解决这个问题。 阿里云连接不了MySQL数据库的原因: 1. MySQL服务器未开启:阿里云的MySQL服务可能未...
    99+
    2023-11-01
    阿里 解决方案 原因
  • Go语言大数据框架缺失原因及解决方案探讨
    在当今大数据时代,数据处理和分析已经成为各行业发展的重要支撑。而Go语言作为一种开发效率高、性能优越的编程语言,也逐渐被大数据领域所关注。然而,相比于其他语言如Java、Python等...
    99+
    2024-04-02
  • MySQL数据库误删回滚的解决
    某次一不小心,用了delete from xxx 删除了几条重要数据,在网上找了很多方法,但都比较零散,打算记录本次数据找回的过程。大致分为以下几步 1、查看binlog是否开启 # log_bin是ON,就说...
    99+
    2022-06-30
    MySQL数据库误删回滚 MySQL 误删回滚
  • 怎么解决MySQL误删数据问题
    本篇内容主要讲解“怎么解决MySQL误删数据问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决MySQL误删数据问题”吧!第一步:保证mysql已经开启...
    99+
    2024-04-02
  • MySQL数据库:基本操作及增删改查语句
    基本语法&&操作语句 create(创建) alter(更新) drop(删除) 一次性删除一个表中所有的数据 包括日志 truncate table 表名; 选中或者使用该数据库 说明接下来的操作都是针对该数据库进行 use 数...
    99+
    2022-01-24
    MySQL数据库:基本操作及增删改查语句
  • 阿里云数据库备案错误原因、解决方法及预防措施
    阿里云数据库作为阿里云旗下的一款云计算产品,受到了广大用户的欢迎。然而,在使用过程中,有些用户可能会遇到本地连接阿里云数据库备案错误的问题。本文将详细解析该问题的原因,并提供相应的解决方法,同时也会提出一些预防措施,以确保用户能够正常使用阿...
    99+
    2023-12-10
    预防措施 阿里 解决方法
  • JavaScript throw 语句的陷阱:常见错误和解决方案
    1. 缺少错误消息 错误: function divide(a, b) { if (b === 0) throw; // 缺少错误消息 } 解决方案:始终提供一个描述性错误消息,说明错误的性质。 function divide(a,...
    99+
    2024-03-01
    JavaScript, throw, 错误处理, 异常处理, 调试
  • MySQL数据库误删回滚怎么解决
    这篇文章主要讲解了“MySQL数据库误删回滚怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库误删回滚怎么解决”吧!某次一不小心,用了delete from x...
    99+
    2023-07-02
  • 阿里云服务器连接MySQL数据库错误原因与解决方案
    在使用阿里云服务器连接MySQL数据库时,可能会遇到各种错误。本文将详细介绍一些常见的错误原因,并提供相应的解决方案。 阿里云服务器连接MySQL数据库时,可能会遇到各种错误。以下是一些常见的错误原因:MySQL服务器未启动阿里云服务器连接...
    99+
    2023-11-16
    阿里 解决方案 错误
  • HTTP 500错误:服务器内部错误,原因及解决方案
    大家好,今天我们来聊聊一个常见的问题——HTTP 500错误,也就是服务器内部错误。这个错误就像是一个神秘的魔法,时不时地出现在你的网页上,让你的用户和你在一片懵逼中互相猜疑。 首先,我们来了解一下这个错误。HTTP 500错误是服务器在...
    99+
    2024-01-21
    服务器 php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作