删库,误清数据怎么办?MySQL数据恢复指南

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 相信很多同学在面对线上数据库时都畏手畏脚,即使这样都难免手滑,一不小心手一抖就将数据或者是表,库删除。当然一些注重规范的公司,不会给开发人员删除表或者是库的权限,但误删数据是常有的事,那么这种情况发生,我们改怎么办呢?跑路?哈哈,当然删库跑路是句玩笑话,本文就为大家介绍一些数据误删除恢复的办法。

1 前言

一般来说,在生产环境DBA都会在定期生成全量数据的备份,然后开启binlog记录增量数据。恢复的时候借助数据备份和binlog日志一般情况下是可以很大程度上复原数据,当然一般情况下开发也不会拥有删库的权限,一般都是有删除数据的权限。所以我们在遇到这种紧急情况不能慌,要赶紧去想办法补救。

2 备份

最简单,也是最实用的方式就是在我们接到,清理数据,或者是修改数据的需求时,先将数据备份,备份是王道。这样会让我们的数据恢复变得更容易。一般在企业中,DBA都会有备份脚本,他们会长期定时对数据进行备份,防止发生悲剧。

3 规范操作

  1. 操作前,先备份,不要怕麻烦,出错后就悔不当初了;
  2. 删除数据库、表时,不要直接用drop命令,而是重命名到一个专用归档库里;
  3. 删除数据时,不要直接用delete或truncate命令,尤其是truncate命令,目前不支持事务,无法回滚;
  4. 使用delete命令删除数据时,应当先开启事务,这样误操作时,还是有机会进行回滚;
  5. 要大批量删除数据时,可以将这些数据插入到一个新表中,确认无误后再删除。或者把要保留的数据写到新表,然后将表重命名对掉,这样需要注意的是增量数据,不要把新插入的数据丢掉;

4 基本的恢复流程

  • 看看是否有办法快速补救(没有可以看下一条)
  • 看看是否有定期备份,和binlog日志(没有就凉凉)
  • 先备份数据恢复
  • 用mysqlbinlog命令将上述的binlog文件导出为sql文件,并剔除其中的drop语句
  • 恢复binlog中增量数据的部分

5 补救措施

  1. 优先考虑是否能只通过binlog恢复,不能的化,再考虑其它
  2. 执行 DROP DATABASE / DROP TABLE 命令误删库表时,如果采用的是共享表空间模式,还有恢复的机会。如果不是,直接从备份文件恢复吧;在共享表空间模式下,误删后立刻杀掉(kill -9)mysql相关进程(mysqld_safe、mysqld),然后尝试从ibdataX文件中恢复数据;
  3. 误删除正在运行中的MySQL表ibd或ibdataX文件。利用linux系统的proc文件特点,把该ibd文件从内存中拷出来,再进行恢复,因为此时mysqld实例在内存中是保持打开该文件的,切记这时不要把mysqld实例关闭了。此模式恢复,需要停止线上业务对该实例的写入操作,不再写入新数据,防止丢失新数据。把复制出来的ibd 或 ibdataX文件拷贝回datadir后,重启mysqld进入recovery模式,innodb_force_recovery 选项从 0 - 6 逐级测试,直至能备份出整个实例或单表的所有数据后,再重建实例或单表,恢复数据。
  4. 未开启事务模式下,执行delete误删数据。发现问题严重性后,立即将mysqld(以及mysqld_safe)进程杀掉(kill -9),然后再用工具将表空间数据读取出来。因为执行delete删除后,实际数据并没有从磁盘清除,只是先打上deleted-mark标签,后续再统一清理,因此快速杀掉进程可以防止数据被物理删除。
  5. 执行truncate误清整张表。如果没使用共享表空间模式的话,直接使用备份恢复和binlog恢复。
  6. 执行不带where条件的update,或者update错数据。数据规模大没法补救的话,也只能通过走备份恢复和binlog恢复。

6 相关操作

  1. 查看是否开启binlog日志

    # log_bin是ON,就说明打开了 OFF就是关闭状态。
    show variables like 'log_bin';
    # log_bin相关的内容都能查到
    show variables like '%log_bin%';
    ​
    # 设置开启log_bin 一般情况下都是通过配置进行设置
    SET SQL_LOG_BIN=1
  2. binlog日志位置

    show variables like '%datadir%';
  3. 根据binlog日志恢复数据

    • cd 到binlog文件目录
    • mysql安装目录/mysql/bin/下找到binlog日志解析工具mysqlbinlog
    • 通过mysqlbinlog工具命令按照对应时间解析binlog日志内容,输出到新的文件中

      该工具也支持过滤指定表的相关操作记录

      mysqlbinlog --no-defaults --database=test --start-datetime="2021-11-10 09:00:00" --stop-datetime="2021-11-10 20:00:00" /data/mysql/mysql-bin.000020    > binlog.txt
    • 利用解析出来的sql进行恢复或者根据需要恢复的位置,使用命令进行恢复

      mysqlbinlog --start-position=8000 --stop-position=8888 mysql-bin.000020 |mysql -uroot -p123456;
  4. 通过配置文件对binlog 日志进行配置

    # 日志格式
    # Statement模式,每一条会修改数据的sql都会记录在binlog中。
    # Row模式,5.1.5版本的MySQL才开始支持row,它不记录sql语句上下文相关信息,仅保存哪条记录被修改。
    # Mixed模式,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。
    # 设置日志格式
    binlog_format = mixed
    ​
    # 设置日志路径,需要注意的是该路经需要mysql用户有写权限
    log-bin = /data/mysql/logs/mysql-bin.log
    ​
    # 设置binlog清理时间
    expire_logs_days = 7
    ​
    # binlog每个日志文件大小
    max_binlog_size = 100m
    ​
    # binlog缓存大小
    binlog_cache_size = 4m
    ​
    # 最大binlog缓存大小
    max_binlog_cache_size = 512m

各位大佬,删库请慎重!!!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
1月前
|
SQL 监控 关系型数据库
MySQL数据恢复:当灾难发生时如何应对
本文全面解析MySQL数据恢复方案,涵盖误操作、硬件故障、崩溃及灾难场景下的恢复技巧,助你构建可靠的数据安全保障体系。
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
9天前
|
关系型数据库 MySQL Linux
MySQL包安装 -- SUSE系列(SUSE资源库安装MySQL)
本文介绍了在openSUSE系统上通过SUSE资源库安装MySQL 8.0和8.4版本的完整步骤,包括配置国内镜像源、安装MySQL服务、启动并验证运行状态,以及修改初始密码等操作,适用于希望在SUSE系列系统中快速部署MySQL的用户。
68 3
MySQL包安装 -- SUSE系列(SUSE资源库安装MySQL)
|
3月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
180 0
|
9天前
|
运维 Ubuntu 关系型数据库
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
本文介绍了在Debian系列系统(如Ubuntu、Debian 11/12)中通过APT仓库安装MySQL 8.0和8.4版本的完整步骤,涵盖添加官方源、配置国内镜像、安装服务及初始化设置,并验证运行状态,适用于各类Linux运维场景。
121 0
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
|
9天前
|
存储 关系型数据库 MySQL
MySQL介绍和MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
MySQL是一款开源关系型数据库,高性能、易用、跨平台,支持多种存储引擎,广泛应用于Web开发、企业级应用等领域。本教程介绍其特点、架构及在主流Linux系统中的安装配置方法。
232 0
MySQL介绍和MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
|
22天前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
2月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
201 10
|
3月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
|
6月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
291 28

推荐镜像

更多