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

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

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

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
关系型数据库 MySQL Java
【MySQL+java+jpa】MySQL数据返回项目的感悟
【MySQL+java+jpa】MySQL数据返回项目的感悟
33 1
|
16天前
|
SQL 监控 关系型数据库
MySQL怎么全局把一张表的数据回滚
MySQL怎么全局把一张表的数据回滚
43 2
|
16天前
|
存储 SQL 关系型数据库
MySQL批量添加数据并取外表的某个字段值
MySQL批量添加数据并取外表的某个字段值
45 1
|
6天前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
17 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
11天前
|
关系型数据库 MySQL 数据库
mysql 里创建表并插入数据
【10月更文挑战第5天】
80 1
|
13天前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
38 3
|
6天前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
13 2
|
14天前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
34 3
|
16天前
|
SQL 关系型数据库 MySQL
MySQL 更新1000万条数据和DDL执行时间分析
MySQL 更新1000万条数据和DDL执行时间分析
35 4
|
16天前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
42 3