MySQL使用DROP TABLE命令删除表怎么恢复?

Posted 大尾巴狼168

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL使用DROP TABLE命令删除表怎么恢复?相关的知识,希望对你有一定的参考价值。

前言

今天同事勿删除了一个测试环境表,因为刚好在跑重要的数据,重新跑又比较麻烦,所以尝试看能不能通过恢复数据的方式进行数据恢复,如果你也是重要数据一定要切记“不要慌,慌也没用”。
百度过一些例子,哪些例子比较适合表刚刚创建后被删除,就能完全恢复,本篇文章适合那种创建很长时间,表在被删除的。

开始操作

第一步:先连接数据库

mysql -uroot

第二步:在Mysql执行,看有没有开发日志备份

show variables like \'log_bin\'
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

这里返回ON表示开启了,如果是OFF表示关闭,如果是OFF这篇文章可以不用看了,对你没有任何帮助
第三步:继续在MySQL执行,查看日志备份路径

show variables like \'%datadir%\'
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| datadir       | /usr/local/mysql/data/ |
+---------------+------------------------+

第四步:/usr/local/mysql/data/路径查看列表可以使用ll命令

这里可以看到很多,MySQL的日志文件,命名都是由mysql-bin.0000xx,不过这些文件都是二进制的,需要用mysql的工具才能看出来到底是什么。

第五步:查看二进制文件具体SQL

mysqlbinlog -v --base64-output=decode-rows  /usr/local/mysql/data/mysql-bin.0000xx |grep -i -A 50 -B 50  \'误删除的表名\' >> 0xx.sql

上面这个命令的意思是指定SQL日志的二级制文件,将二级制文件解析成SQL语句,输出到0xx目录,多个自行更改
因为作者这里表创建的时间比较长,所以我不知道具体是在那个文件,只能全部查看,如果你知道那个时间可以查看指定的就好了。
这个文件有规律,就写了一个小java实例用来生成

public static void main(String[] args) 
      for (int i = 1; i <= 48; i++) 
          String format = String.format("%02d", i);
          String s = "mysqlbinlog -v --base64-output=decode-rows  /usr/local/mysql/data/mysql-bin.0000"+format+" |grep -i -A 50 -B 50  \'误删除的表名\' >> 0"+format+".sql";
          System.out.println(s);
      
  

给这些命令复制到shell命令执行,就可以在当前目录下生成0x.sql文件。将文件下载到本地

第六步:查看生成的SQL文件

如果是一个文件可以肉眼查看,因为作者生成了48个文件,肉眼看比较麻烦,所有又写了一个java实例,通过io查找命令

public static void main(String[] args) throws Exception 
      //这里输入你自己的表名称
      String tableName = "表名称";

      //这里输入你到处的日志路径
      File file = new File("C:\\\\Users\\\\Lenovo\\\\Desktop\\\\数据恢复");
      File[] files = file.listFiles();
      for (File file1 : files) 
          BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));
          String line = null;
          System.out.println("<<<<<<<<<<<<<<<< 正在读取"+file1.getName()+"文件 >>>>>>>>>>>>>>>>");
          while ((line = br.readLine()) != null) 
              if(line.indexOf(tableName) == -1)
                  continue;
              
              System.out.println(line+";");
          

      
  

这段代码java执行成功后,控制台会有很多SQL语句,数据无价,最好还是肉眼筛选,看是否有需要的SQL语句数据,将数据复制到数据库执行
第七步:执行SQL
这个就不多说了,相信你也会了~!

删除MySQL表的SQL语句-DROP-TABLE-简介

辨析: 在SQL中, DROP 用于删除表结构等信息, 属于数据格式定义 DDL的范畴;
DELETE 用于删除数据,属于数据内容操作 DML 的范畴。

官方给出的 DROP 关键字删除表结构的语法如下:

DROP [TEMPORARY] TABLE [IF EXISTS]
    tbl_name [, tbl_name] ...
    [RESTRICT | CASCADE]

当然, 删除表结构需要你使用的数据库账号具有对应的权限。

从中可以看出, DROP TABLE 可以一次性删除多个表结构, 用逗号分隔即可。

带上 IF EXISTS 条件则可以避免报错,将错误信息转换为警告。

如果不带 if 判断,假如有一个表不存在,则会连带当前这条SQL语句操作失败, 也就不会有Table被删除。

示例:

DROP TABLE IF EXISTS `t_test_user`;
DROP TABLE IF EXISTS `t_test_role`;
DROP TABLE IF EXISTS `t_test_user`, `t_test_role`;

既然表都被删除了,那么里面的数据自然也就没了,所以定时备份,以及操作前的备份都很重要。

  • 如果删除的表是分区表(partition), 则会删除表定义,对应的分区以及所有数据。

  • 如果有触发器和索引,也都会一起删除。

  • 但是对表的授权不会被连带删除。 这也很合理,测试环境中删表之后一般都是为了重建这个表。

  • 默认 DROP 语句会将当前连接中的事务提交。

原则上,在如今的MySQL开发中, 不准使用存储过程/触发器/外键/分区表/大批量数据更新/无主键等等情况。

如果带上 TEMPORARY 关键字,则只会删除临时表,而且不会自动提交事务。 临时表只有当前会话可见,所以也就没必要进行权限检查。

RESTRICTCASCADE 关键字在MySQL中则没什么用,只是为了兼容其他数据库迁移等情况而加上的,有这个也不报错。

官方文档: https://dev.mysql.com/doc/refman/8.0/en/drop-table.html

以上是关于MySQL使用DROP TABLE命令删除表怎么恢复?的主要内容,如果未能解决你的问题,请参考以下文章

linux下mysql的drop table命令不能把表和相关存储信息都删除干净,怎么弄

删除MySQL表的SQL语句-DROP-TABLE-简介

MySQL DROP TABLE操作以及 DROP 大表时的注意事项

mysql drop table 卡住 怎么办

MySQL--DROP TABLE与MySQL版本

mysql5.5基础 drop table... 删除一个表或者多个表