Mysql误删表中数据与误删表的恢复方法
由于头两天面试时被问了这样一个问题,如果某同事误删了某个表,你该怎么恢复?
当时想了一下,因为博主没有遇到过这个问题,但是也多少了解一些,所以就回答通过mysql的binlog日志进行恢复。
面试官当时问了一下具体的流程。就有些懵逼了。所以就总结了一下,前提一定要做好备份!
数据库误删某表恢复方法,这个前提是针对每天有备份的数据库和开启binlog日志的 ,如果没有备份和binlog日志 恢复起来会非常非常麻烦,所以奉劝大家还是要备份!备份!备份!
/*查看数据库是否开启binlog日志*/
mysql> show variables like '%log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------+
| log_bin | ON |
| log_bin_basename | /home/mysql/mysql/lib/mysql-bin |
| log_bin_index | /home/mysql/mysql/lib/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+---------------------------------------+
rows in set (0.00 sec)
/*首先查看一下数据表中的数据*/ MariaDB [drop_test]> select * from python_test;
+----+-----------+------------+
| id | name | class_time |
+----+-----------+------------+
| 1 | 字典 | 3 |
| 2 | 列表 | 2 |
| 3 | 函数 | 5 |
| 4 | 装饰器 | 2 |
| 5 | 迭代器 | 2 |
+----+-----------+------------+
5 rows in set (0.00 sec)
/*备份*/
mysqldump -uroot -p111111 -B drop_test >drop_test.sql
/*再插入数据后删除数据库*/ MariaDB [drop_test]> INSERT INTO python_test(id,name,class_time) value(6,'生成器',2);
Query OK, 1 row affected (0.01 sec) MariaDB [drop_test]> INSERT INTO python_test(id,name,class_time) value(7,'类的方法',5);
Query OK, 1 row affected (0.00 sec)
删除数据库
MariaDB [drop_test]> drop database drop_test ;
Query OK, 1 row affected (0.01 sec)
切记这个时候不要有任何的操作!!!
查看当前的binlog
1 mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 4666
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
/*这个时候要将当前的binlog日志拷贝到其他目录,以免后续操作对binlog日志产生影响*/ cp /var/lib/mysql/mysql-bin.000001 /home
/*执行命令*/ 转换binlog日志为sql
mysqlbinlog -d drop_test mysql-bin.000001 >001bin.sql
编辑001bin.sql将里面的误操作命令(DROP命令)全部删除
保存后开始进行恢复数据
/*首先恢复备份文件*/
mysql -uroot -p111111 drop_test < drop_test.sql
/*查看数据库备份文件*/ MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| drop_test |
| for_bak |
| lhc |
| mysql |
| performance_schema |
| test |
+--------------------+
7 rows in set (0.00 sec) /*备份的数据已经恢复了*/ MariaDB [drop_test]> show tables;
+---------------------+
| Tables_in_drop_test |
+---------------------+
| python_test |
+---------------------+
1 row in set (0.00 sec) MariaDB [drop_test]> select * from python_test;
+----+-----------+------------+
| id | name | class_time |
+----+-----------+------------+
| 1 | 字典 | 3 |
| 2 | 列表 | 2 |
| 3 | 函数 | 5 |
| 4 | 装饰器 | 2 |
| 5 | 迭代器 | 2 |
+----+-----------+------------+
5 rows in set (0.00 sec)
接下来恢复备份之后被删除的数据
mysql -uroot -p111111 drop_test < 001bin.sql
遇到报错问题
编辑009bin.sql文件,将报错信息中提示的293行一下文件全部删除
然后重新导入
/*恢复后查看数据*/
MariaDB [drop_test]> select * from python_test;
+----+--------------+------------+
| id | name | class_time |
+----+--------------+------------+
| 1 | 字典 | 3 |
| 2 | 列表 | 2 |
| 3 | 函数 | 5 |
| 4 | 装饰器 | 2 |
| 5 | 迭代器 | 2 |
| 6 | 生成器 | 2 |
| 7 | 类的方法 | 5 |
+----+--------------+------------+
7 rows in set (0.00 sec)
以上就是数据库表被误删或数据被误删的恢复方法!
*******************总结************************
此方法只能对启动binlog日志的mysql进行恢复
恢复过程中禁止在对数据库进行任何操作
数据库乃是企业的重中之重,备份一定要做的,也不要觉得有了备份就万无一失了,定期要恢复备份文件查看备份文件与生产库数据是否同步!
Mysql误删表中数据与误删表的恢复方法的更多相关文章
- oracle计算某个表中数据所占表空间的比例
要求计算某个表所占表空间的大小,网上查了些资料用到了oracle的3个视图.具体sql如下 select segment_name as tablename, round(bytes / (selec ...
- pl/sql中误删表中数据并提交恢复办法
最近在操作表中数据时,删除了表中数据,但是又想恢复,后来查到了官方的一篇文档,发现还蛮有用的,如下: 在pl/sql中运行,select * from A as of TIMESTAMP to_tim ...
- MySQL查询数据表中数据记录(包括多表查询)
MySQL查询数据表中数据记录(包括多表查询) 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: sele ...
- Mysql清空表(truncate)与删除表中数据(delete)的区别
来源:http://blog.is36.com/mysql_difference_of_truncate_and_delete/ 为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经 ...
- mysql利用navicat导出表结构和表中数据
LZ在网上搜索了要如何导出mysql的表结构和表中数据,发现有的方法不好用 记录一下好用的方式: 用navicat打开DB链接后,点击数据库,右击选择转储SQL文件,然后选择结构和数据: 之后弹出新的 ...
- 关于mysql中修改某个字段类型,以及备份表中数据到新建的表中,从新建的表中移除数据到修改过的表中
1:修改表中某个字段的类型 alter table usertable MODIFY dddd VARCHAR(50); 其中MODIFY是指修改表中字段的属性 alter表示修改表的意思 2:备份表 ...
- mysql 表中数据不存在则插入,否则更新数据
在很多时候我们会操作数据库表,但是在向表中插入数据时,会遇到表中已经存在该id的数据或者没有该id的数据的情况,没有该id的数据的情况时直接插入就OK,遇到已经存在该id的数据的情况则更新该id的数据 ...
- mysql 之 清空表中数据
清空表的时候注意外键约束 命令版 查询数据库中所有表名select table_name from information_schema.tables where table_schema='DB_n ...
- mysql 和 sqlserver中备份一张表的区别
sqlserver中备份一张表 SELECT * into qa_buglist_bak FROM qa_buglist 不管表的数据有多大,速度很快: mysql中上述语句就无效了,须得新建一张表, ...
随机推荐
- AI mac安装TensorFlow
1.安装pip sudo easy_install pip 2.安装virtualenv sudo pip install --upgrade virtualenv 3.在指定目录创建virtuale ...
- ESP32 TIMER
ESP32有两组硬件计时器组,每组包含两个通用硬件计时器.这些计时器都是64位的可双向计数的计数器: 下面的步骤是典型的配置和操作定时器流程: 第一:初始化: 初始化定时器通过函数:timer_ini ...
- 【Codeforces 332C】Students' Revenge
Codeforces 332 C 我爱对拍,对拍使我快乐... 题意:有\(n\)个议题,学生们会让议会同意\(p\)个,其中主席会执行\(k\)个, 每一个议题执行后主席会掉\(a_i\)的头发,不 ...
- 浅谈Java泛型中的extends和super关键字
泛型是在Java 1.5中被加入了,这里不讨论泛型的细节问题,这个在Thinking in Java第四版中讲的非常清楚,这里要讲的是super和extends关键字,以及在使用这两个关键字的时候为什 ...
- BZOJ3252 攻略 贪心、长链剖分
传送门 给树竟直接给父子关系!!!真良心 首先一个贪心策略:每一次选择的链一定是所有链中权值最大的.这应该比较显然 那么我们接下来考虑如何维护这个贪心.我们可以使用长链剖分进行维护,对权值进行长链剖分 ...
- shell脚本中的数据传递方式
shell中支持的数据传递方式 主要有那么几种: 变量.管道.结果引用.重定向+文件.以及xargs. 变量方式: 1. 定义变量: 变量名=值 2. 使用变量: $变量名 管道方式: 统计当前文件夹 ...
- openhtmltopdf 支持自定义字体、粗体
一.支持自定义字体 private static void renderPDF(String html, OutputStream outputStream) throws Exception { t ...
- 【持续更新中···】Linux下的小技巧
1.Linux回到上级文件的命令: cd ..回到上一级目录(注意:cd 和..中间有空格) cd ~回到home目录 cd -回到某一目录
- .Net Core Cookie-Based认证与授权
.Net Core的其中一种认证与授权模式是基于Cookie的,首先我们先创建一个.Net Core MVC 项目: 然后增加对页面访问的权限控制,对要访问的页面Conytroller增加Author ...
- Scrum与看板区别
看板:在制品(work-in-progress, WIP)必须被限制 WIP上限和拉动式生产 1. Scrum与看板简述 Scrum:组织拆分,工作拆分,开发时间拆分,优化发布计划,过程优化 看板 ...